diff --git a/DEPS b/DEPS
index 69a8418..1749591 100644
--- a/DEPS
+++ b/DEPS
@@ -310,15 +310,15 @@
   # 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': 'a1f186aca73a58ad2c3b79975df7480e13d37c24',
+  'skia_revision': '1923ef9d62d4cfdf64806784e324c88c91634fea',
   # 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': 'eaac2ba00bb34f4f60601bf9937c02ebfddbf78c',
+  'v8_revision': '48d1838e9a69acd2a160e100abf7fb1337410e34',
   # 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': 'dbb9f38df980556dcffecb11495941172c18bc69',
+  'angle_revision': '44adf8c68342a12175553c7164952c8b05988e19',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -333,7 +333,7 @@
   #
   # Note this revision should be updated with
   # third_party/boringssl/roll_boringssl.py, not roll-dep.
-  'boringssl_revision': '19009c51bff0706362e824f66a0b189326a1c27d',
+  'boringssl_revision': '04989786e9ab16cef5261bbd05a2b1a8cb312dbf',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
@@ -389,7 +389,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': '9938fb190a15e0bd7c7d516876ad3a92051070ad',
+  'devtools_frontend_revision': 'b520cf621422630fd8a697b5c790247a2554f0ee',
   # 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.
@@ -425,7 +425,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': 'a20b970cfb453674412366bbb885595b783dc536',
+  'dawn_revision': 'f2c1d0aa5bd8d91d49ee7e2726186a66500f2a39',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -493,7 +493,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       'cec1dd0bf658dd8ddae22213787da36cedd1e8fb',
+  'libcxx_revision':       'a4dc7f17ca393e764685d475bbf65ff8f71a0800',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:cc28efe62ef0c2fb32455f414a29c4a55bb7fbc4',
@@ -807,7 +807,7 @@
     Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248',
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '27733dbd192542ac45ba7654206d73ddd7c263ff',
+    'url': Var('chromium_git') + '/website.git' + '@' + '89cfcc7f0ae00163a3a935e420cb7146c0764a35',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -896,7 +896,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'BUJrez3Wb2a1Mo7M9QChlOK73NexuQWKIumNPuNAAQcC',
+          'version': 'y90cpk2TQG2Pnj7UzEhBBj6yH59Nm2MluxpB4Yn1U7sC',
         },
       ],
       'dep_type': 'cipd',
@@ -907,7 +907,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'G5AUfDy_uRpdCAqB3iIlTUnBSr-L_FW-SChJxqb_YUsC',
+          'version': 'rXHSeD7EPiO0MSVsLH5B2U7dSWcVpuraubXIVxxphw4C',
         },
       ],
       'dep_type': 'cipd',
@@ -918,7 +918,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'q2Iccp5n_iLyT3nY37oIeYh0y9dQuPLAbaQrrzufyKAC',
+          'version': 'spHyhhjw-Ekd24M6Jx_LaXKIO4saxlpTEYsmG6iZu1MC',
         },
       ],
       'dep_type': 'cipd',
@@ -1229,13 +1229,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '0d126c974c11b09f41ec3dc4653a583c8929fa8a',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '08bb5c487f80147a236360ea50f4544890530779',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '2fc46e3aca65b72b43075a8a7a057f3cc2fb4f5a',
+      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + 'b32f181e3feb884ca17257bbd47703a94887a161',
     'condition': 'checkout_src_internal',
   },
 
@@ -1623,7 +1623,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '3a9f96aecc5ffe0b5a9d6d540653468f0b215842',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '40b17af5c58d2777097eef8fb8a7d61c8419af7b',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1768,7 +1768,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@3811e73c4b6fff9ffc641719727171079c43972b',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@d9371f187fccddc221a56ab94eaf1af17afd4309',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1808,7 +1808,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '0860ad6114aa63cbfdd2a1f79c91cc1e96091621',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '8da280282b69f6c73d16176a4aeed198625f0bc9',
+    Var('webrtc_git') + '/src.git' + '@' + '3680605caadfda1aaedd5bfa6947ec635b03e6e9',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1838,7 +1838,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/linux-amd64',
-          'version': 'C6ORhWPGTAD-OiqYaLuZ-zJBwdBndRNTjCdUCVDJ5qkC',
+          'version': 'WBDrUDeM_a9K-F0R-4P29K3JwXJUEWawXi_gTzC_kFgC',
         },
       ],
       'dep_type': 'cipd',
@@ -1848,7 +1848,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/windows-amd64',
-          'version': 'JC-5wBqTAlkmWfg6n74WF5jgf2HxvHT7fx-wTfz0OqYC',
+          'version': 'GFphHdC69wbrz1vjJDhfiJCezaivApJ54F036JCnBdsC',
         },
       ],
       'dep_type': 'cipd',
@@ -1859,7 +1859,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-amd64',
-          'version': 'BPDLaVlOGtQ_hg6yiAr4PXk0x_7MHKrF6eCMos2EsGUC',
+          'version': 'MQ13YYzbw_7X4YyfuuDuR8BSjHqdE2fc6Rrv6-SjmRMC',
         },
       ],
       'dep_type': 'cipd',
@@ -1881,7 +1881,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@001982b54f1c95370c2b75c3466f88a0db969342',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@bbe17dcabb966a6eb7e276b534611f728b8e3bc5',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/ui/grit_resources_allowlist.txt b/android_webview/ui/grit_resources_allowlist.txt
index 6f21131a..f82a290 100644
--- a/android_webview/ui/grit_resources_allowlist.txt
+++ b/android_webview/ui/grit_resources_allowlist.txt
@@ -11,5 +11,5 @@
 IDR_WEBUI_JS_CR_M_JS
 IDR_WEBUI_JS_ASSERT_M_JS
 IDR_WEBUI_JS_UTIL_M_JS
-IDR_WEBUI_JS_PROMISE_RESOLVER_M_JS
+IDR_WEBUI_JS_PROMISE_RESOLVER_JS
 IDR_MOJO_BINDINGS_JS
diff --git a/ash/app_list/app_list_presenter_unittest.cc b/ash/app_list/app_list_presenter_unittest.cc
index 315f18a..1abe4be4 100644
--- a/ash/app_list/app_list_presenter_unittest.cc
+++ b/ash/app_list/app_list_presenter_unittest.cc
@@ -769,13 +769,6 @@
                          PopulatedAppListTest,
                          testing::Bool());
 
-class LegacyPopulatedAppListTest : public PopulatedAppListTestBase {
- public:
-  LegacyPopulatedAppListTest()
-      : PopulatedAppListTestBase(/*productivity_launcher_enabled=*/false) {}
-  ~LegacyPopulatedAppListTest() override = default;
-};
-
 // Subclass of PopulatedAppListTest which enables the virtual keyboard.
 class PopulatedAppListWithVKEnabledTest : public PopulatedAppListTestBase {
  public:
@@ -2272,63 +2265,6 @@
   widget_close_waiter.Wait();
 }
 
-// Verifies that the downward mouse drag on AppsGridView's first page should
-// be handled by AppList.
-TEST_F(LegacyPopulatedAppListTest, MouseDragAppsGridViewHandledByAppList) {
-  InitializeAppsGrid();
-  PopulateApps(2);
-
-  // Calculate the drag start/end points.
-  gfx::Point drag_start_point = apps_grid_view_->GetBoundsInScreen().origin();
-  gfx::Point target_point = GetPrimaryDisplay().bounds().bottom_left();
-  target_point.set_x(drag_start_point.x());
-
-  // Drag AppsGridView downward by mouse. Check the following things:
-  // (1) Mouse events are processed by AppsGridView, including mouse press,
-  // mouse drag and mouse release.
-  // (2) AppList is closed after mouse drag.
-  ui::test::EventGenerator* event_generator = GetEventGenerator();
-  event_generator->MoveMouseTo(drag_start_point);
-  event_generator->DragMouseTo(target_point);
-  event_generator->ReleaseLeftButton();
-
-  base::RunLoop().RunUntilIdle();
-  GetAppListTestHelper()->CheckState(AppListViewState::kClosed);
-}
-
-// Verifies that the upward mouse drag on AppsGridView's first page should
-// be handled by PaginationController.
-TEST_F(LegacyPopulatedAppListTest,
-       MouseDragAppsGridViewHandledByPaginationController) {
-  InitializeAppsGrid();
-  PopulateApps(apps_grid_test_api_->TilesPerPage(0) + 1);
-  EXPECT_EQ(2, apps_grid_view_->pagination_model()->total_pages());
-
-  // Calculate the drag start/end points. |drag_start_point| is between the
-  // first and the second AppListItem. Because in this test case, we want
-  // AppsGridView to receive mouse events instead of AppListItemView.
-  gfx::Point right_side =
-      apps_grid_view_->GetItemViewAt(0)->GetBoundsInScreen().right_center();
-  gfx::Point left_side =
-      apps_grid_view_->GetItemViewAt(1)->GetBoundsInScreen().left_center();
-  ASSERT_EQ(left_side.y(), right_side.y());
-  gfx::Point drag_start_point((right_side.x() + left_side.x()) / 2,
-                              right_side.y());
-  gfx::Point target_point = GetPrimaryDisplay().bounds().top_right();
-  target_point.set_x(drag_start_point.x());
-
-  // Drag AppsGridView downward by mouse. Checks that PaginationController
-  // records the mouse drag.
-  base::HistogramTester histogram_tester;
-  ui::test::EventGenerator* event_generator = GetEventGenerator();
-  event_generator->MoveMouseTo(drag_start_point);
-  event_generator->DragMouseTo(target_point);
-  event_generator->ReleaseLeftButton();
-  histogram_tester.ExpectUniqueSample(
-      "Apps.AppListPageSwitcherSource.ClamshellMode",
-      AppListPageSwitcherSource::kMouseDrag, 1);
-}
-
 // Tests that mouse app list item drag is cancelled when mouse capture is lost
 // (e.g. on screen rotation).
 TEST_P(PopulatedAppListTest, CancelItemDragOnMouseCaptureLoss) {
@@ -3068,58 +3004,6 @@
   EXPECT_FALSE(keyboard_controller->IsKeyboardVisible());
 }
 
-// Tests that a folder item that is dragged to the page flip area and released
-// will discard empty pages in the apps grid. If an empty page is not discarded,
-// the apps grid crashes (See http://crbug.com/1100011).
-// NOTE: Productivity launcher does not create empty pages during drag, so this
-// test is not relevant.
-TEST_F(LegacyPopulatedAppListTest, FolderItemDroppedRemovesBlankPage) {
-  InitializeAppsGrid();
-  AppListFolderItem* folder_item = CreateAndPopulateFolderWithApps(3);
-  PopulateApps(2);
-  ASSERT_EQ(1, apps_grid_view_->pagination_model()->total_pages());
-
-  // Tap the folder item to show its contents.
-  GestureTapOn(apps_grid_view_->GetItemViewAt(0));
-  ASSERT_TRUE(AppListIsInFolderView());
-
-  // Start dragging the first item in the active folder.
-  AppListItemView* dragged_view =
-      folder_view()->items_grid_view()->GetItemViewAt(0);
-  AppListItem* dragged_item = dragged_view->item();
-  ui::test::EventGenerator* event_generator = GetEventGenerator();
-  event_generator->MoveTouch(dragged_view->GetBoundsInScreen().CenterPoint());
-  event_generator->PressTouch();
-  ASSERT_TRUE(dragged_view->FireTouchDragTimerForTest());
-
-  // Move the pointer over the page flip area in the apps grid. We first fire
-  // the folder item reparent timer. The folder view should be hidden.
-  const gfx::Rect apps_grid_bounds = apps_grid_view_->GetBoundsInScreen();
-  const gfx::Point page_flip_bottom_center =
-      gfx::Point(apps_grid_bounds.width() / 2, apps_grid_bounds.bottom() + 1);
-  event_generator->MoveTouch(page_flip_bottom_center);
-  event_generator->MoveTouchBy(0, 5);
-  EXPECT_TRUE(
-      folder_view()->items_grid_view()->FireFolderItemReparentTimerForTest());
-  EXPECT_FALSE(AppListIsInFolderView());
-
-  // Move again to trigger the page flip timer, fire it and finish the page flip
-  // animation. There should be 2 pages.
-  event_generator->MoveTouchBy(0, -10);
-  EXPECT_TRUE(apps_grid_view_->FirePageFlipTimerForTest());
-  apps_grid_view_->pagination_model()->FinishAnimation();
-  EXPECT_EQ(2, apps_grid_view_->pagination_model()->total_pages());
-
-  // Drop the item outside of the drag buffer, which should cancel the drag. The
-  // dragged app should be still in the folder, and the  newly blank page should
-  // be discarded without crashing.
-  event_generator->MoveTouch(apps_grid_bounds.bottom_left() +
-                             gfx::Vector2d(-100, 0));
-  event_generator->ReleaseTouch();
-  EXPECT_EQ(1, apps_grid_view_->pagination_model()->total_pages());
-  EXPECT_EQ(folder_item->id(), dragged_item->folder_id());
-}
-
 // Tests that app list hides when focus moves to a normal window.
 TEST_P(AppListPresenterTest, HideOnFocusOut) {
   GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId());
diff --git a/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc b/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc
index 89f9736..13621f8 100644
--- a/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc
+++ b/ash/frame/caption_buttons/frame_caption_button_container_view_unittest.cc
@@ -213,7 +213,8 @@
   ASSERT_EQ(initial_close_button_bounds.x(),
             initial_size_button_bounds.right());
 
-  // Button positions should be the same when entering tablet mode.
+  // Maximize/restore button is hidden in tablet mode and the other buttons
+  // should shift accordingly.
   Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true);
   container.UpdateCaptionButtonState(false /*=animate*/);
   test.EndAnimations();
@@ -221,19 +222,17 @@
   views::test::RunScheduledLayout(&container);
 
   EXPECT_TRUE(test.minimize_button()->GetVisible());
-  EXPECT_TRUE(test.size_button()->GetVisible());
+  EXPECT_FALSE(test.size_button()->GetVisible());
   EXPECT_TRUE(test.close_button()->GetVisible());
   gfx::Rect extra_button_bounds = extra_button->bounds();
   gfx::Rect minimize_button_bounds = test.minimize_button()->bounds();
-  gfx::Rect size_button_bounds = test.size_button()->bounds();
   gfx::Rect close_button_bounds = test.close_button()->bounds();
   EXPECT_EQ(minimize_button_bounds.x(), extra_button_bounds.right());
-  EXPECT_EQ(size_button_bounds.x(), minimize_button_bounds.right());
-  EXPECT_EQ(close_button_bounds.x(), size_button_bounds.right());
-  EXPECT_EQ(initial_size_button_bounds, test.size_button()->bounds());
+  EXPECT_EQ(close_button_bounds.x(), minimize_button_bounds.right());
   EXPECT_EQ(initial_close_button_bounds.size(), close_button_bounds.size());
-  EXPECT_EQ(container.GetPreferredSize().width(),
-            initial_container_bounds.width());
+  EXPECT_EQ(
+      initial_container_bounds.width() - initial_size_button_bounds.width(),
+      container.GetPreferredSize().width());
 
   // Button positions should be the same when leaving tablet mode.
   Shell::Get()->tablet_mode_controller()->SetEnabledForTest(false);
diff --git a/ash/public/cpp/style/color_provider.h b/ash/public/cpp/style/color_provider.h
index c22310d9..97f7b31 100644
--- a/ash/public/cpp/style/color_provider.h
+++ b/ash/public/cpp/style/color_provider.h
@@ -155,7 +155,6 @@
 
   // Gets the color of |type| of the corresponding layer based on the current
   // color mode.
-  virtual SkColor GetShieldLayerColor(ShieldLayerType type) const = 0;
   virtual SkColor GetBaseLayerColor(BaseLayerType type) const = 0;
   virtual SkColor GetControlsLayerColor(ControlsLayerType type) const = 0;
   virtual SkColor GetContentLayerColor(ContentLayerType type) const = 0;
diff --git a/ash/style/ash_color_provider.cc b/ash/style/ash_color_provider.cc
index 6951d59e..3a10da5d 100644
--- a/ash/style/ash_color_provider.cc
+++ b/ash/style/ash_color_provider.cc
@@ -52,27 +52,6 @@
   return g_instance;
 }
 
-SkColor AshColorProvider::GetShieldLayerColor(ShieldLayerType type) const {
-  // TODO(crbug.com/1348365): Delete this function after all clients migrate.
-  auto* color_provider = GetColorProvider();
-  DCHECK(color_provider);
-
-  switch (type) {
-    case ShieldLayerType::kShield20:
-      return color_provider->GetColor(kColorAshShieldAndBase20);
-    case ShieldLayerType::kShield40:
-      return color_provider->GetColor(kColorAshShieldAndBase40);
-    case ShieldLayerType::kShield60:
-      return color_provider->GetColor(kColorAshShieldAndBase60);
-    case ShieldLayerType::kShield80:
-      return color_provider->GetColor(kColorAshShieldAndBase80);
-    case ShieldLayerType::kShield90:
-      return color_provider->GetColor(kColorAshShieldAndBase90);
-    case ShieldLayerType::kShield95:
-      return color_provider->GetColor(kColorAshShieldAndBase95);
-  }
-}
-
 SkColor AshColorProvider::GetBaseLayerColor(BaseLayerType type) const {
   // TODO(crbug.com/1350510): Delete this function after all clients migrate.
   auto* color_provider = GetColorProvider();
diff --git a/ash/style/ash_color_provider.h b/ash/style/ash_color_provider.h
index db15666..9d184401 100644
--- a/ash/style/ash_color_provider.h
+++ b/ash/style/ash_color_provider.h
@@ -38,7 +38,6 @@
   static AshColorProvider* Get();
 
   // ColorProvider:
-  SkColor GetShieldLayerColor(ShieldLayerType type) const override;
   SkColor GetBaseLayerColor(BaseLayerType type) const override;
   SkColor GetControlsLayerColor(ControlsLayerType type) const override;
   SkColor GetContentLayerColor(ContentLayerType type) const override;
diff --git a/ash/system/media/unified_media_controls_view.cc b/ash/system/media/unified_media_controls_view.cc
index 6764870..71af3f9b 100644
--- a/ash/system/media/unified_media_controls_view.cc
+++ b/ash/system/media/unified_media_controls_view.cc
@@ -132,7 +132,7 @@
   action_ = action;
   set_tag(static_cast<int>(action));
   SetTooltipText(accessible_name);
-  UpdateVectorIcon();
+  SetVectorIcon(GetVectorIconForMediaAction(action));
 }
 
 UnifiedMediaControlsView::UnifiedMediaControlsView(
diff --git a/ash/system/privacy/privacy_indicators_tray_item_view.cc b/ash/system/privacy/privacy_indicators_tray_item_view.cc
index 385ee11..ad742cdb 100644
--- a/ash/system/privacy/privacy_indicators_tray_item_view.cc
+++ b/ash/system/privacy/privacy_indicators_tray_item_view.cc
@@ -1,4 +1,4 @@
-// Copyright 2022 The Chromium Authors
+// Copyright 2022 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -8,14 +8,23 @@
 #include <string>
 
 #include "ash/resources/vector_icons/vector_icons.h"
+#include "ash/root_window_controller.h"
 #include "ash/shelf/shelf.h"
+#include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_provider.h"
+#include "ash/system/tray/tray_item_view.h"
+#include "base/bind.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/time/time.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/color/color_id.h"
 #include "ui/color/color_provider.h"
+#include "ui/compositor/compositor.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_type.h"
+#include "ui/gfx/animation/linear_animation.h"
+#include "ui/gfx/animation/tween.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/paint_vector_icon.h"
@@ -30,13 +39,57 @@
 constexpr auto kPrivacyIndicatorsViewPadding = gfx::Insets::VH(4, 8);
 const int kPrivacyIndicatorsViewSpacing = 2;
 const int kPrivacyIndicatorsIconSize = 16;
-const int kPrivacyIndicatorsViewHeight = 24;
-const int kPrivacyIndicatorsViewWidth = 50;
+const int kPrivacyIndicatorsViewExpandedShorterSideSize = 24;
+const int kPrivacyIndicatorsViewExpandedLongerSideSize = 50;
+const int kPrivacyIndicatorsViewSize = 8;
+
+constexpr auto kDwellInExpandDuration = base::Milliseconds(1000);
+constexpr auto kShorterSizeShrinkAnimationDelay =
+    kDwellInExpandDuration + base::Milliseconds(133);
+constexpr auto kSizeChangeAnimationDuration = base::Milliseconds(333);
+constexpr auto kExpandAnimationDuration = base::Milliseconds(400);
+
+void StartAnimation(gfx::LinearAnimation* animation) {
+  if (!animation)
+    return;
+
+  // Stop any ongoing animation.
+  animation->End();
+
+  animation->Start();
+}
+
+void StartRecordAnimationSmoothness(
+    views::Widget* widget,
+    absl::optional<ui::ThroughputTracker>& tracker) {
+  // `widget` may not exist in tests.
+  if (!widget)
+    return;
+
+  tracker.emplace(widget->GetCompositor()->RequestNewThroughputTracker());
+  tracker->Start(
+      ash::metrics_util::ForSmoothness(base::BindRepeating([](int smoothness) {
+        base::UmaHistogramPercentage(
+            "Ash.PrivacyIndicators.AnimationSmoothness", smoothness);
+      })));
+}
 
 }  // namespace
 
 PrivacyIndicatorsTrayItemView::PrivacyIndicatorsTrayItemView(Shelf* shelf)
-    : TrayItemView(shelf) {
+    : TrayItemView(shelf),
+      expand_animation_(std::make_unique<gfx::LinearAnimation>(
+          kExpandAnimationDuration,
+          gfx::LinearAnimation::kDefaultFrameRate,
+          this)),
+      longer_side_shrink_animation_(std::make_unique<gfx::LinearAnimation>(
+          kSizeChangeAnimationDuration,
+          gfx::LinearAnimation::kDefaultFrameRate,
+          this)),
+      shorter_side_shrink_animation_(std::make_unique<gfx::LinearAnimation>(
+          kSizeChangeAnimationDuration,
+          gfx::LinearAnimation::kDefaultFrameRate,
+          this)) {
   SetVisible(false);
 
   auto container_view = std::make_unique<views::View>();
@@ -53,7 +106,7 @@
   SetPaintToLayer(ui::LAYER_SOLID_COLOR);
   layer()->SetFillsBoundsOpaquely(false);
   layer()->SetRoundedCornerRadius(
-      gfx::RoundedCornersF{kPrivacyIndicatorsViewHeight / 2});
+      gfx::RoundedCornersF{kPrivacyIndicatorsViewExpandedShorterSideSize / 2});
 
   auto camera_icon = std::make_unique<views::ImageView>();
   camera_icon->SetPaintToLayer();
@@ -98,18 +151,62 @@
   UpdateBoundsInset();
 }
 
+void PrivacyIndicatorsTrayItemView::PerformVisibilityAnimation(bool visible) {
+  EndAllAnimations();
+
+  if (!visible)
+    return;
+
+  // Start a multi-part animation:
+  // 1. kExpand: Expands to the fully expanded state, showing all icons.
+  // 2. kDwellInExpand: Then dwells at this size for `kDwellInExpandDuration`.
+  // 3. kOnlyLongerSideShrink: After that, collapses the long side first.
+  // 4. kBothSideShrink: Before the long side shrinks completely, collapses the
+  // short side to the final size (a green dot).
+  expand_animation_->Start();
+  StartRecordAnimationSmoothness(GetWidget(), throughput_tracker_);
+}
+
 void PrivacyIndicatorsTrayItemView::HandleLocaleChange() {
   TooltipTextChanged();
 }
 
 gfx::Size PrivacyIndicatorsTrayItemView::CalculatePreferredSize() const {
-  // If the view is laid out vertically in vertical shelf, the view is rotated
-  // 90 degree.
-  if (layout_manager_->GetOrientation() ==
-      views::BoxLayout::Orientation::kVertical) {
-    return gfx::Size(kPrivacyIndicatorsViewHeight, kPrivacyIndicatorsViewWidth);
+  int shorter_side;
+  int longer_side;
+
+  switch (animation_state_) {
+    case AnimationState::kIdle:
+      return gfx::Size(kPrivacyIndicatorsViewSize, kPrivacyIndicatorsViewSize);
+    case AnimationState::kExpand:
+      shorter_side = kPrivacyIndicatorsViewExpandedShorterSideSize;
+      longer_side =
+          kPrivacyIndicatorsViewExpandedLongerSideSize *
+          gfx::Tween::CalculateValue(gfx::Tween::ACCEL_20_DECEL_100,
+                                     expand_animation_->GetCurrentValue());
+      break;
+    case AnimationState::kDwellInExpand:
+      shorter_side = kPrivacyIndicatorsViewExpandedShorterSideSize;
+      longer_side = kPrivacyIndicatorsViewExpandedLongerSideSize;
+      break;
+    case AnimationState::kOnlyLongerSideShrink:
+      shorter_side = kPrivacyIndicatorsViewExpandedShorterSideSize;
+      longer_side =
+          CalculateSizeDuringShrinkAnimation(/*for_longer_side=*/true);
+      break;
+    case AnimationState::kBothSideShrink:
+      shorter_side =
+          CalculateSizeDuringShrinkAnimation(/*for_longer_side=*/false);
+      longer_side =
+          CalculateSizeDuringShrinkAnimation(/*for_longer_side=*/true);
+      break;
   }
-  return gfx::Size(kPrivacyIndicatorsViewWidth, kPrivacyIndicatorsViewHeight);
+  // `GetWidget()` might be null in unit tests.
+  auto* shelf = GetWidget() ? Shelf::ForWindow(GetWidget()->GetNativeWindow())
+                            : Shell::GetPrimaryRootWindowController()->shelf();
+  // The view is rotated 90 degree in side shelf.
+  return shelf->PrimaryAxisValue(gfx::Size(longer_side, shorter_side),
+                                 gfx::Size(shorter_side, longer_side));
 }
 
 void PrivacyIndicatorsTrayItemView::OnThemeChanged() {
@@ -150,6 +247,59 @@
   return "PrivacyIndicatorsTrayItemView";
 }
 
+void PrivacyIndicatorsTrayItemView::AnimationProgressed(
+    const gfx::Animation* animation) {
+  if (animation == expand_animation_.get()) {
+    animation_state_ = AnimationState::kExpand;
+  } else if (animation == longer_side_shrink_animation_.get() &&
+             !shorter_side_shrink_animation_->is_animating()) {
+    animation_state_ = AnimationState::kOnlyLongerSideShrink;
+  } else {
+    animation_state_ = AnimationState::kBothSideShrink;
+  }
+
+  PreferredSizeChanged();
+}
+
+void PrivacyIndicatorsTrayItemView::AnimationEnded(
+    const gfx::Animation* animation) {
+  if (animation_state_ == AnimationState::kExpand) {
+    // Start kDwellInExpand when `expand_animation_` just finished.
+    animation_state_ = kDwellInExpand;
+    PreferredSizeChanged();
+
+    longer_side_shrink_delay_timer_.Start(
+        FROM_HERE, kDwellInExpandDuration,
+        base::BindOnce(&StartAnimation, longer_side_shrink_animation_.get()));
+
+    shorter_side_shrink_delay_timer_.Start(
+        FROM_HERE, kShorterSizeShrinkAnimationDelay,
+        base::BindOnce(&StartAnimation, shorter_side_shrink_animation_.get()));
+  }
+
+  // `shorter_side_shrink_animation_` should be the last one that is running, so
+  // switch the state back to kIdle when it ends.
+  if (animation == shorter_side_shrink_animation_.get()) {
+    animation_state_ = AnimationState::kIdle;
+
+    if (throughput_tracker_) {
+      // Reset `throughput_tracker_` to reset animation metrics recording.
+      throughput_tracker_->Stop();
+      throughput_tracker_.reset();
+    }
+  }
+
+  UpdateBoundsInset();
+}
+
+void PrivacyIndicatorsTrayItemView::AnimationCanceled(
+    const gfx::Animation* animation) {
+  // Finish all animations if one is canceled.
+  EndAllAnimations();
+
+  UpdateBoundsInset();
+}
+
 void PrivacyIndicatorsTrayItemView::UpdateIcons() {
   const SkColor icon_color = AshColorProvider::Get()->GetContentLayerColor(
       AshColorProvider::ContentLayerType::kIconColorPrimary);
@@ -163,7 +313,10 @@
 
 void PrivacyIndicatorsTrayItemView::UpdateBoundsInset() {
   gfx::Rect bounds = GetLocalBounds();
-  auto* shelf = Shelf::ForWindow(GetWidget()->GetNativeWindow());
+
+  // `GetWidget()` might be null in unit tests.
+  auto* shelf = GetWidget() ? Shelf::ForWindow(GetWidget()->GetNativeWindow())
+                            : Shell::GetPrimaryRootWindowController()->shelf();
 
   // We set the bounds inset based on the shorter side of the view (the shorter
   // size changes based on shelf alignment).
@@ -176,4 +329,34 @@
   layer()->SetClipRect(bounds);
 }
 
+int PrivacyIndicatorsTrayItemView::CalculateSizeDuringShrinkAnimation(
+    bool for_longer_side) const {
+  auto* animation = for_longer_side ? longer_side_shrink_animation_.get()
+                                    : shorter_side_shrink_animation_.get();
+
+  double animation_value = gfx::Tween::CalculateValue(
+      gfx::Tween::ACCEL_20_DECEL_100, animation->GetCurrentValue());
+  int begin_size = for_longer_side
+                       ? kPrivacyIndicatorsViewExpandedLongerSideSize
+                       : kPrivacyIndicatorsViewExpandedShorterSideSize;
+
+  // The size shrink from `begin_size` to kPrivacyIndicatorsViewSize when
+  // `animation_value` goes from 0 to 1, and here is the calculation for it.
+  return begin_size -
+         (begin_size - kPrivacyIndicatorsViewSize) * animation_value;
+}
+
+void PrivacyIndicatorsTrayItemView::EndAllAnimations() {
+  shorter_side_shrink_animation_->End();
+  longer_side_shrink_animation_->End();
+  expand_animation_->End();
+  animation_state_ = AnimationState::kIdle;
+
+  if (throughput_tracker_) {
+    // Reset `throughput_tracker_` to reset animation metrics recording.
+    throughput_tracker_->Stop();
+    throughput_tracker_.reset();
+  }
+}
+
 }  // namespace ash
diff --git a/ash/system/privacy/privacy_indicators_tray_item_view.h b/ash/system/privacy/privacy_indicators_tray_item_view.h
index 8e7c8de..f3f9af2 100644
--- a/ash/system/privacy/privacy_indicators_tray_item_view.h
+++ b/ash/system/privacy/privacy_indicators_tray_item_view.h
@@ -7,6 +7,12 @@
 
 #include "ash/ash_export.h"
 #include "ash/system/tray/tray_item_view.h"
+#include "base/timer/timer.h"
+#include "ui/compositor/throughput_tracker.h"
+
+namespace gfx {
+class LinearAnimation;
+}
 
 namespace views {
 class BoxLayout;
@@ -19,6 +25,28 @@
 // is currently accessing camera/microphone.
 class ASH_EXPORT PrivacyIndicatorsTrayItemView : public TrayItemView {
  public:
+  enum AnimationState {
+    // No animation is running.
+    kIdle,
+
+    // `expand_animation_` is running.
+    kExpand,
+
+    // `expand_animation_` finishes but the the shrink animation hasn't started
+    // yet. The view will dwell at its expanded size.
+    kDwellInExpand,
+
+    // Happens when `longer_side_shrink_animation_` already started but
+    // `shorter_side_shrink_animation_` hasn't started yet.
+    kOnlyLongerSideShrink,
+
+    // Happens when both the 2 shrink animations are animating. Note that
+    // `longer_side_shrink_animation_` ended before
+    // `shorter_side_shrink_animation_`, and this state ends when
+    // `shorter_side_shrink_animation_` ends.
+    kBothSideShrink,
+  };
+
   explicit PrivacyIndicatorsTrayItemView(Shelf* shelf);
 
   PrivacyIndicatorsTrayItemView(const PrivacyIndicatorsTrayItemView&) = delete;
@@ -37,6 +65,7 @@
   friend class PrivacyIndicatorsTrayItemViewTest;
 
   // TrayItemView:
+  void PerformVisibilityAnimation(bool visible) override;
   void HandleLocaleChange() override;
   gfx::Size CalculatePreferredSize() const override;
   void OnThemeChanged() override;
@@ -44,6 +73,9 @@
   std::u16string GetTooltipText(const gfx::Point& p) const override;
   views::View* GetTooltipHandlerForPoint(const gfx::Point& point) override;
   const char* GetClassName() const override;
+  void AnimationProgressed(const gfx::Animation* animation) override;
+  void AnimationEnded(const gfx::Animation* animation) override;
+  void AnimationCanceled(const gfx::Animation* animation) override;
 
   // Update the icons for the children views.
   void UpdateIcons();
@@ -51,6 +83,14 @@
   // Update the bounds insets based on shelf alignment.
   void UpdateBoundsInset();
 
+  // Calculate the size of the view during shrink animation. We are calculating
+  // for the longer side if `for_longer_side` is true, otherwise it is for
+  // shorter side.
+  int CalculateSizeDuringShrinkAnimation(bool for_longer_side) const;
+
+  // End all 3 animations contained in this class.
+  void EndAllAnimations();
+
   views::BoxLayout* layout_manager_ = nullptr;
 
   // Owned by the views hierarchy.
@@ -59,6 +99,22 @@
 
   bool camera_is_used_ = false;
   bool microphone_is_used_ = false;
+
+  // Keep track the current animation state during the multi-part animation.
+  AnimationState animation_state_ = kIdle;
+
+  // Animations for showing/expanding the view, then shrink it to be a dot.
+  std::unique_ptr<gfx::LinearAnimation> expand_animation_;
+  std::unique_ptr<gfx::LinearAnimation> longer_side_shrink_animation_;
+  std::unique_ptr<gfx::LinearAnimation> shorter_side_shrink_animation_;
+
+  // Timers for delaying shrink animations after `expand_animation_` is
+  // completed.
+  base::OneShotTimer longer_side_shrink_delay_timer_;
+  base::OneShotTimer shorter_side_shrink_delay_timer_;
+
+  // Measure animation smoothness metrics for all the animations.
+  absl::optional<ui::ThroughputTracker> throughput_tracker_;
 };
 
 }  // namespace ash
diff --git a/ash/system/privacy/privacy_indicators_tray_item_view_unittest.cc b/ash/system/privacy/privacy_indicators_tray_item_view_unittest.cc
index 06f6af1..74649f4 100644
--- a/ash/system/privacy/privacy_indicators_tray_item_view_unittest.cc
+++ b/ash/system/privacy/privacy_indicators_tray_item_view_unittest.cc
@@ -13,9 +13,35 @@
 #include "ash/test/ash_test_base.h"
 #include "base/test/scoped_feature_list.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/animation/linear_animation.h"
 #include "ui/views/controls/image_view.h"
 #include "ui/views/layout/box_layout.h"
 
+namespace {
+
+const int kPrivacyIndicatorsViewExpandedShorterSideSize = 24;
+const int kPrivacyIndicatorsViewExpandedLongerSideSize = 50;
+const int kPrivacyIndicatorsViewSize = 8;
+
+// Get the expected size in expand animation, given the animation value.
+int GetExpectedSizeInExpandAnimation(double progress) {
+  return kPrivacyIndicatorsViewExpandedLongerSideSize *
+         gfx::Tween::CalculateValue(gfx::Tween::ACCEL_20_DECEL_100, progress);
+}
+
+// Get the expected size in shrink animation, given the animation value.
+int GetExpectedSizeInShrinkAnimation(bool for_longer_side, double progress) {
+  double animation_value =
+      gfx::Tween::CalculateValue(gfx::Tween::ACCEL_20_DECEL_100, progress);
+  int begin_size = for_longer_side
+                       ? kPrivacyIndicatorsViewExpandedLongerSideSize
+                       : kPrivacyIndicatorsViewExpandedShorterSideSize;
+  return begin_size -
+         (begin_size - kPrivacyIndicatorsViewSize) * animation_value;
+}
+
+}  // namespace
+
 namespace ash {
 
 class PrivacyIndicatorsTrayItemViewTest : public AshTestBase {
@@ -45,6 +71,18 @@
     return privacy_indicators_view->layout_manager_;
   }
 
+  void AnimateToValue(gfx::LinearAnimation* animation, double animation_value) {
+    EXPECT_TRUE(animation->is_animating());
+    animation->SetCurrentValue(animation_value);
+    privacy_indicators_view_->AnimationProgressed(animation);
+  }
+
+  // Set `privacy_indicators_view_` to be visible and perform animation.
+  void SetViewVisibleWithAnimation() {
+    privacy_indicators_view()->SetVisible(true);
+    privacy_indicators_view_->PerformVisibilityAnimation(/*visible=*/true);
+  }
+
  protected:
   PrivacyIndicatorsTrayItemView* privacy_indicators_view() {
     return privacy_indicators_view_.get();
@@ -57,6 +95,22 @@
     return privacy_indicators_view_->microphone_icon_;
   }
 
+  gfx::LinearAnimation* expand_animation() {
+    return privacy_indicators_view_->expand_animation_.get();
+  }
+
+  PrivacyIndicatorsTrayItemView::AnimationState animation_state() {
+    return privacy_indicators_view_->animation_state_;
+  }
+
+  gfx::LinearAnimation* longer_side_shrink_animation() {
+    return privacy_indicators_view_->longer_side_shrink_animation_.get();
+  }
+
+  gfx::LinearAnimation* shorter_side_shrink_animation() {
+    return privacy_indicators_view_->shorter_side_shrink_animation_.get();
+  }
+
  private:
   std::unique_ptr<PrivacyIndicatorsTrayItemView> privacy_indicators_view_;
 
@@ -134,4 +188,138 @@
             GetLayoutManager(privacy_indicators_view)->GetOrientation());
 }
 
+TEST_F(PrivacyIndicatorsTrayItemViewTest, VisibilityAnimation) {
+  GetPrimaryShelf()->SetAlignment(ShelfAlignment::kBottom);
+
+  EXPECT_FALSE(privacy_indicators_view()->GetVisible());
+  EXPECT_EQ(PrivacyIndicatorsTrayItemView::AnimationState::kIdle,
+            animation_state());
+
+  SetViewVisibleWithAnimation();
+  double progress = 0.5;
+
+  // Firstly, expand animation will be performed.
+  AnimateToValue(expand_animation(), progress);
+  EXPECT_EQ(PrivacyIndicatorsTrayItemView::AnimationState::kExpand,
+            animation_state());
+  EXPECT_EQ(kPrivacyIndicatorsViewExpandedShorterSideSize,
+            privacy_indicators_view()->GetPreferredSize().height());
+  EXPECT_EQ(GetExpectedSizeInExpandAnimation(progress),
+            privacy_indicators_view()->GetPreferredSize().width());
+
+  expand_animation()->End();
+
+  // When expand animation ends, the view will be in `kDwellInExpand` state.
+  EXPECT_EQ(PrivacyIndicatorsTrayItemView::AnimationState::kDwellInExpand,
+            animation_state());
+  EXPECT_EQ(kPrivacyIndicatorsViewExpandedShorterSideSize,
+            privacy_indicators_view()->GetPreferredSize().height());
+  EXPECT_EQ(kPrivacyIndicatorsViewExpandedLongerSideSize,
+            privacy_indicators_view()->GetPreferredSize().width());
+
+  // After that shrink animations will be started.
+  longer_side_shrink_animation()->Start();
+  AnimateToValue(longer_side_shrink_animation(), progress);
+
+  EXPECT_EQ(
+      PrivacyIndicatorsTrayItemView::AnimationState::kOnlyLongerSideShrink,
+      animation_state());
+  EXPECT_EQ(kPrivacyIndicatorsViewExpandedShorterSideSize,
+            privacy_indicators_view()->GetPreferredSize().height());
+  EXPECT_EQ(
+      GetExpectedSizeInShrinkAnimation(/*for_longer_side=*/true, progress),
+      privacy_indicators_view()->GetPreferredSize().width());
+
+  shorter_side_shrink_animation()->Start();
+  AnimateToValue(shorter_side_shrink_animation(), progress);
+
+  EXPECT_EQ(PrivacyIndicatorsTrayItemView::AnimationState::kBothSideShrink,
+            animation_state());
+  EXPECT_EQ(
+      GetExpectedSizeInShrinkAnimation(/*for_longer_side=*/false, progress),
+      privacy_indicators_view()->GetPreferredSize().height());
+  EXPECT_EQ(
+      GetExpectedSizeInShrinkAnimation(/*for_longer_side=*/true, progress),
+      privacy_indicators_view()->GetPreferredSize().width());
+
+  longer_side_shrink_animation()->End();
+  shorter_side_shrink_animation()->End();
+
+  // When finish, the view should have the size of a dot.
+  EXPECT_EQ(PrivacyIndicatorsTrayItemView::AnimationState::kIdle,
+            animation_state());
+  EXPECT_EQ(kPrivacyIndicatorsViewSize,
+            privacy_indicators_view()->GetPreferredSize().height());
+  EXPECT_EQ(kPrivacyIndicatorsViewSize,
+            privacy_indicators_view()->GetPreferredSize().width());
+}
+
+// Same test as above, but with the side shelf (the longer and shorter side will
+// be flipped).
+TEST_F(PrivacyIndicatorsTrayItemViewTest, SideShelfVisibilityAnimation) {
+  GetPrimaryShelf()->SetAlignment(ShelfAlignment::kLeft);
+
+  EXPECT_FALSE(privacy_indicators_view()->GetVisible());
+  EXPECT_EQ(PrivacyIndicatorsTrayItemView::AnimationState::kIdle,
+            animation_state());
+
+  SetViewVisibleWithAnimation();
+  double progress = 0.5;
+
+  // Firstly, expand animation will be performed.
+  AnimateToValue(expand_animation(), progress);
+  EXPECT_EQ(PrivacyIndicatorsTrayItemView::AnimationState::kExpand,
+            animation_state());
+  EXPECT_EQ(kPrivacyIndicatorsViewExpandedShorterSideSize,
+            privacy_indicators_view()->GetPreferredSize().width());
+  EXPECT_EQ(GetExpectedSizeInExpandAnimation(progress),
+            privacy_indicators_view()->GetPreferredSize().height());
+
+  expand_animation()->End();
+
+  // When expand animation ends, the view will be in `kDwellInExpand` state.
+  EXPECT_EQ(PrivacyIndicatorsTrayItemView::AnimationState::kDwellInExpand,
+            animation_state());
+  EXPECT_EQ(kPrivacyIndicatorsViewExpandedShorterSideSize,
+            privacy_indicators_view()->GetPreferredSize().width());
+  EXPECT_EQ(kPrivacyIndicatorsViewExpandedLongerSideSize,
+            privacy_indicators_view()->GetPreferredSize().height());
+
+  // After that shrink animations will be started.
+  longer_side_shrink_animation()->Start();
+  AnimateToValue(longer_side_shrink_animation(), progress);
+
+  EXPECT_EQ(
+      PrivacyIndicatorsTrayItemView::AnimationState::kOnlyLongerSideShrink,
+      animation_state());
+  EXPECT_EQ(kPrivacyIndicatorsViewExpandedShorterSideSize,
+            privacy_indicators_view()->GetPreferredSize().width());
+  EXPECT_EQ(
+      GetExpectedSizeInShrinkAnimation(/*for_longer_side=*/true, progress),
+      privacy_indicators_view()->GetPreferredSize().height());
+
+  shorter_side_shrink_animation()->Start();
+  AnimateToValue(shorter_side_shrink_animation(), progress);
+
+  EXPECT_EQ(PrivacyIndicatorsTrayItemView::AnimationState::kBothSideShrink,
+            animation_state());
+  EXPECT_EQ(
+      GetExpectedSizeInShrinkAnimation(/*for_longer_side=*/false, progress),
+      privacy_indicators_view()->GetPreferredSize().width());
+  EXPECT_EQ(
+      GetExpectedSizeInShrinkAnimation(/*for_longer_side=*/true, progress),
+      privacy_indicators_view()->GetPreferredSize().height());
+
+  longer_side_shrink_animation()->End();
+  shorter_side_shrink_animation()->End();
+
+  // When finish, the view should have the size of a dot.
+  EXPECT_EQ(PrivacyIndicatorsTrayItemView::AnimationState::kIdle,
+            animation_state());
+  EXPECT_EQ(kPrivacyIndicatorsViewSize,
+            privacy_indicators_view()->GetPreferredSize().width());
+  EXPECT_EQ(kPrivacyIndicatorsViewSize,
+            privacy_indicators_view()->GetPreferredSize().height());
+}
+
 }  // namespace ash
diff --git a/ash/wallpaper/wallpaper_controller_unittest.cc b/ash/wallpaper/wallpaper_controller_unittest.cc
index b6d89f6..53d79953 100644
--- a/ash/wallpaper/wallpaper_controller_unittest.cc
+++ b/ash/wallpaper/wallpaper_controller_unittest.cc
@@ -4058,9 +4058,8 @@
   EXPECT_EQ(1, GetWallpaperCount());
   EXPECT_EQ(controller_->GetWallpaperType(), WallpaperType::kDaily);
 
-  // Fast forward by one hour and attempt a system's color mode change.
-  task_environment()->FastForwardBy(base::Hours(1));
-  Shell::Get()->dark_light_mode_controller()->ToggleColorMode();
+  // Attempt a system's color mode change.
+  controller_->OnColorModeChanged(true);
   RunAllTasksUntilIdle();
   EXPECT_EQ(2, GetWallpaperCount());
   // Expect the refresh timer doesn't reset.
diff --git a/ash/webui/common/resources/fake_method_resolver.js b/ash/webui/common/resources/fake_method_resolver.js
index 4c2b5ef..6b415a3 100644
--- a/ash/webui/common/resources/fake_method_resolver.js
+++ b/ash/webui/common/resources/fake_method_resolver.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 /**
  * @fileoverview
diff --git a/ash/webui/diagnostics_ui/resources/fake_system_routine_controller.js b/ash/webui/diagnostics_ui/resources/fake_system_routine_controller.js
index 4511ed4..7c816310 100644
--- a/ash/webui/diagnostics_ui/resources/fake_system_routine_controller.js
+++ b/ash/webui/diagnostics_ui/resources/fake_system_routine_controller.js
@@ -4,7 +4,7 @@
 
 import {FakeMethodResolver} from 'chrome://resources/ash/common/fake_method_resolver.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {PowerRoutineResult, RoutineResult, RoutineResultInfo, RoutineRunnerInterface, RoutineType, StandardRoutineResult, SystemRoutineControllerInterface} from './system_routine_controller.mojom-webui.js';
 
diff --git a/ash/webui/diagnostics_ui/resources/routine_list_executor.js b/ash/webui/diagnostics_ui/resources/routine_list_executor.js
index e9b96d06..aaf2fe1 100644
--- a/ash/webui/diagnostics_ui/resources/routine_list_executor.js
+++ b/ash/webui/diagnostics_ui/resources/routine_list_executor.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {RoutineResult, RoutineResultInfo, RoutineRunnerInterface, RoutineRunnerReceiver, RoutineType, SystemRoutineControllerInterface} from './system_routine_controller.mojom-webui.js';
 
diff --git a/ash/webui/firmware_update_ui/resources/fake_update_controller.js b/ash/webui/firmware_update_ui/resources/fake_update_controller.js
index 531c1ba14..8f6b3ac 100644
--- a/ash/webui/firmware_update_ui/resources/fake_update_controller.js
+++ b/ash/webui/firmware_update_ui/resources/fake_update_controller.js
@@ -4,7 +4,7 @@
 
 import {FakeObservables} from 'chrome://resources/ash/common/fake_observables.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {fakeFirmwareUpdates, fakeInstallationProgress, fakeInstallationProgressFailure} from './fake_data.js';
 import {FakeUpdateProviderInterface, FirmwareUpdate, InstallationProgress, InstallControllerInterface, UpdateProgressObserver, UpdateProviderInterface, UpdateState} from './firmware_update_types.js';
diff --git a/ash/webui/os_feedback_ui/resources/file_attachment.html b/ash/webui/os_feedback_ui/resources/file_attachment.html
index 3509759b..267ffa0d 100644
--- a/ash/webui/os_feedback_ui/resources/file_attachment.html
+++ b/ash/webui/os_feedback_ui/resources/file_attachment.html
@@ -124,7 +124,8 @@
 <input id="selectFileDialog" type="file" on-change="handleFileSelectChange_"
     tabindex="-1">
 <div id="replaceFileContainer" hidden="[[!hasSelectedAFile_]]">
-  <cr-checkbox id="selectFileCheckbox" class="no-label">
+  <cr-checkbox id="selectFileCheckbox" class="no-label"
+      title="[[i18n('attachFileCheckboxArialLabel')]]">
   </cr-checkbox>
   <div id="selectedFileContainer">
     <button id="selectedImageButton" on-click="handleSelectedImageClick_"
diff --git a/ash/webui/projector_app/projector_message_handler.cc b/ash/webui/projector_app/projector_message_handler.cc
index 876170a..4cb3d2d 100644
--- a/ash/webui/projector_app/projector_message_handler.cc
+++ b/ash/webui/projector_app/projector_message_handler.cc
@@ -357,8 +357,10 @@
   // 3. The request body data.
   // 4. A bool to indicate whether or not to use end user credential to
   // authorize the request.
-  // 5. Additional headers objects.
-  DCHECK_EQ(func_args.size(), 5u);
+  // 5. A bool to indicate whether or not to use api key to authorize the
+  // request.
+  // 6. Additional headers objects.
+  DCHECK_EQ(func_args.size(), 6u);
 
   const auto& url = func_args[0].GetString();
   const auto& method = func_args[1].GetString();
@@ -367,15 +369,16 @@
       func_args[2].is_string() ? func_args[2].GetString() : std::string();
   bool use_credentials =
       func_args[3].is_bool() ? func_args[3].GetBool() : false;
+  bool use_api_key = func_args[4].is_bool() ? func_args[4].GetBool() : false;
 
   DCHECK(!url.empty());
   DCHECK(!method.empty());
 
   xhr_sender_->Send(
-      GURL(url), method, request_body, use_credentials,
+      GURL(url), method, request_body, use_credentials, use_api_key,
       base::BindOnce(&ProjectorMessageHandler::OnXhrRequestCompleted,
                      GetWeakPtr(), callback_id),
-      func_args[4].is_dict() ? func_args[4].GetDict().Clone()
+      func_args[5].is_dict() ? func_args[5].GetDict().Clone()
                              : base::Value::Dict());
 }
 
diff --git a/ash/webui/projector_app/projector_xhr_sender.cc b/ash/webui/projector_app/projector_xhr_sender.cc
index ef55eece..5e06b4b 100644
--- a/ash/webui/projector_app/projector_xhr_sender.cc
+++ b/ash/webui/projector_app/projector_xhr_sender.cc
@@ -6,7 +6,6 @@
 
 #include <string>
 
-#include "ash/constants/ash_features.h"
 #include "ash/webui/projector_app/projector_app_client.h"
 #include "base/bind.h"
 #include "base/strings/string_util.h"
@@ -38,8 +37,6 @@
 
 constexpr char kAuthorizationHeaderPrefix[] = "Bearer ";
 
-constexpr char kTranslationApiDomain[] = "translation.googleapis.com";
-
 constexpr char kApiKeyParam[] = "key";
 
 // List of URL prefix supported by `ProjectorXhrSender`.
@@ -76,6 +73,7 @@
                               const std::string& method,
                               const std::string& request_body,
                               bool use_credentials,
+                              bool use_api_key,
                               SendRequestCallback callback,
                               const base::Value::Dict& headers) {
   if (!IsUrlAllowlisted(url.spec())) {
@@ -86,11 +84,6 @@
     return;
   }
 
-  // TODO(b/244190982): pass an option to use api key from the XhrSender api
-  // instead.
-  bool use_api_key =
-      ash::features::IsProjectorUseApiKeyForTranslationEnabled() &&
-      url.DomainIs(kTranslationApiDomain);
   GURL request_url = url;
   if (use_api_key) {
     request_url =
diff --git a/ash/webui/projector_app/projector_xhr_sender.h b/ash/webui/projector_app/projector_xhr_sender.h
index 4341f42d..910da8b 100644
--- a/ash/webui/projector_app/projector_xhr_sender.h
+++ b/ash/webui/projector_app/projector_xhr_sender.h
@@ -54,6 +54,7 @@
                     const std::string& method,
                     const std::string& request_body,
                     bool use_credentials,
+                    bool use_api_key,
                     SendRequestCallback callback,
                     const base::Value::Dict& headers = base::Value::Dict());
 
diff --git a/ash/webui/projector_app/resources/app/trusted/projector_browser_proxy.js b/ash/webui/projector_app/resources/app/trusted/projector_browser_proxy.js
index 01469a3..09bab82 100644
--- a/ash/webui/projector_app/resources/app/trusted/projector_browser_proxy.js
+++ b/ash/webui/projector_app/resources/app/trusted/projector_browser_proxy.js
@@ -55,10 +55,12 @@
    * @param {string=} requestBody the request body data.
    * @param {boolean=} useCredentials authorize the request with end user
    *     credentials. Used for getting streaming URL.
+   * @param {boolean=} useApiKey authorize the request with API key. Used for
+   *     translaton requests.
    * @param {Object=} headers additional headers.
    * @return {!Promise<!projectorApp.XhrResponse>}
    */
-  sendXhr(url, method, requestBody, useCredentials, headers) {}
+  sendXhr(url, method, requestBody, useCredentials, useApiKey, headers) {}
 
   /**
    * Returns true if the "install speech recognition" button should be shown to
@@ -148,9 +150,10 @@
   }
 
   /** @override */
-  sendXhr(url, method, requestBody, useCredentials, headers) {
+  sendXhr(url, method, requestBody, useCredentials, useApiKey, headers) {
     return sendWithPromise(
-        'sendXhr', [url, method, requestBody, useCredentials, headers]);
+        'sendXhr',
+        [url, method, requestBody, useCredentials, useApiKey, headers]);
   }
 
   /** @override */
diff --git a/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js b/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js
index d5572f9..e8fcfc5 100644
--- a/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js
+++ b/ash/webui/projector_app/resources/app/trusted/trusted_app_comm_factory.js
@@ -108,14 +108,14 @@
       this.browserProxy_.onError(msg);
     });
     this.registerMethod('sendXhr', (values) => {
-      if (!values || values.length != 5) {
+      if (!values || values.length != 6) {
         return {
           success: false,
           error: 'INVALID_ARGUMENTS',
         };
       }
       return this.browserProxy_.sendXhr(
-          values[0], values[1], values[2], values[3], values[4]);
+          values[0], values[1], values[2], values[3], values[4], values[5]);
     });
     this.registerMethod('shouldDownloadSoda', (args) => {
       return this.browserProxy_.shouldDownloadSoda();
diff --git a/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js b/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js
index 099cab2..eebb663 100644
--- a/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js
+++ b/ash/webui/projector_app/resources/app/untrusted/untrusted_app_comm_factory.js
@@ -4,7 +4,7 @@
 
 import {PostMessageAPIClient} from '//resources/ash/common/post_message_api/post_message_api_client.js';
 import {RequestHandler} from '//resources/ash/common/post_message_api/post_message_api_request_handler.js';
-import {PromiseResolver} from '//resources/js/promise_resolver.m.js';
+import {PromiseResolver} from '//resources/js/promise_resolver.js';
 import {ProjectorError} from 'chrome-untrusted://projector/common/message_types.js';
 
 const TARGET_URL = 'chrome://projector/';
@@ -124,16 +124,19 @@
    * @param {string=} requestBody the request body data.
    * @param {boolean=} useCredentials authorize the request with end user
    *     credentials. Used for getting streaming URL.
+   * @param {boolean=} useApiKey authorize the request with API key. Used for
+   *     translaton requests.
    * @param {object=} additional headers.
    * @return {!Promise<!projectorApp.XhrResponse>}
    */
-  sendXhr(url, method, requestBody, useCredentials, headers) {
+  sendXhr(url, method, requestBody, useCredentials, useApiKey, headers) {
     return AppUntrustedCommFactory.getPostMessageAPIClient().callApiFn(
         'sendXhr', [
           url,
           method,
           requestBody ? requestBody : '',
           !!useCredentials,
+          !!useApiKey,
           headers,
         ]);
   },
diff --git a/ash/webui/projector_app/resources/common/projector_app.externs.js b/ash/webui/projector_app/resources/common/projector_app.externs.js
index 823216e..a2c2e3ce 100644
--- a/ash/webui/projector_app/resources/common/projector_app.externs.js
+++ b/ash/webui/projector_app/resources/common/projector_app.externs.js
@@ -320,11 +320,13 @@
  * @param {string=} requestBody the request body data.
  * @param {boolean=} useCredentials authorize the request with end user
  *  credentials. Used for getting streaming URL.
+ * @param {boolean=} useApiKey authorize the request with API key. Used for
+ *  translation requests.
  * @param {Object=} additional headers.
  * @return {!Promise<!projectorApp.XhrResponse>}
  */
 projectorApp.ClientDelegate.prototype.sendXhr = function(
-    url, method, requestBody, useCredentials, headers) {};
+    url, method, requestBody, useCredentials, useApiKey, headers) {};
 
 /**
  * Returns true if the device supports on device speech recognition.
diff --git a/ash/webui/projector_app/test/mock_xhr_sender.cc b/ash/webui/projector_app/test/mock_xhr_sender.cc
index 420caeda..db76441 100644
--- a/ash/webui/projector_app/test/mock_xhr_sender.cc
+++ b/ash/webui/projector_app/test/mock_xhr_sender.cc
@@ -21,6 +21,7 @@
                          const std::string& method,
                          const std::string& request_body,
                          bool use_credentials,
+                         bool use_api_key,
                          SendRequestCallback callback,
                          const base::Value::Dict& headers) {
   std::move(quit_closure_).Run(url, method, request_body);
diff --git a/ash/webui/projector_app/test/mock_xhr_sender.h b/ash/webui/projector_app/test/mock_xhr_sender.h
index fb7a308..d7f5d1f 100644
--- a/ash/webui/projector_app/test/mock_xhr_sender.h
+++ b/ash/webui/projector_app/test/mock_xhr_sender.h
@@ -36,6 +36,7 @@
             const std::string& method,
             const std::string& request_body,
             bool use_credentials,
+            bool use_api_key,
             SendRequestCallback callback,
             const base::Value::Dict& headers) override;
 
diff --git a/ash/webui/projector_app/test/projector_message_handler_unittest.cc b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
index 8734808d..05068d3d 100644
--- a/ash/webui/projector_app/test/projector_message_handler_unittest.cc
+++ b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
@@ -246,6 +246,8 @@
   args.Append(kTestXhrRequestBody);
   // Add useCredentials.
   args.Append(true);
+  // Add useApiKey.
+  args.Append(false);
   // Add additional headers.
   base::Value::Dict dict;
   dict.Set(kTestXhrHeaderKey, kTestXhrHeaderValue);
@@ -295,6 +297,8 @@
   args.Append(kTestXhrRequestBody);
   // Add useCredentials.
   args.Append(true);
+  // Add useApiKey.
+  args.Append(false);
   // Add additional headers.
   base::Value::Dict dict;
   dict.Set(kTestXhrHeaderKey, kTestXhrHeaderValue);
@@ -344,6 +348,8 @@
   args.Append(kTestXhrRequestBody);
   // Add useCredentials.
   args.Append(true);
+  // Add useApiKey.
+  args.Append(false);
   // Add additional headers.
   base::Value::Dict dict;
   dict.Set(kTestXhrHeaderKey, kTestXhrHeaderValue);
diff --git a/ash/webui/projector_app/test/projector_xhr_sender_unittest.cc b/ash/webui/projector_app/test/projector_xhr_sender_unittest.cc
index 353ee12b..f80b8325 100644
--- a/ash/webui/projector_app/test/projector_xhr_sender_unittest.cc
+++ b/ash/webui/projector_app/test/projector_xhr_sender_unittest.cc
@@ -62,6 +62,7 @@
   sender()->Send(
       GURL(kTestDriveRequestUrl), "GET", /*request_body=*/"",
       /*use_credentials=*/false,
+      /*use_api_key=*/false,
       base::BindOnce(
           [](const std::string& expected_response_body,
              base::RepeatingClosure quit_closure, bool success,
@@ -88,6 +89,7 @@
   sender()->Send(
       GURL(kTestDriveRequestUrl), "GET", /*request_body=*/"",
       /*use_credentials=*/false,
+      /*use_api_key=*/false,
       base::BindOnce(
           [](const std::string& expected_response_body,
              base::RepeatingClosure quit_closure, bool success,
@@ -105,6 +107,7 @@
   sender()->Send(
       translation_url, "GET", /*request_body=*/"",
       /*use_credentials=*/false,
+      /*use_api_key=*/false,
       base::BindOnce(
           [](const std::string& expected_response_body,
              base::RepeatingClosure quit_closure, bool success,
@@ -120,7 +123,7 @@
                                                           test_response_body);
 
   mock_app_client().test_url_loader_factory().AddResponse(
-      GetUrlWithApiKey(translation_url).spec(), test_response_body2);
+      translation_url.spec(), test_response_body2);
 
   mock_app_client().GrantOAuthTokenFor(
       kTestUserEmail,
@@ -136,6 +139,7 @@
   sender()->Send(
       GURL(kTestDriveRequestUrl), "GET", /*request_body=*/"",
       /*use_credentials=*/true,
+      /*use_api_key=*/false,
       base::BindOnce(
           [](const std::string& expected_response_body,
              base::RepeatingClosure quit_closure, bool success,
@@ -161,6 +165,7 @@
   const std::string& test_response_body = "{}";
   sender()->Send(
       url, "GET", /*request_body=*/"", /*use_credentials=*/false,
+      /*use_api_key=*/true,
       base::BindOnce(
           [](const std::string& expected_response_body,
              base::RepeatingClosure quit_closure, bool success,
@@ -184,7 +189,7 @@
 
   sender()->Send(
       GURL(kTestDriveRequestUrl), /*method=*/"GET", /*request_body=*/"",
-      /*use_credentials=*/false,
+      /*use_credentials=*/false, /*use_api_key=*/false,
       base::BindOnce(
           [](base::RepeatingClosure quit_closure, bool success,
              const std::string& response_body, const std::string& error) {
@@ -210,7 +215,7 @@
 
   sender()->Send(
       GURL("https://example.com"), /*method=*/"GET", /*request_body=*/"",
-      /*use_credentials=*/false,
+      /*use_credentials=*/false, /*use_api_key=*/false,
       base::BindOnce(
           [](base::RepeatingClosure quit_closure, bool success,
              const std::string& response_body, const std::string& error) {
diff --git a/ash/wm/workspace/phantom_window_controller.cc b/ash/wm/workspace/phantom_window_controller.cc
index f85fee2..88705c40 100644
--- a/ash/wm/workspace/phantom_window_controller.cc
+++ b/ash/wm/workspace/phantom_window_controller.cc
@@ -7,7 +7,6 @@
 #include <math.h>
 
 #include "ash/public/cpp/shell_window_ids.h"
-#include "ash/public/cpp/style/scoped_light_mode_as_default.h"
 #include "ash/root_window_controller.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_id.h"
@@ -248,10 +247,8 @@
           .SetOrientation(views::BoxLayout::Orientation::kHorizontal)
           .SetInsideBorderInsets(gfx::Insets::VH(kMaximizeCueVerticalInsets,
                                                  kMaximizeCueHorizontalInsets))
-          .SetBackground(views::CreateRoundedRectBackground(
-              AshColorProvider::Get()->GetShieldLayerColor(
-                  AshColorProvider::ShieldLayerType::kShield20),
-              kPhantomWindowCornerRadius))
+          .SetBackground(views::CreateThemedRoundedRectBackground(
+              kColorAshShieldAndBase20, kPhantomWindowCornerRadius))
           .SetBorder(std::make_unique<views::HighlightBorder>(
               kPhantomWindowCornerRadius,
               views::HighlightBorder::Type::kHighlightBorder1,
diff --git a/base/BUILD.gn b/base/BUILD.gn
index c628c2cc..c6196e9 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -3470,6 +3470,7 @@
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/icu",
+    "//third_party/modp_b64",
   ]
 
   # TODO(crbug.com/1304253): iOS test() targets don't support mixing Rust code
diff --git a/base/OWNERS b/base/OWNERS
index bf39503..086601e 100644
--- a/base/OWNERS
+++ b/base/OWNERS
@@ -34,6 +34,14 @@
 per-file feature_list*=asvitkine@chromium.org
 per-file feature_list*=isherman@chromium.org
 
+# Logging-related changes:
+per-file check*=olivierli@chromium.org
+per-file check*=pbos@chromium.org
+per-file dcheck*=olivierli@chromium.org
+per-file dcheck*=pbos@chromium.org
+per-file logging*=olivierli@chromium.org
+per-file logging*=pbos@chromium.org
+
 # Restricted since rand_util.h also backs the cryptographically secure RNG.
 per-file rand_util*=set noparent
 per-file rand_util*=file://ipc/SECURITY_OWNERS
diff --git a/base/base64.cc b/base/base64.cc
index 5d58a6a..6aea482 100644
--- a/base/base64.cc
+++ b/base/base64.cc
@@ -6,22 +6,34 @@
 
 #include <stddef.h>
 
+#include "base/check.h"
+#include "base/numerics/checked_math.h"
 #include "third_party/modp_b64/modp_b64.h"
 
 namespace base {
 
 std::string Base64Encode(span<const uint8_t> input) {
   std::string output;
-  output.resize(modp_b64_encode_len(input.size()));  // makes room for null byte
-
-  // modp_b64_encode_len() returns at least 1, so output[0] is safe to use.
-  const size_t output_size = modp_b64_encode(
-      &(output[0]), reinterpret_cast<const char*>(input.data()), input.size());
-
-  output.resize(output_size);
+  Base64EncodeAppend(input, &output);
   return output;
 }
 
+void Base64EncodeAppend(span<const uint8_t> input, std::string* output) {
+  // Ensure `modp_b64_encode_len` will not overflow. Note this length and
+  // `modp_b64_encode`'s output includes a trailing NUL byte.
+  CHECK_LE(input.size(), MODP_B64_MAX_INPUT_LEN);
+  size_t encode_len = modp_b64_encode_len(input.size());
+
+  size_t prefix_len = output->size();
+  output->resize(base::CheckAdd(encode_len, prefix_len).ValueOrDie());
+
+  const size_t output_size = modp_b64_encode(
+      output->data() + prefix_len, reinterpret_cast<const char*>(input.data()),
+      input.size());
+  // `output_size` does not include the trailing NUL byte, so this removes it.
+  output->resize(prefix_len + output_size);
+}
+
 void Base64Encode(StringPiece input, std::string* output) {
   *output = Base64Encode(base::as_bytes(base::make_span(input)));
 }
diff --git a/base/base64.h b/base/base64.h
index 373215ad..10b22fb 100644
--- a/base/base64.h
+++ b/base/base64.h
@@ -20,6 +20,10 @@
 // Encodes the input binary data in base64.
 BASE_EXPORT std::string Base64Encode(span<const uint8_t> input);
 
+// Encodes the input binary data in base64 and appends it to the output.
+BASE_EXPORT void Base64EncodeAppend(span<const uint8_t> input,
+                                    std::string* output);
+
 // Encodes the input string in base64.
 BASE_EXPORT void Base64Encode(StringPiece input, std::string* output);
 
diff --git a/base/base64_unittest.cc b/base/base64_unittest.cc
index 2c060238..b593633 100644
--- a/base/base64_unittest.cc
+++ b/base/base64_unittest.cc
@@ -4,8 +4,11 @@
 
 #include "base/base64.h"
 
+#include "base/numerics/checked_math.h"
+#include "base/test/gtest_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/modp_b64/modp_b64.h"
 
 namespace base {
 
@@ -28,7 +31,7 @@
 TEST(Base64Test, Binary) {
   const uint8_t kData[] = {0x00, 0x01, 0xFE, 0xFF};
 
-  std::string binary_encoded = Base64Encode(make_span(kData));
+  std::string binary_encoded = Base64Encode(kData);
 
   // Check that encoding the same data through the StringPiece interface gives
   // the same results.
@@ -41,6 +44,10 @@
   EXPECT_THAT(Base64Decode(binary_encoded),
               testing::Optional(testing::ElementsAreArray(kData)));
   EXPECT_FALSE(Base64Decode("invalid base64!"));
+
+  std::string encoded_with_prefix = "PREFIX";
+  Base64EncodeAppend(kData, &encoded_with_prefix);
+  EXPECT_EQ(encoded_with_prefix, "PREFIX" + binary_encoded);
 }
 
 TEST(Base64Test, InPlace) {
@@ -56,4 +63,26 @@
   EXPECT_EQ(text, kText);
 }
 
+TEST(Base64Test, Overflow) {
+  // `Base64Encode` makes the input larger, which means inputs whose base64
+  // output overflows `size_t`. Actually allocating a span of this size will
+  // likely fail, but we test it with a fake span and assume a correct
+  // implementation will check for overflow before touching the input.
+  //
+  // Note that, with or without an overflow check, the function will still
+  // crash. This test is only meaningful because `EXPECT_CHECK_DEATH` looks for
+  // a `CHECK`-based failure.
+  uint8_t b;
+  auto large_span = base::make_span(&b, MODP_B64_MAX_INPUT_LEN + 1);
+  EXPECT_CHECK_DEATH(Base64Encode(large_span));
+
+  std::string output = "PREFIX";
+  EXPECT_CHECK_DEATH(Base64EncodeAppend(large_span, &output));
+
+  // `modp_b64_encode_len` is a macro, so check `MODP_B64_MAX_INPUT_LEN` is
+  // correct be verifying the computation doesn't overflow.
+  base::CheckedNumeric<size_t> max_len = MODP_B64_MAX_INPUT_LEN;
+  EXPECT_TRUE(modp_b64_encode_len(max_len).IsValid());
+}
+
 }  // namespace base
diff --git a/build/android/bytecode/java/org/chromium/bytecode/MethodCheckerClassAdapter.java b/build/android/bytecode/java/org/chromium/bytecode/MethodCheckerClassAdapter.java
index 9320fbf..6794a77a 100644
--- a/build/android/bytecode/java/org/chromium/bytecode/MethodCheckerClassAdapter.java
+++ b/build/android/bytecode/java/org/chromium/bytecode/MethodCheckerClassAdapter.java
@@ -20,7 +20,7 @@
 /**
  * This ClassVisitor verifies that a class and its methods are suitable for rewriting.
  * Given a class and a list of methods it performs the following checks:
- * 1. Class is subclass of {@link android.view.View}.
+ * 1. Class is subclass of a class that we want to trace.
  * 2. Class is not abstract or an interface.
  *
  * For each method provided in {@code methodsToCheck}:
@@ -34,6 +34,10 @@
  */
 class MethodCheckerClassAdapter extends ClassVisitor {
     private static final String VIEW_CLASS_DESCRIPTOR = "android/view/View";
+    private static final String ANIMATOR_UPDATE_LISTENER_CLASS_DESCRIPTOR =
+            "android/animation/ValueAnimator$AnimatorUpdateListener";
+    private static final String ANIMATOR_LISTENER_CLASS_DESCRIPTOR =
+            "android/animation/Animator$AnimatorListener";
 
     private final ArrayList<MethodDescription> mMethodsToCheck;
     private final ClassLoader mJarClassLoader;
@@ -56,7 +60,7 @@
         boolean isAbstract = (access & ACC_ABSTRACT) == ACC_ABSTRACT;
         boolean isInterface = (access & ACC_INTERFACE) == ACC_INTERFACE;
 
-        if (isAbstract || isInterface || !isClassView(name)) {
+        if (isAbstract || isInterface || !shouldTraceClass(name)) {
             mMethodsToCheck.clear();
             return;
         }
@@ -101,13 +105,17 @@
         super.visitEnd();
     }
 
-    private boolean isClassView(String desc) {
-        Class currentClass = getClass(desc);
-        Class viewClass = getClass(VIEW_CLASS_DESCRIPTOR);
-        if (currentClass != null && viewClass != null) {
-            return viewClass.isAssignableFrom(currentClass);
-        }
-        return false;
+    private boolean shouldTraceClass(String desc) {
+        Class clazz = getClass(desc);
+        return isClassDerivedFrom(clazz, VIEW_CLASS_DESCRIPTOR)
+                || isClassDerivedFrom(clazz, ANIMATOR_UPDATE_LISTENER_CLASS_DESCRIPTOR)
+                || isClassDerivedFrom(clazz, ANIMATOR_LISTENER_CLASS_DESCRIPTOR);
+    }
+
+    private boolean isClassDerivedFrom(Class clazz, String classDescriptor) {
+        Class superClass = getClass(classDescriptor);
+        if (clazz == null || superClass == null) return false;
+        return superClass.isAssignableFrom(clazz);
     }
 
     private Class getClass(String desc) {
diff --git a/build/android/bytecode/java/org/chromium/bytecode/TraceEventAdder.java b/build/android/bytecode/java/org/chromium/bytecode/TraceEventAdder.java
index 1dfa829..4a85159 100644
--- a/build/android/bytecode/java/org/chromium/bytecode/TraceEventAdder.java
+++ b/build/android/bytecode/java/org/chromium/bytecode/TraceEventAdder.java
@@ -71,12 +71,22 @@
     @Override
     protected boolean shouldRewriteClass(ClassReader classReader) {
         mMethodsToTrace = new ArrayList<>(Arrays.asList(
+                // Methods on View.java
                 new MethodDescription(
                         "dispatchTouchEvent", "(Landroid/view/MotionEvent;)Z", Opcodes.ACC_PUBLIC),
                 new MethodDescription("draw", "(Landroid/graphics/Canvas;)V", Opcodes.ACC_PUBLIC),
                 new MethodDescription("onMeasure", "(II)V", Opcodes.ACC_PROTECTED),
                 new MethodDescription("onLayout", "(ZIIII)V", Opcodes.ACC_PROTECTED),
-                new MethodDescription("scrollStep", "(II[I)V", 0)));
+                // Methods on RecyclerView.java in AndroidX
+                new MethodDescription("scrollStep", "(II[I)V", 0),
+                // Methods on Animator.AnimatorListener
+                new MethodDescription(
+                        "onAnimationStart", "(Landroid/animation/Animator;)V", Opcodes.ACC_PUBLIC),
+                new MethodDescription(
+                        "onAnimationEnd", "(Landroid/animation/Animator;)V", Opcodes.ACC_PUBLIC),
+                // Methods on ValueAnimator.AnimatorUpdateListener
+                new MethodDescription("onAnimationUpdate", "(Landroid/animation/ValueAnimator;)V",
+                        Opcodes.ACC_PUBLIC)));
 
         // This adapter will modify mMethodsToTrace to indicate which methods already exist in the
         // class and which ones need to be overridden. In case the class is not an Android view
diff --git a/build/rust/rust_bindgen.gni b/build/rust/rust_bindgen.gni
index 6fe1c9a..caad79e 100644
--- a/build/rust/rust_bindgen.gni
+++ b/build/rust/rust_bindgen.gni
@@ -57,7 +57,7 @@
       configs += invoker.configs
     }
 
-    bindgen_target = "//third_party/rust/bindgen/v0_59:bindgen($host_toolchain)"
+    bindgen_target = "//third_party/rust/bindgen/v0_60:bindgen($host_toolchain)"
 
     bindgen_obj_dir = get_label_info(bindgen_target, "root_out_dir")
     bindgen_executable = "${bindgen_obj_dir}/bindgen"
diff --git a/build/rust/tests/BUILD.gn b/build/rust/tests/BUILD.gn
index 82d0723..67fbfa16 100644
--- a/build/rust/tests/BUILD.gn
+++ b/build/rust/tests/BUILD.gn
@@ -84,7 +84,7 @@
         "test_rust_exe",
         "test_rust_multiple_dep_versions_exe",
         "test_simple_rust_exe",
-        "//third_party/rust/bindgen/v0_59:bindgen",
+        "//third_party/rust/bindgen/v0_60:bindgen",
 
         # TODO(https://crbug.com/1329611): Enable the additional target below
         # once `rs_bindings_from_cc` is distributed via `gclient sync`.  In the
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index d34a3ee..82c83af 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision vars in //DEPS.
-  libcxx_revision = "cec1dd0bf658dd8ddae22213787da36cedd1e8fb"
+  libcxx_revision = "a4dc7f17ca393e764685d475bbf65ff8f71a0800"
 }
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 47627fb..4c86d6a 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -2772,7 +2772,6 @@
     "java/src/org/chromium/chrome/browser/app/usb/UsbNotificationService.java",
     "java/src/org/chromium/chrome/browser/base/DexFixer.java",
     "java/src/org/chromium/chrome/browser/base/DexFixerReason.java",
-    "java/src/org/chromium/chrome/browser/base/ServiceTracingProxyProvider.java",
     "java/src/org/chromium/chrome/browser/base/SplitChromeApplication.java",
     "java/src/org/chromium/chrome/browser/base/SplitCompatAppComponentFactory.java",
     "java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
index a977fef..79901d5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
@@ -29,7 +29,6 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.base.ServiceTracingProxyProvider;
 import org.chromium.chrome.browser.base.SplitChromeApplication;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.language.GlobalAppLocaleController;
@@ -52,7 +51,6 @@
             new ObservableSupplierImpl<>();
     private NightModeStateProvider mNightModeStateProvider;
     private LinkedHashSet<Integer> mThemeResIds = new LinkedHashSet<>();
-    private ServiceTracingProxyProvider mServiceTracingProxyProvider;
 
     @Override
     protected void attachBaseContext(Context newBase) {
@@ -75,8 +73,6 @@
             BundleUtils.checkContextClassLoader(newBase, this);
         }
 
-        mServiceTracingProxyProvider = ServiceTracingProxyProvider.create(newBase);
-
         mNightModeStateProvider = createNightModeStateProvider();
 
         Configuration config = new Configuration();
@@ -280,16 +276,4 @@
     public SharedPreferences getSharedPreferences(String name, int mode) {
         return ContextUtils.getApplicationContext().getSharedPreferences(name, mode);
     }
-
-    // Note that we do not need to (and can't) override getSystemService(Class<T>) as internally
-    // that just gets the name of the Service and calls getSystemService(String) for backwards
-    // compatibility with overrides like this one.
-    @Override
-    public Object getSystemService(String name) {
-        Object service = super.getSystemService(name);
-        if (mServiceTracingProxyProvider != null) {
-            mServiceTracingProxyProvider.traceSystemServices();
-        }
-        return service;
-    }
 }
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 47f0766..83d92d9 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
@@ -127,7 +127,6 @@
 import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponentFactory;
 import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponentSupplier;
 import org.chromium.chrome.browser.layouts.LayoutManagerAppUtils;
-import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.browser.locale.LocaleManager;
 import org.chromium.chrome.browser.media.FullscreenVideoPictureInPictureController;
 import org.chromium.chrome.browser.metrics.ActivityTabStartupMetricsTracker;
@@ -997,27 +996,16 @@
         maybeRemoveWindowBackground();
 
         Tab tab = getActivityTab();
-
-        if (mLayoutManagerSupplier.get() != null) {
-            @LayoutType
-            int activeLayoutType = mLayoutManagerSupplier.get().getActiveLayoutType();
-
-            // Only show the tab when overview (start surface and tab switcher layout) is not shown.
-            if (activeLayoutType != LayoutType.START_SURFACE
-                    && activeLayoutType != LayoutType.TAB_SWITCHER) {
-                if (tab != null) {
-                    if (tab.isHidden()) {
-                        tab.show(TabSelectionType.FROM_USER,
-                                LoadIfNeededCaller.ON_ACTIVITY_SHOWN_THEN_SHOW);
-                    } else {
-                        // The visible Tab's renderer process may have died after the activity was
-                        // paused. Ensure that it's restored appropriately.
-                        tab.loadIfNeeded(LoadIfNeededCaller.ON_ACTIVITY_SHOWN);
-                    }
-                }
+        if (tab != null) {
+            if (tab.isHidden()) {
+                tab.show(
+                        TabSelectionType.FROM_USER, LoadIfNeededCaller.ON_ACTIVITY_SHOWN_THEN_SHOW);
+            } else {
+                // The visible Tab's renderer process may have died after the activity was
+                // paused. Ensure that it's restored appropriately.
+                tab.loadIfNeeded(LoadIfNeededCaller.ON_ACTIVITY_SHOWN);
             }
         }
-
         VrModuleProvider.getDelegate().onActivityShown(this);
 
         MultiWindowUtils.getInstance().recordMultiWindowStateUkm(this, tab);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
index ff2c9546..0f09e99 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -213,7 +213,8 @@
         }
 
         if (!ReturnToChromeUtil.isTabSwitcherOnlyRefactorEnabled(mContext)
-                && startSurfaceSupplier != null) {
+                && startSurfaceSupplier != null
+                && ReturnToChromeUtil.isStartSurfaceEnabled(mContext)) {
             mStartSurfaceSupplier = startSurfaceSupplier;
             startSurfaceSupplier.onAvailable(mCallbackController.makeCancelable((startSurface) -> {
                 mStartSurfaceState = startSurface.getStartSurfaceState();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/ServiceTracingProxyProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/base/ServiceTracingProxyProvider.java
deleted file mode 100644
index e74d529..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/base/ServiceTracingProxyProvider.java
+++ /dev/null
@@ -1,290 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.chrome.browser.base;
-
-import android.annotation.SuppressLint;
-import android.app.ActivityManager;
-import android.app.NotificationManager;
-import android.content.Context;
-import android.hardware.display.DisplayManager;
-import android.media.AudioManager;
-import android.media.MediaRouter;
-import android.os.Build;
-import android.os.IInterface;
-import android.os.SystemClock;
-import android.telephony.TelephonyManager;
-
-import androidx.annotation.Nullable;
-
-import org.chromium.base.Log;
-import org.chromium.base.ThreadUtils;
-import org.chromium.base.TraceEvent;
-import org.chromium.components.version_info.Channel;
-import org.chromium.components.version_info.VersionConstants;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Proxy;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * Proxies IInterfaces for System Services to add trace events for slow IPCs.
- *
- * TODO(https://crbug.com/1339984): Support tracing system services cached in StaticServiceFetchers.
- * Right now we only support services cached per-context in CachedServiceFetchers.
- */
-public class ServiceTracingProxyProvider {
-    private static final String TAG = "TracingProxyProvider";
-
-    // Don't trace events that are too short to avoid spamming traces.
-    private static final long MINIMUM_IPC_TRACE_DURATION_MS = 2;
-    private static final String TRACE_FAILED = "Failed to trace IPCs: ";
-    private static final String PROXY_PREP_FAILED = "Failed to prepare service for proxying: ";
-
-    // Used to defeat Android's hidden API blocklist. I would tell you why it works, but the
-    // truth is I don't know. Something to do with the calling class being loaded by the
-    // boot classloader and double reflection.
-    private static final Method sGetDeclaredMethod;
-    private static final Method sGetMethod;
-    private static final Method sGetDeclaredField;
-    private static final Method sGetField;
-    static {
-        try {
-            sGetDeclaredMethod =
-                    Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);
-            sGetMethod = Class.class.getDeclaredMethod("getMethod", String.class, Class[].class);
-            sGetDeclaredField = Class.class.getDeclaredMethod("getDeclaredField", String.class);
-            sGetField = Class.class.getDeclaredMethod("getField", String.class);
-        } catch (Throwable e) {
-            // These methods should always exist.
-            throw new RuntimeException(e);
-        }
-    }
-
-    private static final class IPCListener implements InvocationHandler {
-        private final Object mSystemImpl;
-
-        public IPCListener(Object systemImpl) {
-            mSystemImpl = systemImpl;
-        }
-
-        @Override
-        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-            if (!ThreadUtils.runningOnUiThread()) return method.invoke(mSystemImpl, args);
-
-            long start = SystemClock.elapsedRealtime();
-            Object result = method.invoke(mSystemImpl, args);
-            long durationMs = SystemClock.elapsedRealtime() - start;
-
-            if (durationMs >= MINIMUM_IPC_TRACE_DURATION_MS) {
-                TraceEvent.instantAndroidIPC(
-                        mSystemImpl.getClass().getName() + "#" + method.getName(), durationMs);
-            }
-            return result;
-        }
-    }
-
-    // DO NOT MODIFY THIS ARRAY. This is a reference to the service cache in ContextImpl.
-    private Object[] mServiceCache;
-    // Same length as |mServiceCache|, true if the corresponding service has been proxied.
-    AtomicBoolean[] mServiceCacheProxied;
-
-    private Context mUnwrappedBaseContext;
-
-    private static boolean isEnabled() {
-        // A lot of service bindings were uncached pre-R, so easier to start tracing at R+.
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) return false;
-
-        // TODO(https://crbug.com/1339984): Enable for Beta once this has time to stabilize on
-        // Canary/Dev.
-        if (VersionConstants.CHANNEL > Channel.DEV) return false;
-
-        // static init failed.
-        if (sGetDeclaredMethod == null) return false;
-        return true;
-    }
-
-    /**
-     * @param unwrappedBaseContext The base context for an Application/Activity.
-     */
-    public static @Nullable ServiceTracingProxyProvider create(Context unwrappedBaseContext) {
-        if (!isEnabled()) return null;
-        return new ServiceTracingProxyProvider(unwrappedBaseContext);
-    }
-
-    private ServiceTracingProxyProvider(Context unwrappedBaseContext) {
-        assert unwrappedBaseContext.getClass().getName().equals("android.app.ContextImpl");
-        mUnwrappedBaseContext = unwrappedBaseContext;
-        try {
-            mServiceCache = (Object[]) getField(
-                    mUnwrappedBaseContext, mUnwrappedBaseContext.getClass(), "mServiceCache");
-            mServiceCacheProxied = new AtomicBoolean[mServiceCache.length];
-            for (int i = 0; i < mServiceCacheProxied.length; ++i) {
-                mServiceCacheProxied[i] = new AtomicBoolean(false);
-            }
-        } catch (Throwable throwable) {
-            Log.d(TAG, TRACE_FAILED, throwable);
-            mServiceCache = new Object[0];
-        }
-    }
-
-    public void traceSystemServices() {
-        for (int i = 0; i < mServiceCache.length; ++i) {
-            if (mServiceCache[i] != null && !mServiceCacheProxied[i].get()) {
-                traceService(mUnwrappedBaseContext, mServiceCache[i], mServiceCacheProxied[i]);
-            }
-        }
-    }
-
-    private static synchronized void traceService(
-            Context context, Object service, AtomicBoolean serviceCacheProxied) {
-        if (serviceCacheProxied.get()) return;
-        try {
-            Log.d(TAG, "Attempting to proxy " + service.getClass().getName());
-            service = prepareServiceForProxying(service);
-        } catch (Throwable throwable) {
-            Log.d(TAG, PROXY_PREP_FAILED, throwable);
-        }
-        proxyService(context, service);
-        serviceCacheProxied.set(true);
-    }
-
-    // Most services just store their interfaces as members in the service class, but some store
-    // them in harder to find places, or don't initialize them at creation time.
-    private static Object prepareServiceForProxying(Object service) throws Throwable {
-        if (service.getClass().equals(DisplayManager.class)) {
-            // Class defers to DisplayManagerGlobal.
-            Class clazz = Class.forName("android.hardware.display.DisplayManagerGlobal");
-            return callNoArgMethod(null, clazz, "getInstance");
-        }
-        if (service.getClass().getName().equals("android.view.WindowManagerImpl")) {
-            // Class defers to WindowManagerGlobal.
-            Class clazz = Class.forName("android.view.WindowManagerGlobal");
-            Object managerGlobal = callNoArgMethod(null, clazz, "getInstance");
-            // Static service is unpopulated until used.
-            callNoArgMethod(null, managerGlobal.getClass(), "getWindowManagerService");
-            return managerGlobal;
-        }
-        if (service.getClass().equals(ActivityManager.class)) {
-            // Service is stored in static singleton.
-            Object singletonInstance =
-                    getField(null, service.getClass(), "IActivityManagerSingleton");
-            callNoArgMethod(singletonInstance, singletonInstance.getClass(), "get");
-            return singletonInstance;
-        }
-        if (service.getClass().equals(NotificationManager.class)) {
-            // Service member is unpopulated until used.
-            callNoArgMethod(null, service.getClass(), "getService");
-            return service;
-        }
-        if (service.getClass().equals(TelephonyManager.class)) {
-            // Service member is unpopulated until used.
-            try {
-                callNoArgMethod(null, service.getClass(), "getSubscriberInfoService");
-            } catch (Throwable e) {
-                Log.d(TAG, PROXY_PREP_FAILED, e);
-            }
-            try {
-                callNoArgMethod(null, service.getClass(), "getSubscriptionService");
-            } catch (Throwable e) {
-                Log.d(TAG, PROXY_PREP_FAILED, e);
-            }
-            try {
-                callNoArgMethod(null, service.getClass(), "getSmsService");
-            } catch (Throwable e) {
-                Log.d(TAG, PROXY_PREP_FAILED, e);
-            }
-            try {
-                callNoArgMethod(service, service.getClass(), "getITelephony");
-            } catch (Throwable e) {
-                Log.d(TAG, PROXY_PREP_FAILED, e);
-            }
-            return service;
-        }
-        if (service.getClass().equals(MediaRouter.class)) {
-            // Service is stored in static singleton.
-            return getField(null, service.getClass(), "sStatic");
-        }
-        if (service.getClass().equals(AudioManager.class)) {
-            // Static service is unpopulated until used.
-            callNoArgMethod(null, service.getClass(), "getService");
-            return service;
-        }
-        return service;
-    }
-
-    private static Object callNoArgMethod(Object instance, Class<?> clazz, String methodName)
-            throws Exception {
-        Method method;
-        try {
-            method = (Method) sGetDeclaredMethod.invoke(clazz, methodName, null);
-        } catch (Throwable e) {
-            method = (Method) sGetMethod.invoke(clazz, methodName, null);
-        }
-        method.setAccessible(true);
-        return method.invoke(instance);
-    }
-
-    private static Object getField(Object instance, Class<?> clazz, String fieldName)
-            throws Exception {
-        Field field;
-        try {
-            field = (Field) sGetDeclaredField.invoke(clazz, fieldName);
-        } catch (Throwable e) {
-            field = (Field) sGetField.invoke(clazz, fieldName);
-        }
-        field.setAccessible(true);
-        return field.get(instance);
-    }
-
-    @SuppressLint("NewApi") // Class requires API level 30.
-    private static void proxyService(Context context, Object service) {
-        try {
-            // Search through the class's fields to find Interfaces for Binders.
-            Field[] fields = service.getClass().getDeclaredFields();
-            // For generic classes like Singleton<? implements IInterface> we need to get the
-            // fields from the superclass. Note that if the types are defined on the class itself
-            // and not the superclass, it's impossible to get them.
-            boolean isGenericClass =
-                    service.getClass().getGenericSuperclass() instanceof ParameterizedType;
-            // For simplicity, only check the first generic type.
-            String genericTypeName = "";
-            if (isGenericClass) {
-                fields = service.getClass().getSuperclass().getDeclaredFields();
-                genericTypeName =
-                        service.getClass().getSuperclass().getTypeParameters()[0].getName();
-            }
-            for (Field field : fields) {
-                field.setAccessible(true);
-                Class<?> type;
-                if (isGenericClass) {
-                    if (!field.getGenericType().getTypeName().equals(genericTypeName)) continue;
-                    type = (Class<?>) ((ParameterizedType) service.getClass()
-                                               .getGenericSuperclass())
-                                   .getActualTypeArguments()[0];
-                } else {
-                    type = field.getType();
-                }
-                if (IInterface.class.isAssignableFrom(type) && type.isInterface()) {
-                    Object impl = field.get(service);
-                    if (impl == null) {
-                        Log.d(TAG, TRACE_FAILED + type.toString() + " is null");
-                        continue;
-                    }
-                    // Avoid double-proxying for shared/static bindings.
-                    if (Proxy.isProxyClass(impl.getClass())) continue;
-                    Object listener = Proxy.newProxyInstance(
-                            context.getClassLoader(), new Class<?>[] {type}, new IPCListener(impl));
-                    field.set(service, listener);
-                    Log.d(TAG, "Tracing Proxy installed on: " + type.toString());
-                }
-            }
-        } catch (Throwable throwable) {
-            Log.d(TAG, TRACE_FAILED, throwable);
-        }
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
index 903a937..33d6c64 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
@@ -1,4 +1,4 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -66,7 +66,6 @@
 
     private Supplier<Impl> mImplSupplier;
     private Impl mImpl;
-    private ServiceTracingProxyProvider mServiceTracingProxyProvider;
 
     /**
      * Holds the implementation of application logic. Will be called by {@link
@@ -131,8 +130,6 @@
 
         if (isBrowserProcess) {
             UmaUtils.recordMainEntryPointTime();
-            // Register Service tracing early as some services are used below in this function.
-            mServiceTracingProxyProvider = ServiceTracingProxyProvider.create(context);
             // *** The Application Context should not be used before the locale override is set ***
             if (GlobalAppLocaleController.getInstance().init(context)) {
                 // If the app locale override preference is set, create a new override
@@ -261,18 +258,6 @@
         getImpl().startActivity(intent, options);
     }
 
-    // Note that we do not need to (and can't) override getSystemService(Class<T>) as internally
-    // that just gets the name of the Service and calls getSystemService(String) for backwards
-    // compatibility with overrides like this one.
-    @Override
-    public Object getSystemService(String name) {
-        Object service = super.getSystemService(name);
-        if (mServiceTracingProxyProvider != null) {
-            mServiceTracingProxyProvider.traceSystemServices();
-        }
-        return service;
-    }
-
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuUtils.java
index 14e7b04..312ce19 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuUtils.java
@@ -7,7 +7,6 @@
 import android.text.TextUtils;
 import android.webkit.URLUtil;
 
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.components.embedder_support.contextmenu.ContextMenuParams;
 import org.chromium.content_public.browser.ContentFeatureList;
 import org.chromium.content_public.common.ContentFeatures;
@@ -54,7 +53,6 @@
 
     /** Whether to force using popup style for context menu. */
     static boolean forcePopupStyleEnabled() {
-        return ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE)
-                || ContentFeatureList.isEnabled(ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU);
+        return ContentFeatureList.isEnabled(ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
index 9d2893ba..8ee4b85 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
@@ -154,8 +154,12 @@
 
         mRootView = new FrameLayout(mActivity);
 
+        boolean historyClustersPrefIsManaged =
+                mPrefService.isManagedPreference(HISTORY_CLUSTERS_VISIBLE_PREF);
         boolean historyClustersEnabled =
-                ChromeFeatureList.isEnabled(ChromeFeatureList.HISTORY_JOURNEYS);
+                ChromeFeatureList.isEnabled(ChromeFeatureList.HISTORY_JOURNEYS)
+                && !(historyClustersPrefIsManaged
+                        && !mPrefService.getBoolean(HISTORY_CLUSTERS_VISIBLE_PREF));
         if (historyClustersEnabled) {
             HistoryClustersDelegate historyClustersDelegate = new HistoryClustersDelegate() {
                 @Override
@@ -316,6 +320,11 @@
                     .setTitle(historyClustersVisible
                                     ? R.string.history_clusters_disable_menu_item_label
                                     : R.string.history_clusters_enable_menu_item_label);
+            // In the unlikely event history clusters is force enabled by policy, remove the menu
+            // option to turn it off.
+            if (historyClustersPrefIsManaged) {
+                mToolbar.getMenu().removeItem(R.id.optout_menu_id);
+            }
         } else {
             mToolbar.getMenu().removeItem(R.id.optout_menu_id);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java
index 2846fe4..1be25235 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java
@@ -12,7 +12,6 @@
 import org.chromium.base.CallbackController;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.OneshotSupplier;
-import org.chromium.base.supplier.Supplier;
 import org.chromium.cc.input.BrowserControlsState;
 import org.chromium.chrome.browser.ActivityTabProvider;
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
@@ -26,7 +25,6 @@
 import org.chromium.chrome.browser.omnibox.UrlFocusChangeListener;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabBrowserControlsConstraintsHelper;
-import org.chromium.chrome.features.start_surface.StartSurface;
 import org.chromium.components.messages.ManagedMessageDispatcher;
 import org.chromium.components.messages.MessageQueueDelegate;
 import org.chromium.ui.modaldialog.ModalDialogManager;
@@ -46,7 +44,7 @@
     private MessageContainerCoordinator mContainerCoordinator;
     private BrowserControlsManager mBrowserControlsManager;
     private int mBrowserControlsToken = TokenHolder.INVALID_TOKEN;
-    private final BrowserControlsObserver mBrowserControlsObserver;
+    private BrowserControlsObserver mBrowserControlsObserver;
     @Nullable
     private LayoutStateProvider mLayoutStateProvider;
     @Nullable
@@ -57,10 +55,26 @@
     private final CallbackController mCallbackController = new CallbackController();
     private int mUrlFocusToken = TokenHolder.INVALID_TOKEN;
     private Handler mQueueHandler;
-    private final Supplier<StartSurface> mStartSurfaceSupplier;
 
-    private final LayoutAndStartSurfaceObserver mLayoutAndStartSurfaceObserver =
-            new LayoutAndStartSurfaceObserver();
+    private LayoutStateObserver mLayoutStateObserver = new LayoutStateObserver() {
+        private int mToken = TokenHolder.INVALID_TOKEN;
+
+        // Suspend the queue until browsing mode is visible.
+        @Override
+        public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) {
+            if (mToken == TokenHolder.INVALID_TOKEN && layoutType != LayoutType.BROWSING) {
+                mToken = suspendQueue();
+            }
+        }
+
+        @Override
+        public void onFinishedShowing(@LayoutType int layoutType) {
+            if (mToken != TokenHolder.INVALID_TOKEN && layoutType == LayoutType.BROWSING) {
+                resumeQueue(mToken);
+                mToken = TokenHolder.INVALID_TOKEN;
+            }
+        }
+    };
 
     private ModalDialogManagerObserver mModalDialogManagerObserver =
             new ModalDialogManagerObserver() {
@@ -68,14 +82,14 @@
 
                 @Override
                 public void onDialogAdded(PropertyModel model) {
-                    if (!isTokenValid(mToken)) {
+                    if (mToken == TokenHolder.INVALID_TOKEN) {
                         mToken = suspendQueue();
                     }
                 }
 
                 @Override
                 public void onLastDialogDismissed() {
-                    if (isTokenValid(mToken)) {
+                    if (mToken != TokenHolder.INVALID_TOKEN) {
                         resumeQueue(mToken);
                         mToken = TokenHolder.INVALID_TOKEN;
                     }
@@ -88,14 +102,14 @@
 
                 @Override
                 public void onPauseWithNative() {
-                    if (!isTokenValid(mToken)) {
+                    if (mToken == TokenHolder.INVALID_TOKEN) {
                         mToken = suspendQueue();
                     }
                 }
 
                 @Override
                 public void onResumeWithNative() {
-                    if (isTokenValid(mToken)) {
+                    if (mToken != TokenHolder.INVALID_TOKEN) {
                         resumeQueue(mToken);
                         mToken = TokenHolder.INVALID_TOKEN;
                     }
@@ -110,7 +124,6 @@
      * @param layoutStateProviderOneShotSupplier Supplier of the {@link LayoutStateProvider}.
      * @param modalDialogManagerSupplier Supplier of the {@link ModalDialogManager}.
      * @param activityLifecycleDispatcher The dispatcher of activity life cycles.
-     * @param startSurfaceSupplier The supplier of {@link StartSurface}.
      * @param messageDispatcher The {@link ManagedMessageDispatcher} able to suspend/resume queue.
      */
     public ChromeMessageQueueMediator(BrowserControlsManager browserControlsManager,
@@ -119,13 +132,11 @@
             OneshotSupplier<LayoutStateProvider> layoutStateProviderOneShotSupplier,
             ObservableSupplier<ModalDialogManager> modalDialogManagerSupplier,
             ActivityLifecycleDispatcher activityLifecycleDispatcher,
-            OneshotSupplier<StartSurface> startSurfaceSupplier,
             ManagedMessageDispatcher messageDispatcher) {
         mBrowserControlsManager = browserControlsManager;
         mContainerCoordinator = messageContainerCoordinator;
         mQueueController = messageDispatcher;
         mActivityTabProvider = activityTabProvider;
-        mStartSurfaceSupplier = startSurfaceSupplier;
         mBrowserControlsObserver = new BrowserControlsObserver();
         mBrowserControlsManager.addObserver(mBrowserControlsObserver);
         layoutStateProviderOneShotSupplier.onAvailable(
@@ -141,9 +152,6 @@
         mActivityLifecycleDispatcher = null;
         mCallbackController.destroy();
         mBrowserControlsManager.removeObserver(mBrowserControlsObserver);
-        if (mStartSurfaceSupplier.hasValue()) {
-            mStartSurfaceSupplier.get().removeStateChangeObserver(mLayoutAndStartSurfaceObserver);
-        }
         setLayoutStateProvider(null);
         setModalDialogManager(null);
         mActivityTabProvider = null;
@@ -204,7 +212,7 @@
      */
     private void setLayoutStateProvider(LayoutStateProvider layoutStateProvider) {
         if (mLayoutStateProvider != null) {
-            mLayoutStateProvider.removeObserver(mLayoutAndStartSurfaceObserver);
+            mLayoutStateProvider.removeObserver(mLayoutStateObserver);
         }
         mLayoutStateProvider = layoutStateProvider;
         if (layoutStateProvider == null) return;
@@ -214,7 +222,7 @@
         if (mQueueController == null) {
             throw new IllegalStateException("setLayoutStateProvider() is called after destroy()");
         }
-        mLayoutStateProvider.addObserver(mLayoutAndStartSurfaceObserver);
+        mLayoutStateProvider.addObserver(mLayoutStateObserver);
     }
 
     private void setModalDialogManager(ModalDialogManager modalDialogManager) {
@@ -226,19 +234,10 @@
         mModalDialogManager.addObserver(mModalDialogManagerObserver);
     }
 
-    private boolean isStartSurfaceShowing() {
-        return mStartSurfaceSupplier.hasValue()
-                && mStartSurfaceSupplier.get().isShowingStartSurfaceHomepage();
-    }
-
-    private boolean isTokenValid(int token) {
-        return token != TokenHolder.INVALID_TOKEN;
-    }
-
     @Override
     public void onUrlFocusChange(boolean hasFocus) {
         if (hasFocus) {
-            if (!isTokenValid(mUrlFocusToken)) {
+            if (mUrlFocusToken == TokenHolder.INVALID_TOKEN) {
                 mUrlFocusToken = suspendQueue();
             }
             mQueueHandler.removeCallbacksAndMessages(null);
@@ -274,52 +273,6 @@
         }
     }
 
-    class LayoutAndStartSurfaceObserver implements StartSurface.StateObserver, LayoutStateObserver {
-        private int mToken = TokenHolder.INVALID_TOKEN;
-        // This observer only handles the cases switching between Start surface homepage and grid
-        // tab switcher surface.
-        @Override
-        public void onStateChanged(int startSurfaceState, boolean shouldShowTabSwitcherToolbar) {
-            if (mLayoutStateProvider.getActiveLayoutType() != LayoutType.TAB_SWITCHER) return;
-            if (isStartSurfaceShowing() && isTokenValid(mToken)) {
-                resumeQueue(mToken);
-                mToken = TokenHolder.INVALID_TOKEN;
-            } else if (!isStartSurfaceShowing() && !isTokenValid(mToken)) {
-                mToken = suspendQueue();
-            }
-        }
-
-        @Override
-        public void onFinishedShowing(int layoutType) {
-            if (isTokenValid(mToken) && layoutType == LayoutType.BROWSING) {
-                resumeQueue(mToken);
-                mToken = TokenHolder.INVALID_TOKEN;
-            }
-            if (layoutType != LayoutType.TAB_SWITCHER && mStartSurfaceSupplier.hasValue()) {
-                mStartSurfaceSupplier.get().removeStateChangeObserver(this);
-            }
-        }
-        // Suspend the queue until browsing mode is visible.
-        @Override
-        public void onStartedShowing(@LayoutType int layoutType, boolean showToolbar) {
-            // TODO(https://crbug.com/1315679): remove #isStartSurfaceShowing and use
-            //  `layoutType != LayoutType.StartSurface` after StartSurface is
-            //  decoupled from "LayoutType.TabSwitcher".
-            if (!isTokenValid(mToken) && layoutType != LayoutType.BROWSING) {
-                if (layoutType == LayoutType.TAB_SWITCHER) { // This might be start surface.
-                    if (!isStartSurfaceShowing()) {
-                        mToken = suspendQueue();
-                    }
-                    if (mStartSurfaceSupplier.hasValue()) {
-                        mStartSurfaceSupplier.get().addStateChangeObserver(this);
-                    }
-                } else {
-                    mToken = suspendQueue();
-                }
-            }
-        }
-    }
-
     @VisibleForTesting
     void setQueueHandlerForTesting(Handler handler) {
         mQueueHandler = handler;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java
index 496dbbd2..48f1352 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarButtonInProductHelpController.java
@@ -32,6 +32,7 @@
 import org.chromium.chrome.browser.tab.CurrentTabObserver;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarFeatures;
 import org.chromium.chrome.browser.translate.TranslateBridge;
 import org.chromium.chrome.browser.translate.TranslateUtils;
 import org.chromium.chrome.browser.ui.appmenu.AppMenuCoordinator;
@@ -154,7 +155,8 @@
      */
     private void showPriceTrackingIPH(Tab tab) {
         if (!ShoppingFeatures.isShoppingListEnabled()
-                || !PowerBookmarkUtils.isPriceTrackingEligible(tab)) {
+                || !PowerBookmarkUtils.isPriceTrackingEligible(tab)
+                || AdaptiveToolbarFeatures.isContextualPageActionUiEnabled()) {
             return;
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
index d117b71..398ab2d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -110,7 +110,6 @@
 import org.chromium.chrome.browser.tab.AutofillSessionLifetimeController;
 import org.chromium.chrome.browser.tab.RequestDesktopUtils;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tab.TabHidingType;
 import org.chromium.chrome.browser.tab.TabLaunchType;
 import org.chromium.chrome.browser.tab.TabObscuringHandler;
 import org.chromium.chrome.browser.tab.TabObscuringHandlerSupplier;
@@ -776,7 +775,7 @@
             mMessageQueueMediator = new ChromeMessageQueueMediator(mBrowserControlsManager,
                     mMessageContainerCoordinator, mActivityTabProvider,
                     mLayoutStateProviderOneShotSupplier, mModalDialogManagerSupplier,
-                    mActivityLifecycleDispatcher, mStartSurfaceSupplier, mMessageDispatcher);
+                    mActivityLifecycleDispatcher, mMessageDispatcher);
             mMessageDispatcher.setDelegate(mMessageQueueMediator);
             MessagesFactory.attachMessageDispatcher(mWindowAndroid, mMessageDispatcher);
         }
@@ -1235,17 +1234,10 @@
                     }
                 }
 
-                if (layoutType == LayoutType.TAB_SWITCHER
-                        || layoutType == LayoutType.START_SURFACE) {
+                if (layoutType == LayoutType.TAB_SWITCHER) {
                     // Hide find toolbar and app menu.
                     if (mFindToolbarManager != null) mFindToolbarManager.hideToolbar();
                     hideAppMenu();
-
-                    // Hide current tab
-                    Tab currentTab = mTabModelSelectorSupplier.get().getCurrentTab();
-                    if (currentTab != null) {
-                        currentTab.hide(TabHidingType.OVERVIEW_SHOWN);
-                    }
                 }
             }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java
index d3e75e3..3a79c8e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java
@@ -22,10 +22,10 @@
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.layouts.LayoutTestUtils;
 import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ChromeTabUtils;
@@ -88,7 +88,7 @@
         assertFalse("Tab should not be interactable.", mTab.isUserInteractable());
 
         // Exit tab switcher and wait for event again.
-        TabUiTestHelper.clickFirstCardFromTabSwitcher(mActivity);
+        LayoutTestUtils.startShowingAndWaitForLayout(layoutManager, LayoutType.BROWSING, false);
 
         interactabilityHelper.waitForCallback(interactableCallCount);
         assertTrue("Tab should be interactable.", mTab.isUserInteractable());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/VirtualKeyboardResizeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/VirtualKeyboardResizeTest.java
index 4059ce3..d4edf68 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/VirtualKeyboardResizeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/VirtualKeyboardResizeTest.java
@@ -139,10 +139,9 @@
         double keyboardHeight = getKeyboardHeightDp();
 
         // Use less than or equal since the keyboard may actually include accessories like the
-        // Autofill bar. Math.ceil and 1px delta to account for device scale factor rounding.
-        assertWaitForPageHeight(lessThanOrEqualTo((int) Math.ceil(initialHeight - keyboardHeight)));
-        assertWaitForVisualViewportHeight(
-                lessThanOrEqualTo(Math.ceil(initialHeight - keyboardHeight)));
+        // Autofill bar. +1px delta to account for device scale factor rounding.
+        assertWaitForPageHeight(lessThanOrEqualTo((int) (initialHeight - keyboardHeight + 1.0)));
+        assertWaitForVisualViewportHeight(lessThanOrEqualTo(initialHeight - keyboardHeight + 1.0));
 
         // Hide the OSK and ensure the state is correctly restored to the initial height.
         hideKeyboard();
@@ -171,9 +170,8 @@
         double keyboardHeight = getKeyboardHeightDp();
 
         // Use less than or equal since the keyboard may actually include accessories like the
-        // Autofill bar. Math.ceil and account for device scale factor rounding.
-        assertWaitForVisualViewportHeight(
-                lessThanOrEqualTo(Math.ceil(initialHeight - keyboardHeight)));
+        // Autofill bar. +1 to account for device scale factor rounding.
+        assertWaitForVisualViewportHeight(lessThanOrEqualTo(initialHeight - keyboardHeight + 1));
         assertWaitForPageHeight(Matchers.is(initialHeight));
 
         // Hide the OSK and ensure the state is correctly restored to the initial height.
@@ -201,10 +199,9 @@
         double keyboardHeight = getKeyboardHeightDp();
 
         // Use less than or equal since the keyboard may actually include accessories like the
-        // Autofill bar. Math.ceil and 1px delta to account for device scale factor rounding.
-        assertWaitForPageHeight(lessThanOrEqualTo((int) Math.ceil(initialHeight - keyboardHeight)));
-        assertWaitForVisualViewportHeight(
-                lessThanOrEqualTo(Math.ceil(initialHeight - keyboardHeight)));
+        // Autofill bar. +1px to account for device scale factor rounding.
+        assertWaitForPageHeight(lessThanOrEqualTo((int) (initialHeight - keyboardHeight + 1.0)));
+        assertWaitForVisualViewportHeight(lessThanOrEqualTo(initialHeight - keyboardHeight + 1.0));
 
         // Hide the OSK and ensure the state is correctly restored to the initial height.
         // InstrumentationRegistry.getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
index 5a5ea1c..0a74249 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
@@ -26,7 +26,6 @@
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.contextmenu.ContextMenuCoordinator.ListItemType;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -76,7 +75,6 @@
         super.setUpTest();
 
         mTestValues = new TestValues();
-        mTestValues.addFeatureFlagOverride(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE, false);
         mTestValues.addFeatureFlagOverride(ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU, false);
         FeatureList.setTestValues(mTestValues);
 
@@ -134,7 +132,7 @@
     @LargeTest
     @Feature({"RenderTest"})
     public void testContextMenuViewWithLink_Popup() throws IOException {
-        mTestValues.addFeatureFlagOverride(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE, true);
+        mTestValues.addFeatureFlagOverride(ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU, true);
         doTestContextMenuViewWithLink("context_menu_with_link_popup");
     }
 
@@ -149,7 +147,7 @@
     @LargeTest
     @Feature({"RenderTest"})
     public void testContextMenuViewWithImageLink_Popup() throws IOException {
-        mTestValues.addFeatureFlagOverride(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE, true);
+        mTestValues.addFeatureFlagOverride(ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU, true);
         doTestContextMenuViewWithImageLink("context_menu_with_image_link_popup");
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
index b454fa5..43ef946 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
@@ -63,6 +63,7 @@
 import org.chromium.content_public.browser.test.util.DOMUtils;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.content_public.browser.test.util.TestTouchUtils;
+import org.chromium.content_public.common.ContentFeatures;
 import org.chromium.net.test.EmbeddedTestServer;
 import org.chromium.ui.base.Clipboard;
 import org.chromium.ui.base.MenuSourceType;
@@ -268,7 +269,7 @@
     @MediumTest
     @Feature({"Browser"})
     @Features.EnableFeatures({ChromeFeatureList.CONTEXT_MENU_TRANSLATE_WITH_GOOGLE_LENS})
-    @Features.DisableFeatures({ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE})
+    @Features.DisableFeatures({ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU})
     public void testLensTranslateChipNotShowingIfNotEnabled() throws Throwable {
         // Required to avoid runtime error.
         Looper.prepare();
@@ -287,7 +288,7 @@
     @Test
     @MediumTest
     @Feature({"Browser"})
-    @Features.DisableFeatures({ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE})
+    @Features.DisableFeatures({ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU})
     public void testSelectLensTranslateChip() throws Throwable {
         // Required to avoid runtime error.
         Looper.prepare();
@@ -316,7 +317,7 @@
     @MediumTest
     @Feature({"Browser"})
     @Features.EnableFeatures({ChromeFeatureList.CONTEXT_MENU_TRANSLATE_WITH_GOOGLE_LENS})
-    @Features.DisableFeatures({ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE})
+    @Features.DisableFeatures({ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU})
     public void testLensChipNotShowingAfterMenuDismissed() throws Throwable {
         // Required to avoid runtime error.
         Looper.prepare();
@@ -346,7 +347,7 @@
     @Test
     @MediumTest
     @Features.EnableFeatures({ChromeFeatureList.CONTEXT_MENU_TRANSLATE_WITH_GOOGLE_LENS})
-    @Features.DisableFeatures({ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE})
+    @Features.DisableFeatures({ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU})
     public void testDismissContextMenuOnClickLensTranslateChipEnabled() throws TimeoutException {
         // Required to avoid runtime error.
         Looper.prepare();
@@ -373,7 +374,7 @@
     @MediumTest
     @Feature({"Browser"})
     @Features.EnableFeatures({ChromeFeatureList.CONTEXT_MENU_GOOGLE_LENS_CHIP})
-    @Features.DisableFeatures({ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE})
+    @Features.DisableFeatures({ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU})
     public void testLensShoppingChipNotShowingIfNotEnabled() throws Throwable {
         // Required to avoid runtime error.
         Looper.prepare();
@@ -392,7 +393,7 @@
     @Test
     @MediumTest
     @Feature({"Browser"})
-    @Features.DisableFeatures({ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE})
+    @Features.DisableFeatures({ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU})
     public void testSelectLensShoppingChip() throws Throwable {
         // Required to avoid runtime error.
         Looper.prepare();
@@ -421,7 +422,7 @@
     // context menu.
     @Test
     @MediumTest
-    @Features.DisableFeatures({ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE})
+    @Features.DisableFeatures({ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU})
     public void testDismissContextMenuOnClickShoppingLensChipEnabled() throws TimeoutException {
         // Required to avoid runtime error.
         Looper.prepare();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/MediaCaptureOverlayControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ui/MediaCaptureOverlayControllerTest.java
index d961282..d17a6224 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ui/MediaCaptureOverlayControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ui/MediaCaptureOverlayControllerTest.java
@@ -25,7 +25,6 @@
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule;
@@ -109,11 +108,9 @@
                 () -> mActivity.getLayoutManager().showLayout(LayoutType.TAB_SWITCHER, false));
         waitForOverlayVisibility(false);
 
-        // Now hide the overview and assert that it becomes visible again. For hiding the overview,
-        // mActivity.getLayoutManager().showLayout(LayoutType.BROWSING) couldn't be used since it
-        // doesn't call tab#show, which calls #onInteractabilityChanged to update overlay
-        // visibility.
-        TabUiTestHelper.clickFirstCardFromTabSwitcher(mActivity);
+        // Now hide the overview and assert that it becomes visible again.
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> mActivity.getLayoutManager().showLayout(LayoutType.BROWSING, false));
         waitForOverlayVisibility(true);
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
index 19c1fcc..e745a5c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
@@ -42,7 +42,6 @@
 import org.chromium.chrome.browser.contextmenu.ChromeContextMenuItem.Item;
 import org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator.ContextMenuGroup;
 import org.chromium.chrome.browser.contextmenu.ContextMenuCoordinator.ListItemType;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserver;
 import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserver.PerformanceClass;
 import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserverJni;
@@ -70,8 +69,7 @@
  * Unit tests for the context menu. Use density=mdpi so the screen density is 1.
  */
 @RunWith(BaseRobolectricTestRunner.class)
-@Features.DisableFeatures(
-        {ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE, ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU})
+@Features.DisableFeatures(ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU)
 public class ContextMenuCoordinatorTest {
     private static final int TOP_CONTENT_OFFSET_PX = 17;
     /**
@@ -254,7 +252,7 @@
     }
 
     @Test
-    @Features.EnableFeatures(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE)
+    @Features.EnableFeatures(ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU)
     @Config(shadows = {ShadowContextMenuDialog.class}, qualifiers = "mdpi")
     public void testCreateContextMenuDialog_PopupStyle() {
         ContextMenuDialog dialog = createContextMenuDialogForTest(/*isPopup=*/true);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerUnitTest.java
index 1c562d7..4ece430d 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerUnitTest.java
@@ -327,7 +327,6 @@
         for (TabObserver observer : tabObservers) {
             observer.onHidden(env.tabProvider.getTab(), TabHidingType.CHANGED_TABS);
             observer.onHidden(env.tabProvider.getTab(), TabHidingType.REPARENTED);
-            observer.onHidden(env.tabProvider.getTab(), TabHidingType.OVERVIEW_SHOWN);
         }
         verify(env.connection, never()).notifyDidGetUserInteraction(eq(env.session), eq(false));
     }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/history/HistoryUITest.java b/chrome/android/junit/src/org/chromium/chrome/browser/history/HistoryUITest.java
index a68235c..56f72d9 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/history/HistoryUITest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/history/HistoryUITest.java
@@ -715,6 +715,23 @@
         Assert.assertEquals(3, headerGroup.size());
     }
 
+    @Test
+    @SmallTest
+    @EnableFeatures(ChromeFeatureList.HISTORY_JOURNEYS)
+    public void testJourneysDisabledByPolicy() {
+        doReturn(false).when(mPrefService).getBoolean(HistoryManager.HISTORY_CLUSTERS_VISIBLE_PREF);
+        doReturn(true)
+                .when(mPrefService)
+                .isManagedPreference(HistoryManager.HISTORY_CLUSTERS_VISIBLE_PREF);
+
+        mHistoryManager = new HistoryManager(mActivity, true, mSnackbarManager, false,
+                /* Supplier<Tab>= */ null, false, null, mHistoryProvider);
+
+        Assert.assertNull(mHistoryManager.getView().findViewById(R.id.history_toggle_tab_layout));
+        Assert.assertNull(
+                mHistoryManager.getToolbarForTests().getMenu().findItem(R.id.optout_menu_id));
+    }
+
     private void toggleItemSelection(int position) {
         final SelectableItemView<HistoryItem> itemView = getItemView(position);
         itemView.performLongClick();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java
index fc8b082..7df6ae5 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediatorTest.java
@@ -4,11 +4,8 @@
 
 package org.chromium.chrome.browser.messages;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -37,7 +34,6 @@
 import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.PauseResumeWithNativeObserver;
-import org.chromium.chrome.features.start_surface.StartSurface;
 import org.chromium.components.messages.ManagedMessageDispatcher;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogManagerObserver;
@@ -75,9 +71,6 @@
     private ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
 
     @Mock
-    private StartSurface mStartSurface;
-
-    @Mock
     private Handler mQueueHandler;
 
     private ChromeMessageQueueMediator mMediator;
@@ -93,12 +86,10 @@
                 new OneshotSupplierImpl<>();
         ObservableSupplierImpl<ModalDialogManager> modalDialogManagerSupplier =
                 new ObservableSupplierImpl<>();
-        OneshotSupplierImpl<StartSurface> mStartSurfaceSupplier = new OneshotSupplierImpl<>();
-        mStartSurfaceSupplier.set(mStartSurface);
         mMediator = new ChromeMessageQueueMediator(mBrowserControlsManager,
                 mMessageContainerCoordinator, mActivityTabProvider,
                 layoutStateProviderOneShotSupplier, modalDialogManagerSupplier,
-                mActivityLifecycleDispatcher, mStartSurfaceSupplier, mMessageDispatcher);
+                mActivityLifecycleDispatcher, mMessageDispatcher);
         layoutStateProviderOneShotSupplier.set(mLayoutStateProvider);
         modalDialogManagerSupplier.set(mModalDialogManager);
         mMediator.setQueueHandlerForTesting(mQueueHandler);
@@ -120,22 +111,6 @@
     }
 
     /**
-     * Test start surface does not suspend the message queue.
-     */
-    @Test
-    public void testLayoutStateChange_withStartSurface() {
-        final ArgumentCaptor<LayoutStateObserver> observer =
-                ArgumentCaptor.forClass(LayoutStateObserver.class);
-        doNothing().when(mLayoutStateProvider).addObserver(observer.capture());
-        when(mStartSurface.isShowingStartSurfaceHomepage()).thenReturn(true);
-        initMediator();
-        observer.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false);
-        verify(mMessageDispatcher, never()).suspend();
-        observer.getValue().onFinishedShowing(LayoutType.BROWSING);
-        verify(mMessageDispatcher, never()).resume(anyInt());
-    }
-
-    /**
      * Test the queue can be suspended and resumed correctly when showing/hiding modal dialogs.
      */
     @Test
@@ -175,7 +150,6 @@
                 new OneshotSupplierImpl<>();
         ObservableSupplierImpl<ModalDialogManager> modalDialogManagerSupplier =
                 new ObservableSupplierImpl<>();
-        OneshotSupplierImpl<StartSurface> mStartSurfaceSupplier = new OneshotSupplierImpl<>();
         final ArgumentCaptor<ChromeMessageQueueMediator.BrowserControlsObserver>
                 observerArgumentCaptor = ArgumentCaptor.forClass(
                         ChromeMessageQueueMediator.BrowserControlsObserver.class);
@@ -199,7 +173,7 @@
         mMediator = new ChromeMessageQueueMediator(mBrowserControlsManager,
                 mMessageContainerCoordinator, mActivityTabProvider,
                 layoutStateProviderOneShotSupplier, modalDialogManagerSupplier,
-                mActivityLifecycleDispatcher, mStartSurfaceSupplier, mMessageDispatcher);
+                mActivityLifecycleDispatcher, mMessageDispatcher);
         ChromeMessageQueueMediator.BrowserControlsObserver observer =
                 observerArgumentCaptor.getValue();
         Runnable runnable = () -> {};
@@ -220,11 +194,10 @@
                 new OneshotSupplierImpl<>();
         ObservableSupplierImpl<ModalDialogManager> modalDialogManagerSupplier =
                 new ObservableSupplierImpl<>();
-        OneshotSupplierImpl<StartSurface> mStartSurfaceSupplier = new OneshotSupplierImpl<>();
         mMediator = new ChromeMessageQueueMediator(mBrowserControlsManager,
                 mMessageContainerCoordinator, mActivityTabProvider,
                 layoutStateProviderOneShotSupplier, modalDialogManagerSupplier,
-                mActivityLifecycleDispatcher, mStartSurfaceSupplier, mMessageDispatcher);
+                mActivityLifecycleDispatcher, mMessageDispatcher);
         layoutStateProviderOneShotSupplier.set(mLayoutStateProvider);
         // To offer a null value, we have to offer a value other than null first.
         modalDialogManagerSupplier.set(mModalDialogManager);
@@ -251,38 +224,4 @@
         Assert.assertEquals("mUrlFocusToken should be invalidated.", TokenHolder.INVALID_TOKEN,
                 mMediator.getUrlFocusTokenForTesting());
     }
-
-    /**
-     * Test observers are removed when mediator is destroyed on tab switcher mode.
-     */
-    @Test
-    public void testDestroyOnTabSwitcher() {
-        final ArgumentCaptor<LayoutStateObserver> observer =
-                ArgumentCaptor.forClass(LayoutStateObserver.class);
-        final ArgumentCaptor<StartSurface.StateObserver> stateObserver =
-                ArgumentCaptor.forClass(StartSurface.StateObserver.class);
-        doNothing().when(mLayoutStateProvider).addObserver(observer.capture());
-        doNothing().when(mStartSurface).addStateChangeObserver(stateObserver.capture());
-        initMediator();
-        observer.getValue().onStartedShowing(LayoutType.TAB_SWITCHER, false);
-        mMediator.destroy();
-        verify(mLayoutStateProvider).removeObserver(observer.getValue());
-        verify(mStartSurface).removeStateChangeObserver(stateObserver.getValue());
-    }
-
-    /**
-     * Test observers are removed when mediator is destroyed on browsing mode.
-     */
-    @Test
-    public void testDestroyOnBrowsing() {
-        final ArgumentCaptor<LayoutStateObserver> observer =
-                ArgumentCaptor.forClass(LayoutStateObserver.class);
-        final ArgumentCaptor<StartSurface.StateObserver> stateObserver =
-                ArgumentCaptor.forClass(StartSurface.StateObserver.class);
-        doNothing().when(mLayoutStateProvider).addObserver(observer.capture());
-        initMediator();
-        mMediator.destroy();
-        verify(mLayoutStateProvider).removeObserver(observer.getValue());
-        verify(mStartSurface, never()).addStateChangeObserver(any());
-    }
 }
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd
index 6c52d44..3853bf0 100644
--- a/chrome/app/chromium_strings.grd
+++ b/chrome/app/chromium_strings.grd
@@ -1589,6 +1589,11 @@
           To make your browsing faster, Chromium reclaims memory from tabs you aren't using.
         </message>
       </if>
+
+      <!-- High Efficiency App Menu IPH strings-->
+      <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE" desc="The title for the high efficiency mode in-product promo bubble">
+        Make Chromium faster
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/chrome/app/chromium_strings_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE.png.sha1 b/chrome/app/chromium_strings_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE.png.sha1
new file mode 100644
index 0000000..2a0650d
--- /dev/null
+++ b/chrome/app/chromium_strings_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE.png.sha1
@@ -0,0 +1 @@
+d387bb90b863d28c52629e8501ef253f9eea2901
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 10efba5..2b49ff3aa 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -7552,6 +7552,12 @@
       <message name="IDS_HIGH_EFFICIENCY_INFO_MODE_PROMO_ACTION_TEXT" desc="The custom action button text for the high efficiency info mode in-product promo bubble.">
         Settings
       </message>
+      <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_TEXT" desc="The text shown for the high efficiency mode in-product promo bubble">
+        Memory Saver can reclaim memory from inactive tabs. This frees up your computer's resources for other tasks.
+      </message>
+      <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_ACTION_TEXT" desc="The custom action button text for the high efficiency mode in-product promo bubble">
+        Turn on
+      </message>
 
       <!-- User Education Tutorial Strings -->
       <if expr="use_titlecase">
diff --git a/chrome/app/generated_resources_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_ACTION_TEXT.png.sha1 b/chrome/app/generated_resources_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_ACTION_TEXT.png.sha1
new file mode 100644
index 0000000..6dd20483
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_ACTION_TEXT.png.sha1
@@ -0,0 +1 @@
+3255ace96f8948b0d17ada229b7753108544f6e0
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_TEXT.png.sha1 b/chrome/app/generated_resources_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_TEXT.png.sha1
new file mode 100644
index 0000000..6dd20483
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_TEXT.png.sha1
@@ -0,0 +1 @@
+3255ace96f8948b0d17ada229b7753108544f6e0
\ No newline at end of file
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd
index 3703be6..64feb251e 100644
--- a/chrome/app/google_chrome_strings.grd
+++ b/chrome/app/google_chrome_strings.grd
@@ -1691,6 +1691,11 @@
           To make your browsing faster, Chrome reclaims memory from tabs you aren't using.
         </message>
       </if>
+
+      <!-- High Efficiency Chip App Menu IPH strings -->
+      <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE" desc="The title for the high efficiency mode in-product promo bubble">
+        Make Chrome faster
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/chrome/app/google_chrome_strings_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE.png.sha1 b/chrome/app/google_chrome_strings_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE.png.sha1
new file mode 100644
index 0000000..6dd20483
--- /dev/null
+++ b/chrome/app/google_chrome_strings_grd/IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE.png.sha1
@@ -0,0 +1 @@
+3255ace96f8948b0d17ada229b7753108544f6e0
\ No newline at end of file
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn
index 4fe85bc..294fcf2 100644
--- a/chrome/app/vector_icons/BUILD.gn
+++ b/chrome/app/vector_icons/BUILD.gn
@@ -22,7 +22,6 @@
     "autofill/webauthn_dialog_header.icon",
     "autofill/webauthn_dialog_header_dark.icon",
     "back_arrow_touch.icon",
-    "back_to_tab.icon",
     "backspace.icon",
     "battery_saver.icon",
     "blocked_redirect.icon",
@@ -160,6 +159,20 @@
     "user_menu_guest.icon",
     "user_menu_right_arrow.icon",
     "web.icon",
+    "webauthn/passkey_aoa.icon",
+    "webauthn/passkey_aoa_dark.icon",
+    "webauthn/passkey_error.icon",
+    "webauthn/passkey_error_bluetooth.icon",
+    "webauthn/passkey_error_bluetooth_dark.icon",
+    "webauthn/passkey_error_dark.icon",
+    "webauthn/passkey_fingerprint.icon",
+    "webauthn/passkey_fingerprint_dark.icon",
+    "webauthn/passkey_header.icon",
+    "webauthn/passkey_header_dark.icon",
+    "webauthn/passkey_phone.icon",
+    "webauthn/passkey_phone_dark.icon",
+    "webauthn/passkey_usb.icon",
+    "webauthn/passkey_usb_dark.icon",
     "webauthn/webauthn_aoa.icon",
     "webauthn/webauthn_error.icon",
     "webauthn/webauthn_error_bluetooth.icon",
diff --git a/chrome/app/vector_icons/webauthn/passkey_aoa.icon b/chrome/app/vector_icons/webauthn/passkey_aoa.icon
new file mode 100644
index 0000000..ba045620
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_aoa.icon
@@ -0,0 +1,146 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+STROKE, 2,
+MOVE_TO, 216, 69.5f,
+R_V_LINE_TO, 29.75f,
+R_ARC_TO, 6.75f, 6.75f, 0, 1, 0, 13.5f, 0,
+V_LINE_TO, 99,
+R_ARC_TO, 7, 7, 0, 0, 0, -7, -7,
+H_LINE_TO, 183,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+ROUND_RECT, 202, 8, 28, 58, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+STROKE, 2,
+ROUND_RECT, 202, 8, 28, 58, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+CIRCLE, 205, 11, 1,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+MOVE_TO, 210, 62,
+R_ARC_TO, 1, 1, 0, 0, 0, 1, 1,
+R_H_LINE_TO, 10,
+R_ARC_TO, 1, 1, 0, 0, 0, 0, -2,
+R_H_LINE_TO, -10,
+R_ARC_TO, 1, 1, 0, 0, 0, -1, 1,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 218, 67,
+R_H_LINE_TO, -4,
+R_V_LINE_TO, 4,
+R_H_LINE_TO, 4,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+MOVE_TO, 95, 83,
+R_ARC_TO, 4, 4, 0, 0, 0, 4, 4,
+R_H_LINE_TO, 78,
+R_ARC_TO, 4, 4, 0, 0, 0, 4, -4,
+V_LINE_TO, 31,
+R_ARC_TO, 4, 4, 0, 0, 0, -4, -4,
+H_LINE_TO, 99,
+R_ARC_TO, 4, 4, 0, 0, 0, -4, 4,
+R_V_LINE_TO, 52,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 177, 85,
+H_LINE_TO, 99,
+R_ARC_TO, 2, 2, 0, 0, 1, -2, -2,
+V_LINE_TO, 31,
+R_ARC_TO, 2, 2, 0, 0, 1, 2, -2,
+R_H_LINE_TO, 78,
+R_ARC_TO, 2, 2, 0, 0, 1, 2, 2,
+R_V_LINE_TO, 52,
+R_ARC_TO, 2, 2, 0, 0, 1, -2, 2,
+CLOSE,
+R_MOVE_TO, -78, 2,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, -4,
+V_LINE_TO, 31,
+R_ARC_TO, 4, 4, 0, 0, 1, 4, -4,
+R_H_LINE_TO, 78,
+R_ARC_TO, 4, 4, 0, 0, 1, 4, 4,
+R_V_LINE_TO, 52,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, 4,
+H_LINE_TO, 99,
+CLOSE,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 85, 90,
+R_H_LINE_TO, 106,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, 4,
+H_LINE_TO, 89,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, -4,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+CIRCLE, 138, 31, 1,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 277, 90, 1,
+CIRCLE, 281, 90, 1,
+CIRCLE, 273, 86, 1,
+CIRCLE, 277, 86, 1,
+CIRCLE, 285, 90, 1,
+CIRCLE, 41, 75, 1,
+CIRCLE, 281, 86, 1,
+CIRCLE, 45, 75, 1,
+CIRCLE, 37, 71, 1,
+CIRCLE, 273, 90, 1,
+CIRCLE, 269, 86, 1,
+CIRCLE, 41, 71, 1,
+CIRCLE, 49, 75, 1,
+CIRCLE, 45, 71, 1,
+CIRCLE, 21, 75, 1,
+CIRCLE, 37, 75, 1,
+CIRCLE, 25, 75, 1,
+CIRCLE, 29, 75, 1,
+CIRCLE, 33, 75, 1,
+CIRCLE, 33, 71, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 64, 49, 3,
+CIRCLE, 72, 49, 3,
+CIRCLE, 48, 49, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+MOVE_TO, 281, 66,
+R_ARC_TO, 3, 3, 0, 1, 0, -6, 0,
+R_ARC_TO, 3, 3, 0, 0, 0, 6, 0,
+CLOSE,
+R_MOVE_TO, -16, 0,
+R_ARC_TO, 3, 3, 0, 1, 0, -6, 0,
+R_ARC_TO, 3, 3, 0, 0, 0, 6, 0,
+CLOSE,
+R_MOVE_TO, -8, 0,
+R_ARC_TO, 3, 3, 0, 1, 0, -6, 0,
+R_ARC_TO, 3, 3, 0, 0, 0, 6, 0,
+CLOSE
diff --git a/chrome/app/vector_icons/webauthn/passkey_aoa_dark.icon b/chrome/app/vector_icons/webauthn/passkey_aoa_dark.icon
new file mode 100644
index 0000000..b004e03
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_aoa_dark.icon
@@ -0,0 +1,147 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+STROKE, 2,
+MOVE_TO, 216, 69.5f,
+R_V_LINE_TO, 29.75f,
+R_ARC_TO, 6.75f, 6.75f, 0, 1, 0, 13.5f, 0,
+V_LINE_TO, 99,
+R_ARC_TO, 7, 7, 0, 0, 0, -7, -7,
+H_LINE_TO, 183,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x3C, 0x40, 0x43,
+ROUND_RECT, 202, 8, 28, 58, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+STROKE, 2,
+ROUND_RECT, 202, 8, 28, 58, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+CIRCLE, 205, 11, 1,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+MOVE_TO, 210, 62,
+R_ARC_TO, 1, 1, 0, 0, 0, 1, 1,
+R_H_LINE_TO, 10,
+R_ARC_TO, 1, 1, 0, 0, 0, 0, -2,
+R_H_LINE_TO, -10,
+R_ARC_TO, 1, 1, 0, 0, 0, -1, 1,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 218, 67,
+R_H_LINE_TO, -4,
+R_V_LINE_TO, 4,
+R_H_LINE_TO, 4,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x3C, 0x40, 0x43,
+MOVE_TO, 95, 83,
+R_ARC_TO, 4, 4, 0, 0, 0, 4, 4,
+R_H_LINE_TO, 78,
+R_ARC_TO, 4, 4, 0, 0, 0, 4, -4,
+V_LINE_TO, 31,
+R_ARC_TO, 4, 4, 0, 0, 0, -4, -4,
+H_LINE_TO, 99,
+R_ARC_TO, 4, 4, 0, 0, 0, -4, 4,
+R_V_LINE_TO, 52,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 177, 85,
+H_LINE_TO, 99,
+R_ARC_TO, 2, 2, 0, 0, 1, -2, -2,
+V_LINE_TO, 31,
+R_ARC_TO, 2, 2, 0, 0, 1, 2, -2,
+R_H_LINE_TO, 78,
+R_ARC_TO, 2, 2, 0, 0, 1, 2, 2,
+R_V_LINE_TO, 52,
+R_ARC_TO, 2, 2, 0, 0, 1, -2, 2,
+CLOSE,
+R_MOVE_TO, -78, 2,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, -4,
+V_LINE_TO, 31,
+R_ARC_TO, 4, 4, 0, 0, 1, 4, -4,
+R_H_LINE_TO, 78,
+R_ARC_TO, 4, 4, 0, 0, 1, 4, 4,
+R_V_LINE_TO, 52,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, 4,
+H_LINE_TO, 99,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 85, 90,
+R_H_LINE_TO, 106,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, 4,
+H_LINE_TO, 89,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, -4,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+CIRCLE, 138, 31, 1,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 277, 90, 1,
+CIRCLE, 281, 90, 1,
+CIRCLE, 273, 86, 1,
+CIRCLE, 277, 86, 1,
+CIRCLE, 285, 90, 1,
+CIRCLE, 41, 75, 1,
+CIRCLE, 281, 86, 1,
+CIRCLE, 45, 75, 1,
+CIRCLE, 37, 71, 1,
+CIRCLE, 273, 90, 1,
+CIRCLE, 269, 86, 1,
+CIRCLE, 41, 71, 1,
+CIRCLE, 49, 75, 1,
+CIRCLE, 45, 71, 1,
+CIRCLE, 21, 75, 1,
+CIRCLE, 37, 75, 1,
+CIRCLE, 25, 75, 1,
+CIRCLE, 29, 75, 1,
+CIRCLE, 33, 75, 1,
+CIRCLE, 33, 71, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 64, 49, 3,
+CIRCLE, 72, 49, 3,
+CIRCLE, 48, 49, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+MOVE_TO, 281, 66,
+R_ARC_TO, 3, 3, 0, 1, 0, -6, 0,
+R_ARC_TO, 3, 3, 0, 0, 0, 6, 0,
+CLOSE,
+R_MOVE_TO, -16, 0,
+R_ARC_TO, 3, 3, 0, 1, 0, -6, 0,
+R_ARC_TO, 3, 3, 0, 0, 0, 6, 0,
+CLOSE,
+R_MOVE_TO, -8, 0,
+R_ARC_TO, 3, 3, 0, 1, 0, -6, 0,
+R_ARC_TO, 3, 3, 0, 0, 0, 6, 0,
+CLOSE
diff --git a/chrome/app/vector_icons/webauthn/passkey_error.icon b/chrome/app/vector_icons/webauthn/passkey_error.icon
new file mode 100644
index 0000000..2509269
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_error.icon
@@ -0,0 +1,133 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+MOVE_TO, 316, 0,
+H_LINE_TO, 0,
+R_V_LINE_TO, 112,
+R_H_LINE_TO, 316,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+CIRCLE, 206, 48, 10,
+CIRCLE, 181, 48, 10,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+MOVE_TO, 152.87f, 70.67f,
+R_CUBIC_TO, 0, -4.95f, 0.44f, -8.51f, 1.33f, -10.68f,
+R_CUBIC_TO, 0.88f, -2.17f, 2.76f, -4.54f, 5.64f, -7.1f,
+R_CUBIC_TO, 2.51f, -2.2f, 4.42f, -4.11f, 5.73f, -5.73f,
+R_CUBIC_TO, 1.32f, -1.62f, 1.97f, -3.47f, 1.97f, -5.54f,
+R_CUBIC_TO, 0, -2.5f, -0.84f, -4.58f, -2.52f, -6.23f,
+R_CUBIC_TO, -1.68f, -1.65f, -4.02f, -2.47f, -7.01f, -2.47f,
+R_CUBIC_TO, -3.12f, 0, -5.48f, 0.95f, -7.11f, 2.84f,
+R_CUBIC_TO, -1.62f, 1.89f, -2.76f, 3.82f, -3.44f, 5.78f,
+R_LINE_TO, -9.44f, -4.03f,
+R_CUBIC_TO, 1.28f, -3.91f, 3.64f, -7.3f, 7.06f, -10.18f,
+R_CUBIC_TO, 3.42f, -2.87f, 7.73f, -4.31f, 12.93f, -4.31f,
+R_CUBIC_TO, 6.42f, 0, 11.35f, 1.79f, 14.81f, 5.36f,
+R_CUBIC_TO, 3.45f, 3.57f, 5.18f, 7.87f, 5.18f, 12.88f,
+R_CUBIC_TO, 0, 3.06f, -0.66f, 5.67f, -1.97f, 7.84f,
+R_CUBIC_TO, -1.31f, 2.17f, -3.38f, 4.63f, -6.19f, 7.38f,
+R_CUBIC_TO, -2.99f, 2.87f, -4.81f, 5.06f, -5.45f, 6.55f,
+R_CUBIC_TO, -0.64f, 1.5f, -0.96f, 4.05f, -0.96f, 7.66f,
+R_H_LINE_TO, -10.54f,
+CLOSE,
+R_MOVE_TO, 5.13f, 22,
+R_CUBIC_TO, -2.02f, 0, -3.74f, -0.72f, -5.18f, -2.15f,
+R_CUBIC_TO, -1.44f, -1.44f, -2.16f, -3.16f, -2.16f, -5.18f,
+R_CUBIC_TO, 0, -2.02f, 0.72f, -3.74f, 2.16f, -5.18f,
+R_CUBIC_TO, 1.43f, -1.43f, 3.16f, -2.15f, 5.18f, -2.15f,
+R_CUBIC_TO, 2.02f, 0, 3.74f, 0.72f, 5.18f, 2.15f,
+R_CUBIC_TO, 1.44f, 1.44f, 2.15f, 3.17f, 2.15f, 5.18f,
+R_CUBIC_TO, 0, 2.02f, -0.72f, 3.74f, -2.15f, 5.18f,
+R_CUBIC_TO, -1.44f, 1.44f, -3.16f, 2.15f, -5.18f, 2.15f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+MOVE_TO, 172.65f, 53.51f,
+ARC_TO, 9.96f, 9.96f, 0, 0, 1, 171, 48,
+R_CUBIC_TO, 0, -4.4f, 2.85f, -8.15f, 6.81f, -9.48f,
+R_CUBIC_TO, 0.12f, 0.88f, 0.18f, 1.79f, 0.18f, 2.72f,
+R_CUBIC_TO, 0, 3.06f, -0.66f, 5.67f, -1.97f, 7.84f,
+R_CUBIC_TO, -0.82f, 1.36f, -1.95f, 2.84f, -3.36f, 4.43f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+CIRCLE, 135, 65, 10,
+CIRCLE, 110, 65, 10,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3
diff --git a/chrome/app/vector_icons/webauthn/passkey_error_bluetooth.icon b/chrome/app/vector_icons/webauthn/passkey_error_bluetooth.icon
new file mode 100644
index 0000000..46c1cf8
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_error_bluetooth.icon
@@ -0,0 +1,134 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+MOVE_TO, 125, 35,
+R_CUBIC_TO, 0, 5.52f, -4.48f, 10, -10, 10,
+R_CUBIC_TO, -5.52f, 0, -10, -4.48f, -10, -10,
+R_CUBIC_TO, 0, -5.52f, 4.48f, -10, 10, -10,
+R_CUBIC_TO, 5.52f, 0, 10, 4.48f, 10, 10,
+CLOSE,
+R_MOVE_TO, 25, 0,
+R_CUBIC_TO, 0, 5.52f, -4.48f, 10, -10, 10,
+R_CUBIC_TO, -5.52f, 0, -10, -4.48f, -10, -10,
+R_CUBIC_TO, 0, -5.52f, 4.48f, -10, 10, -10,
+R_CUBIC_TO, 5.52f, 0, 10, 4.48f, 10, 10,
+CLOSE,
+R_MOVE_TO, 41, 42,
+R_CUBIC_TO, 0, 5.52f, -4.48f, 10, -10, 10,
+R_CUBIC_TO, -5.52f, 0, -10, -4.48f, -10, -10,
+R_CUBIC_TO, 0, -5.52f, 4.48f, -10, 10, -10,
+R_CUBIC_TO, 5.52f, 0, 10, 4.48f, 10, 10,
+CLOSE,
+R_MOVE_TO, 25, 0,
+R_CUBIC_TO, 0, 5.52f, -4.48f, 10, -10, 10,
+R_CUBIC_TO, -5.52f, 0, -10, -4.48f, -10, -10,
+R_CUBIC_TO, 0, -5.52f, 4.48f, -10, 10, -10,
+R_CUBIC_TO, 5.52f, 0, 10, 4.48f, 10, 10,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+R_MOVE_TO, 160.58f, 40.06f,
+R_LINE_TO, 4.86f, 4.86f,
+R_LINE_TO, -4.13f, 4.13f,
+R_LINE_TO, 3.64f, 3.64f,
+R_LINE_TO, 7.8f, -7.8f,
+LINE_TO, 158, 30.17f,
+R_H_LINE_TO, -2.58f,
+V_LINE_TO, 43.16f,
+R_LINE_TO, 5.17f, 5.17f,
+V_LINE_TO, 40.06f,
+CLOSE,
+R_MOVE_TO, -19.61f, -4.73f,
+R_LINE_TO, -3.64f, 3.64f,
+LINE_TO, 154.36f, 56,
+R_LINE_TO, -14.44f, 14.44f,
+R_LINE_TO, 3.64f, 3.64f,
+R_LINE_TO, 11.86f, -11.86f,
+R_V_LINE_TO, 19.61f,
+H_LINE_TO, 158,
+R_LINE_TO, 11.08f, -11.08f,
+R_LINE_TO, 5.94f, 5.92f,
+R_LINE_TO, 3.64f, -3.64f,
+R_LINE_TO, -37.69f, -37.69f,
+CLOSE,
+R_MOVE_TO, 24.46f, 31.75f,
+R_LINE_TO, -4.86f, -4.86f,
+R_V_LINE_TO, 9.71f,
+R_LINE_TO, 4.86f, -4.86f,
+CLOSE
diff --git a/chrome/app/vector_icons/webauthn/passkey_error_bluetooth_dark.icon b/chrome/app/vector_icons/webauthn/passkey_error_bluetooth_dark.icon
new file mode 100644
index 0000000..7dc6b36
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_error_bluetooth_dark.icon
@@ -0,0 +1,134 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x3C, 0x40, 0x43,
+MOVE_TO, 125, 35,
+R_CUBIC_TO, 0, 5.52f, -4.48f, 10, -10, 10,
+R_CUBIC_TO, -5.52f, 0, -10, -4.48f, -10, -10,
+R_CUBIC_TO, 0, -5.52f, 4.48f, -10, 10, -10,
+R_CUBIC_TO, 5.52f, 0, 10, 4.48f, 10, 10,
+CLOSE,
+R_MOVE_TO, 25, 0,
+R_CUBIC_TO, 0, 5.52f, -4.48f, 10, -10, 10,
+R_CUBIC_TO, -5.52f, 0, -10, -4.48f, -10, -10,
+R_CUBIC_TO, 0, -5.52f, 4.48f, -10, 10, -10,
+R_CUBIC_TO, 5.52f, 0, 10, 4.48f, 10, 10,
+CLOSE,
+R_MOVE_TO, 41, 42,
+R_CUBIC_TO, 0, 5.52f, -4.48f, 10, -10, 10,
+R_CUBIC_TO, -5.52f, 0, -10, -4.48f, -10, -10,
+R_CUBIC_TO, 0, -5.52f, 4.48f, -10, 10, -10,
+R_CUBIC_TO, 5.52f, 0, 10, 4.48f, 10, 10,
+CLOSE,
+R_MOVE_TO, 25, 0,
+R_CUBIC_TO, 0, 5.52f, -4.48f, 10, -10, 10,
+R_CUBIC_TO, -5.52f, 0, -10, -4.48f, -10, -10,
+R_CUBIC_TO, 0, -5.52f, 4.48f, -10, 10, -10,
+R_CUBIC_TO, 5.52f, 0, 10, 4.48f, 10, 10,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+R_MOVE_TO, 160.58f, 40.06f,
+R_LINE_TO, 4.86f, 4.86f,
+R_LINE_TO, -4.13f, 4.13f,
+R_LINE_TO, 3.64f, 3.64f,
+R_LINE_TO, 7.8f, -7.8f,
+LINE_TO, 158, 30.17f,
+R_H_LINE_TO, -2.58f,
+V_LINE_TO, 43.16f,
+R_LINE_TO, 5.17f, 5.17f,
+V_LINE_TO, 40.06f,
+CLOSE,
+R_MOVE_TO, -19.61f, -4.73f,
+R_LINE_TO, -3.64f, 3.64f,
+LINE_TO, 154.36f, 56,
+R_LINE_TO, -14.44f, 14.44f,
+R_LINE_TO, 3.64f, 3.64f,
+R_LINE_TO, 11.86f, -11.86f,
+R_V_LINE_TO, 19.61f,
+H_LINE_TO, 158,
+R_LINE_TO, 11.08f, -11.08f,
+R_LINE_TO, 5.94f, 5.92f,
+R_LINE_TO, 3.64f, -3.64f,
+R_LINE_TO, -37.69f, -37.69f,
+CLOSE,
+R_MOVE_TO, 24.46f, 31.75f,
+R_LINE_TO, -4.86f, -4.86f,
+R_V_LINE_TO, 9.71f,
+R_LINE_TO, 4.86f, -4.86f,
+CLOSE
diff --git a/chrome/app/vector_icons/webauthn/passkey_error_dark.icon b/chrome/app/vector_icons/webauthn/passkey_error_dark.icon
new file mode 100644
index 0000000..ef5b5bb
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_error_dark.icon
@@ -0,0 +1,126 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0x3C, 0x40, 0x43,
+CIRCLE, 206, 48, 10,
+CIRCLE, 181, 48, 10,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 152.87f, 70.67f,
+R_CUBIC_TO, 0, -4.95f, 0.44f, -8.51f, 1.33f, -10.68f,
+R_CUBIC_TO, 0.88f, -2.17f, 2.76f, -4.54f, 5.64f, -7.1f,
+R_CUBIC_TO, 2.51f, -2.2f, 4.42f, -4.11f, 5.73f, -5.73f,
+R_CUBIC_TO, 1.32f, -1.62f, 1.97f, -3.47f, 1.97f, -5.54f,
+R_CUBIC_TO, 0, -2.5f, -0.84f, -4.58f, -2.52f, -6.23f,
+R_CUBIC_TO, -1.68f, -1.65f, -4.02f, -2.47f, -7.01f, -2.47f,
+R_CUBIC_TO, -3.12f, 0, -5.48f, 0.95f, -7.11f, 2.84f,
+R_CUBIC_TO, -1.62f, 1.89f, -2.76f, 3.82f, -3.44f, 5.78f,
+R_LINE_TO, -9.44f, -4.03f,
+R_CUBIC_TO, 1.28f, -3.91f, 3.64f, -7.3f, 7.06f, -10.18f,
+R_CUBIC_TO, 3.42f, -2.87f, 7.73f, -4.31f, 12.93f, -4.31f,
+R_CUBIC_TO, 6.42f, 0, 11.35f, 1.79f, 14.81f, 5.36f,
+R_CUBIC_TO, 3.45f, 3.57f, 5.18f, 7.87f, 5.18f, 12.88f,
+R_CUBIC_TO, 0, 3.06f, -0.66f, 5.67f, -1.97f, 7.84f,
+R_CUBIC_TO, -1.31f, 2.17f, -3.38f, 4.63f, -6.19f, 7.38f,
+R_CUBIC_TO, -2.99f, 2.87f, -4.81f, 5.06f, -5.45f, 6.55f,
+R_CUBIC_TO, -0.64f, 1.5f, -0.96f, 4.05f, -0.96f, 7.66f,
+R_H_LINE_TO, -10.54f,
+CLOSE,
+R_MOVE_TO, 5.13f, 22,
+R_CUBIC_TO, -2.02f, 0, -3.74f, -0.72f, -5.18f, -2.15f,
+R_CUBIC_TO, -1.44f, -1.44f, -2.16f, -3.16f, -2.16f, -5.18f,
+R_CUBIC_TO, 0, -2.02f, 0.72f, -3.74f, 2.16f, -5.18f,
+R_CUBIC_TO, 1.43f, -1.43f, 3.16f, -2.15f, 5.18f, -2.15f,
+R_CUBIC_TO, 2.02f, 0, 3.74f, 0.72f, 5.18f, 2.15f,
+R_CUBIC_TO, 1.44f, 1.44f, 2.15f, 3.17f, 2.15f, 5.18f,
+R_CUBIC_TO, 0, 2.02f, -0.72f, 3.74f, -2.15f, 5.18f,
+R_CUBIC_TO, -1.44f, 1.44f, -3.16f, 2.15f, -5.18f, 2.15f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x20, 0x21, 0x24,
+MOVE_TO, 172.65f, 53.51f,
+ARC_TO, 9.96f, 9.96f, 0, 0, 1, 171, 48,
+R_CUBIC_TO, 0, -4.4f, 2.85f, -8.15f, 6.81f, -9.48f,
+R_CUBIC_TO, 0.12f, 0.88f, 0.18f, 1.79f, 0.18f, 2.72f,
+R_CUBIC_TO, 0, 3.06f, -0.66f, 5.67f, -1.97f, 7.84f,
+R_CUBIC_TO, -0.82f, 1.36f, -1.95f, 2.84f, -3.36f, 4.43f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x3C, 0x40, 0x43,
+CIRCLE, 135, 65, 10,
+CIRCLE, 110, 65, 10,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3
diff --git a/chrome/app/vector_icons/webauthn/passkey_fingerprint.icon b/chrome/app/vector_icons/webauthn/passkey_fingerprint.icon
new file mode 100644
index 0000000..3e0ef5c
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_fingerprint.icon
@@ -0,0 +1,184 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+MOVE_TO, 152.39f, 15.35f,
+R_CUBIC_TO, 3.03f, -4.13f, 9.2f, -4.13f, 12.23f, 0,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 9.17f, 2.46f,
+R_CUBIC_TO, 4.69f, -2.07f, 10.03f, 1.02f, 10.59f, 6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 6.71f, 6.71f,
+R_CUBIC_TO, 5.09f, 0.56f, 8.18f, 5.9f, 6.11f, 10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 2.46f, 9.17f,
+R_CUBIC_TO, 4.13f, 3.03f, 4.13f, 9.2f, 0, 12.23f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -2.46f, 9.17f,
+R_CUBIC_TO, 2.07f, 4.69f, -1.02f, 10.03f, -6.11f, 10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -6.71f, 6.71f,
+R_CUBIC_TO, -0.56f, 5.09f, -5.9f, 8.18f, -10.59f, 6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -9.17f, 2.46f,
+R_CUBIC_TO, -3.03f, 4.13f, -9.2f, 4.13f, -12.23f, 0,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -9.17f, -2.46f,
+R_CUBIC_TO, -4.69f, 2.07f, -10.03f, -1.02f, -10.59f, -6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -6.71f, -6.71f,
+R_CUBIC_TO, -5.09f, -0.56f, -8.18f, -5.9f, -6.11f, -10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -2.46f, -9.17f,
+R_CUBIC_TO, -4.13f, -3.03f, -4.13f, -9.2f, 0, -12.23f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 2.46f, -9.17f,
+R_CUBIC_TO, -2.07f, -4.69f, 1.02f, -10.03f, 6.11f, -10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 6.71f, -6.71f,
+R_CUBIC_TO, 0.56f, -5.09f, 5.9f, -8.18f, 10.59f, -6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 9.17f, -2.46f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+MOVE_TO, 173.04f, 36.8f,
+R_ARC_TO, 1.12f, 1.12f, 0, 0, 1, -0.56f, -0.14f,
+R_CUBIC_TO, -4.64f, -2.39f, -8.65f, -3.41f, -13.46f, -3.41f,
+R_CUBIC_TO, -4.78f, 0, -9.33f, 1.14f, -13.46f, 3.41f,
+R_CUBIC_TO, -0.58f, 0.31f, -1.3f, 0.1f, -1.64f, -0.48f,
+R_ARC_TO, 1.22f, 1.22f, 0, 0, 1, 0.48f, -1.64f,
+R_CUBIC_TO, 4.5f, -2.44f, 9.43f, -3.7f, 14.62f, -3.7f,
+R_CUBIC_TO, 5.15f, 0, 9.64f, 1.14f, 14.57f, 3.67f,
+R_CUBIC_TO, 0.6f, 0.31f, 0.82f, 1.04f, 0.51f, 1.62f,
+R_ARC_TO, 1.19f, 1.19f, 0, 0, 1, -1.06f, 0.68f,
+CLOSE,
+R_MOVE_TO, -34.58f, 12.69f,
+R_ARC_TO, 1.21f, 1.21f, 0, 0, 1, -0.99f, -1.91f,
+R_CUBIC_TO, 2.39f, -3.38f, 5.44f, -6.04f, 9.06f, -7.9f,
+R_CUBIC_TO, 7.59f, -3.91f, 17.3f, -3.94f, 24.92f, -0.02f,
+R_CUBIC_TO, 3.63f, 1.86f, 6.67f, 4.5f, 9.06f, 7.85f,
+R_ARC_TO, 1.21f, 1.21f, 0, 0, 1, -0.29f, 1.69f,
+R_ARC_TO, 1.21f, 1.21f, 0, 0, 1, -1.69f, -0.29f,
+R_CUBIC_TO, -2.17f, -3.04f, -4.93f, -5.44f, -8.19f, -7.1f,
+R_CUBIC_TO, -6.94f, -3.55f, -15.8f, -3.55f, -22.72f, 0.03f,
+R_CUBIC_TO, -3.29f, 1.69f, -6.04f, 4.11f, -8.22f, 7.15f,
+R_CUBIC_TO, -0.19f, 0.34f, -0.56f, 0.51f, -0.94f, 0.51f,
+CLOSE,
+R_MOVE_TO, 14.26f, 28.81f,
+R_CUBIC_TO, 0.22f, 0.24f, 0.53f, 0.36f, 0.85f, 0.36f,
+R_CUBIC_TO, 0.32f, 0, 0.63f, -0.12f, 0.9f, -0.36f,
+R_ARC_TO, 1.24f, 1.24f, 0, 0, 0, 0, -1.72f,
+R_CUBIC_TO, -1.86f, -1.88f, -2.92f, -3.07f, -4.47f, -5.85f,
+R_CUBIC_TO, -1.47f, -2.61f, -2.25f, -5.82f, -2.25f, -9.3f,
+R_CUBIC_TO, 0, -5.85f, 5.05f, -10.61f, 11.26f, -10.61f,
+R_CUBIC_TO, 6.21f, 0, 11.26f, 4.76f, 11.26f, 10.61f,
+R_CUBIC_TO, 0, 0.68f, 0.53f, 1.21f, 1.21f, 1.21f,
+R_CUBIC_TO, 0.68f, 0, 1.21f, -0.53f, 1.21f, -1.21f,
+R_CUBIC_TO, 0, -7.18f, -6.14f, -13.03f, -13.68f, -13.03f,
+R_CUBIC_TO, -7.54f, 0, -13.68f, 5.85f, -13.68f, 13.03f,
+R_CUBIC_TO, 0, 3.89f, 0.87f, 7.52f, 2.54f, 10.49f,
+R_CUBIC_TO, 1.62f, 2.92f, 2.76f, 4.28f, 4.86f, 6.38f,
+CLOSE,
+R_MOVE_TO, 18.17f, -4.11f,
+R_CUBIC_TO, -2.88f, 0, -5.41f, -0.72f, -7.49f, -2.15f,
+R_CUBIC_TO, -3.6f, -2.44f, -5.75f, -6.4f, -5.75f, -10.61f,
+R_CUBIC_TO, 0, -0.68f, 0.53f, -1.21f, 1.21f, -1.21f,
+R_CUBIC_TO, 0.68f, 0, 1.21f, 0.53f, 1.21f, 1.21f,
+R_CUBIC_TO, 0, 3.41f, 1.74f, 6.62f, 4.69f, 8.6f,
+R_CUBIC_TO, 1.72f, 1.16f, 3.72f, 1.72f, 6.14f, 1.72f,
+R_CUBIC_TO, 0.58f, 0, 1.55f, -0.07f, 2.51f, -0.24f,
+R_CUBIC_TO, 0.65f, -0.12f, 1.28f, 0.31f, 1.4f, 0.99f,
+R_ARC_TO, 1.2f, 1.2f, 0, 0, 1, -0.99f, 1.4f,
+R_CUBIC_TO, -1.38f, 0.27f, -2.58f, 0.29f, -2.92f, 0.29f,
+CLOSE,
+R_MOVE_TO, -5.17f, 4.93f,
+R_CUBIC_TO, 0.1f, 0.03f, 0.22f, 0.05f, 0.31f, 0.05f,
+R_ARC_TO, 1.18f, 1.18f, 0, 0, 0, 1.14f, -0.92f,
+R_ARC_TO, 1.2f, 1.2f, 0, 0, 0, -0.85f, -1.47f,
+R_CUBIC_TO, -3.41f, -0.94f, -5.61f, -2.2f, -7.9f, -4.47f,
+R_CUBIC_TO, -2.92f, -2.9f, -4.52f, -6.77f, -4.52f, -10.9f,
+R_CUBIC_TO, 0, -2.58f, 2.25f, -4.69f, 5.03f, -4.69f,
+R_CUBIC_TO, 2.78f, 0, 5.03f, 2.1f, 5.03f, 4.69f,
+R_CUBIC_TO, 0, 3.92f, 3.34f, 7.11f, 7.44f, 7.11f,
+R_CUBIC_TO, 4.1f, 0, 7.44f, -3.19f, 7.44f, -7.1f,
+R_CUBIC_TO, 0, -10.44f, -8.94f, -18.92f, -19.94f, -18.92f,
+R_CUBIC_TO, -7.81f, 0, -14.93f, 4.37f, -18.15f, 11.12f,
+R_CUBIC_TO, -1.09f, 2.3f, -1.64f, 4.93f, -1.64f, 7.83f,
+R_CUBIC_TO, 0, 3.26f, 0.58f, 6.4f, 1.76f, 9.57f,
+R_ARC_TO, 1.2f, 1.2f, 0, 0, 0, 1.55f, 0.7f,
+R_ARC_TO, 1.18f, 1.18f, 0, 0, 0, 0.7f, -1.55f,
+R_CUBIC_TO, -1.45f, -3.87f, -1.62f, -6.84f, -1.62f, -8.72f,
+R_CUBIC_TO, 0, -2.51f, 0.48f, -4.81f, 1.43f, -6.77f,
+R_CUBIC_TO, 2.83f, -5.92f, 9.11f, -9.74f, 15.97f, -9.74f,
+R_CUBIC_TO, 9.67f, 0, 17.52f, 7.4f, 17.52f, 16.51f,
+R_CUBIC_TO, 0, 2.59f, -2.25f, 4.69f, -5.03f, 4.69f,
+R_CUBIC_TO, -2.78f, 0, -5.03f, -2.1f, -5.03f, -4.69f,
+R_CUBIC_TO, 0, -3.91f, -3.33f, -7.1f, -7.44f, -7.1f,
+R_CUBIC_TO, -4.11f, 0, -7.44f, 3.19f, -7.44f, 7.11f,
+R_CUBIC_TO, 0, 4.79f, 1.86f, 9.26f, 5.24f, 12.62f,
+R_CUBIC_TO, 2.63f, 2.59f, 5.15f, 4.01f, 8.99f, 5.08f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3
diff --git a/chrome/app/vector_icons/webauthn/passkey_fingerprint_dark.icon b/chrome/app/vector_icons/webauthn/passkey_fingerprint_dark.icon
new file mode 100644
index 0000000..74e1f85
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_fingerprint_dark.icon
@@ -0,0 +1,184 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0x3C, 0x40, 0x43,
+MOVE_TO, 152.39f, 15.35f,
+R_CUBIC_TO, 3.03f, -4.13f, 9.2f, -4.13f, 12.23f, 0,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 9.17f, 2.46f,
+R_CUBIC_TO, 4.69f, -2.07f, 10.03f, 1.02f, 10.59f, 6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 6.71f, 6.71f,
+R_CUBIC_TO, 5.09f, 0.56f, 8.18f, 5.9f, 6.11f, 10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 2.46f, 9.17f,
+R_CUBIC_TO, 4.13f, 3.03f, 4.13f, 9.2f, 0, 12.23f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -2.46f, 9.17f,
+R_CUBIC_TO, 2.07f, 4.69f, -1.02f, 10.03f, -6.11f, 10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -6.71f, 6.71f,
+R_CUBIC_TO, -0.56f, 5.09f, -5.9f, 8.18f, -10.59f, 6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -9.17f, 2.46f,
+R_CUBIC_TO, -3.03f, 4.13f, -9.2f, 4.13f, -12.23f, 0,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -9.17f, -2.46f,
+R_CUBIC_TO, -4.69f, 2.07f, -10.03f, -1.02f, -10.59f, -6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -6.71f, -6.71f,
+R_CUBIC_TO, -5.09f, -0.56f, -8.18f, -5.9f, -6.11f, -10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -2.46f, -9.17f,
+R_CUBIC_TO, -4.13f, -3.03f, -4.13f, -9.2f, 0, -12.23f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 2.46f, -9.17f,
+R_CUBIC_TO, -2.07f, -4.69f, 1.02f, -10.03f, 6.11f, -10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 6.71f, -6.71f,
+R_CUBIC_TO, 0.56f, -5.09f, 5.9f, -8.18f, 10.59f, -6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 9.17f, -2.46f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 173.04f, 36.8f,
+R_ARC_TO, 1.12f, 1.12f, 0, 0, 1, -0.56f, -0.14f,
+R_CUBIC_TO, -4.64f, -2.39f, -8.65f, -3.41f, -13.46f, -3.41f,
+R_CUBIC_TO, -4.78f, 0, -9.33f, 1.14f, -13.46f, 3.41f,
+R_CUBIC_TO, -0.58f, 0.31f, -1.3f, 0.1f, -1.64f, -0.48f,
+R_ARC_TO, 1.22f, 1.22f, 0, 0, 1, 0.48f, -1.64f,
+R_CUBIC_TO, 4.5f, -2.44f, 9.43f, -3.7f, 14.62f, -3.7f,
+R_CUBIC_TO, 5.15f, 0, 9.64f, 1.14f, 14.57f, 3.67f,
+R_CUBIC_TO, 0.6f, 0.31f, 0.82f, 1.04f, 0.51f, 1.62f,
+R_ARC_TO, 1.19f, 1.19f, 0, 0, 1, -1.06f, 0.68f,
+CLOSE,
+R_MOVE_TO, -34.58f, 12.69f,
+R_ARC_TO, 1.21f, 1.21f, 0, 0, 1, -0.99f, -1.91f,
+R_CUBIC_TO, 2.39f, -3.38f, 5.44f, -6.04f, 9.06f, -7.9f,
+R_CUBIC_TO, 7.59f, -3.91f, 17.3f, -3.94f, 24.92f, -0.02f,
+R_CUBIC_TO, 3.63f, 1.86f, 6.67f, 4.5f, 9.06f, 7.85f,
+R_ARC_TO, 1.21f, 1.21f, 0, 0, 1, -0.29f, 1.69f,
+R_ARC_TO, 1.21f, 1.21f, 0, 0, 1, -1.69f, -0.29f,
+R_CUBIC_TO, -2.17f, -3.04f, -4.93f, -5.44f, -8.19f, -7.1f,
+R_CUBIC_TO, -6.94f, -3.55f, -15.8f, -3.55f, -22.72f, 0.03f,
+R_CUBIC_TO, -3.29f, 1.69f, -6.04f, 4.11f, -8.22f, 7.15f,
+R_CUBIC_TO, -0.19f, 0.34f, -0.56f, 0.51f, -0.94f, 0.51f,
+CLOSE,
+R_MOVE_TO, 14.26f, 28.81f,
+R_CUBIC_TO, 0.22f, 0.24f, 0.53f, 0.36f, 0.85f, 0.36f,
+R_CUBIC_TO, 0.32f, 0, 0.63f, -0.12f, 0.9f, -0.36f,
+R_ARC_TO, 1.24f, 1.24f, 0, 0, 0, 0, -1.72f,
+R_CUBIC_TO, -1.86f, -1.88f, -2.92f, -3.07f, -4.47f, -5.85f,
+R_CUBIC_TO, -1.47f, -2.61f, -2.25f, -5.82f, -2.25f, -9.3f,
+R_CUBIC_TO, 0, -5.85f, 5.05f, -10.61f, 11.26f, -10.61f,
+R_CUBIC_TO, 6.21f, 0, 11.26f, 4.76f, 11.26f, 10.61f,
+R_CUBIC_TO, 0, 0.68f, 0.53f, 1.21f, 1.21f, 1.21f,
+R_CUBIC_TO, 0.68f, 0, 1.21f, -0.53f, 1.21f, -1.21f,
+R_CUBIC_TO, 0, -7.18f, -6.14f, -13.03f, -13.68f, -13.03f,
+R_CUBIC_TO, -7.54f, 0, -13.68f, 5.85f, -13.68f, 13.03f,
+R_CUBIC_TO, 0, 3.89f, 0.87f, 7.52f, 2.54f, 10.49f,
+R_CUBIC_TO, 1.62f, 2.92f, 2.76f, 4.28f, 4.86f, 6.38f,
+CLOSE,
+R_MOVE_TO, 18.17f, -4.11f,
+R_CUBIC_TO, -2.88f, 0, -5.41f, -0.72f, -7.49f, -2.15f,
+R_CUBIC_TO, -3.6f, -2.44f, -5.75f, -6.4f, -5.75f, -10.61f,
+R_CUBIC_TO, 0, -0.68f, 0.53f, -1.21f, 1.21f, -1.21f,
+R_CUBIC_TO, 0.68f, 0, 1.21f, 0.53f, 1.21f, 1.21f,
+R_CUBIC_TO, 0, 3.41f, 1.74f, 6.62f, 4.69f, 8.6f,
+R_CUBIC_TO, 1.72f, 1.16f, 3.72f, 1.72f, 6.14f, 1.72f,
+R_CUBIC_TO, 0.58f, 0, 1.55f, -0.07f, 2.51f, -0.24f,
+R_CUBIC_TO, 0.65f, -0.12f, 1.28f, 0.31f, 1.4f, 0.99f,
+R_ARC_TO, 1.2f, 1.2f, 0, 0, 1, -0.99f, 1.4f,
+R_CUBIC_TO, -1.38f, 0.27f, -2.58f, 0.29f, -2.92f, 0.29f,
+CLOSE,
+R_MOVE_TO, -5.17f, 4.93f,
+R_CUBIC_TO, 0.1f, 0.03f, 0.22f, 0.05f, 0.31f, 0.05f,
+R_ARC_TO, 1.18f, 1.18f, 0, 0, 0, 1.14f, -0.92f,
+R_ARC_TO, 1.2f, 1.2f, 0, 0, 0, -0.85f, -1.47f,
+R_CUBIC_TO, -3.41f, -0.94f, -5.61f, -2.2f, -7.9f, -4.47f,
+R_CUBIC_TO, -2.92f, -2.9f, -4.52f, -6.77f, -4.52f, -10.9f,
+R_CUBIC_TO, 0, -2.58f, 2.25f, -4.69f, 5.03f, -4.69f,
+R_CUBIC_TO, 2.78f, 0, 5.03f, 2.1f, 5.03f, 4.69f,
+R_CUBIC_TO, 0, 3.92f, 3.34f, 7.11f, 7.44f, 7.11f,
+R_CUBIC_TO, 4.1f, 0, 7.44f, -3.19f, 7.44f, -7.1f,
+R_CUBIC_TO, 0, -10.44f, -8.94f, -18.92f, -19.94f, -18.92f,
+R_CUBIC_TO, -7.81f, 0, -14.93f, 4.37f, -18.15f, 11.12f,
+R_CUBIC_TO, -1.09f, 2.3f, -1.64f, 4.93f, -1.64f, 7.83f,
+R_CUBIC_TO, 0, 3.26f, 0.58f, 6.4f, 1.76f, 9.57f,
+R_ARC_TO, 1.2f, 1.2f, 0, 0, 0, 1.55f, 0.7f,
+R_ARC_TO, 1.18f, 1.18f, 0, 0, 0, 0.7f, -1.55f,
+R_CUBIC_TO, -1.45f, -3.87f, -1.62f, -6.84f, -1.62f, -8.72f,
+R_CUBIC_TO, 0, -2.51f, 0.48f, -4.81f, 1.43f, -6.77f,
+R_CUBIC_TO, 2.83f, -5.92f, 9.11f, -9.74f, 15.97f, -9.74f,
+R_CUBIC_TO, 9.67f, 0, 17.52f, 7.4f, 17.52f, 16.51f,
+R_CUBIC_TO, 0, 2.59f, -2.25f, 4.69f, -5.03f, 4.69f,
+R_CUBIC_TO, -2.78f, 0, -5.03f, -2.1f, -5.03f, -4.69f,
+R_CUBIC_TO, 0, -3.91f, -3.33f, -7.1f, -7.44f, -7.1f,
+R_CUBIC_TO, -4.11f, 0, -7.44f, 3.19f, -7.44f, 7.11f,
+R_CUBIC_TO, 0, 4.79f, 1.86f, 9.26f, 5.24f, 12.62f,
+R_CUBIC_TO, 2.63f, 2.59f, 5.15f, 4.01f, 8.99f, 5.08f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3
diff --git a/chrome/app/vector_icons/webauthn/passkey_header.icon b/chrome/app/vector_icons/webauthn/passkey_header.icon
new file mode 100644
index 0000000..982b6fc
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_header.icon
@@ -0,0 +1,367 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+MOVE_TO, 152.39f, 15.35f,
+R_CUBIC_TO, 3.03f, -4.13f, 9.2f, -4.13f, 12.23f, 0,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 9.17f, 2.46f,
+R_CUBIC_TO, 4.69f, -2.07f, 10.03f, 1.02f, 10.59f, 6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 6.71f, 6.71f,
+R_CUBIC_TO, 5.09f, 0.56f, 8.18f, 5.9f, 6.11f, 10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 2.46f, 9.17f,
+R_CUBIC_TO, 4.13f, 3.03f, 4.13f, 9.2f, 0, 12.23f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -2.46f, 9.17f,
+R_CUBIC_TO, 2.07f, 4.69f, -1.02f, 10.03f, -6.11f, 10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -6.71f, 6.71f,
+R_CUBIC_TO, -0.56f, 5.09f, -5.9f, 8.18f, -10.59f, 6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -9.17f, 2.46f,
+R_CUBIC_TO, -3.03f, 4.13f, -9.2f, 4.13f, -12.23f, 0,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -9.17f, -2.46f,
+R_CUBIC_TO, -4.69f, 2.07f, -10.03f, -1.02f, -10.59f, -6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -6.71f, -6.71f,
+R_CUBIC_TO, -5.09f, -0.56f, -8.18f, -5.9f, -6.11f, -10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -2.46f, -9.17f,
+R_CUBIC_TO, -4.13f, -3.03f, -4.13f, -9.2f, 0, -12.23f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 2.46f, -9.17f,
+R_CUBIC_TO, -2.07f, -4.69f, 1.02f, -10.03f, 6.11f, -10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 6.71f, -6.71f,
+R_CUBIC_TO, 0.56f, -5.09f, 5.9f, -8.18f, 10.59f, -6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 9.17f, -2.46f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+MOVE_TO, 156.58f, 54.76f,
+R_CUBIC_TO, -2.78f, 0, -5.17f, -1, -7.16f, -2.99f,
+R_CUBIC_TO, -1.99f, -1.99f, -2.99f, -4.38f, -2.99f, -7.16f,
+R_CUBIC_TO, 0, -2.82f, 1, -5.22f, 2.99f, -7.19f,
+R_CUBIC_TO, 1.99f, -1.97f, 4.38f, -2.96f, 7.16f, -2.96f,
+R_CUBIC_TO, 2.78f, 0, 5.17f, 1, 7.16f, 2.99f,
+R_CUBIC_TO, 1.99f, 1.99f, 2.99f, 4.38f, 2.99f, 7.16f,
+R_CUBIC_TO, 0, 2.78f, -1, 5.17f, -2.99f, 7.16f,
+R_CUBIC_TO, -1.99f, 1.99f, -4.38f, 2.99f, -7.16f, 2.99f,
+CLOSE,
+R_MOVE_TO, 0, -5.5f,
+R_CUBIC_TO, 1.29f, 0, 2.39f, -0.45f, 3.29f, -1.36f,
+R_CUBIC_TO, 0.91f, -0.91f, 1.36f, -2, 1.36f, -3.29f,
+R_CUBIC_TO, 0, -1.29f, -0.45f, -2.39f, -1.36f, -3.29f,
+R_CUBIC_TO, -0.91f, -0.9f, -2, -1.36f, -3.29f, -1.36f,
+R_CUBIC_TO, -1.29f, 0, -2.39f, 0.45f, -3.29f, 1.36f,
+R_CUBIC_TO, -0.91f, 0.91f, -1.36f, 2.01f, -1.36f, 3.29f,
+R_CUBIC_TO, 0, 1.29f, 0.45f, 2.39f, 1.36f, 3.29f,
+R_CUBIC_TO, 0.91f, 0.91f, 2, 1.36f, 3.29f, 1.36f,
+CLOSE,
+R_MOVE_TO, -19.82f, 25.8f,
+R_V_LINE_TO, -7.19f,
+R_CUBIC_TO, 0, -1.49f, 0.36f, -2.85f, 1.09f, -4.08f,
+R_ARC_TO, 7.14f, 7.14f, 0, 0, 1, 3.02f, -2.81f,
+R_CUBIC_TO, 2.01f, -1.05f, 4.33f, -1.94f, 6.95f, -2.69f,
+R_CUBIC_TO, 2.62f, -0.74f, 5.5f, -1.12f, 8.64f, -1.12f,
+R_CUBIC_TO, 0.81f, 0, 1.63f, 0.03f, 2.48f, 0.09f,
+R_CUBIC_TO, 0.85f, 0.06f, 1.63f, 0.15f, 2.36f, 0.27f,
+R_CUBIC_TO, 0, 1.05f, 0.13f, 2.08f, 0.39f, 3.08f,
+R_ARC_TO, 10.01f, 10.01f, 0, 0, 0, 1.18f, 2.78f,
+R_ARC_TO, 23.46f, 23.46f, 0, 0, 0, -3.05f, -0.54f,
+R_ARC_TO, 29.85f, 29.85f, 0, 0, 0, -3.35f, -0.18f,
+R_CUBIC_TO, -2.82f, 0, -5.34f, 0.34f, -7.55f, 1.03f,
+R_CUBIC_TO, -2.22f, 0.69f, -4.03f, 1.39f, -5.44f, 2.12f,
+R_ARC_TO, 2.01f, 2.01f, 0, 0, 0, -0.91f, 0.87f,
+R_ARC_TO, 2.62f, 2.62f, 0, 0, 0, -0.3f, 1.24f,
+R_V_LINE_TO, 1.63f,
+R_H_LINE_TO, 23.8f,
+R_V_LINE_TO, 5.5f,
+R_H_LINE_TO, -29.3f,
+CLOSE,
+R_MOVE_TO, 37.34f, 2.24f,
+R_LINE_TO, -3.2f, -3.81f,
+R_V_LINE_TO, -9.12f,
+R_ARC_TO, 7.79f, 7.79f, 0, 0, 1, -3.47f, -2.72f,
+R_CUBIC_TO, -0.91f, -1.25f, -1.36f, -2.66f, -1.36f, -4.23f,
+R_CUBIC_TO, 0, -2.06f, 0.73f, -3.81f, 2.17f, -5.26f,
+R_CUBIC_TO, 1.45f, -1.45f, 3.2f, -2.17f, 5.26f, -2.17f,
+R_CUBIC_TO, 2.05f, 0, 3.81f, 0.73f, 5.26f, 2.17f,
+R_CUBIC_TO, 1.45f, 1.45f, 2.17f, 3.2f, 2.17f, 5.26f,
+R_CUBIC_TO, 0, 1.61f, -0.45f, 3.03f, -1.36f, 4.26f,
+R_ARC_TO, 7.87f, 7.87f, 0, 0, 1, -3.47f, 2.69f,
+R_V_LINE_TO, 0.54f,
+R_LINE_TO, 2.48f, 2.48f,
+R_LINE_TO, -2.42f, 2.42f,
+R_LINE_TO, 2.42f, 2.42f,
+R_LINE_TO, -4.47f, 5.08f,
+CLOSE,
+MOVE_TO, 173.5f, 60.86f,
+R_CUBIC_TO, 0.97f, 0, 1.78f, -0.33f, 2.45f, -1,
+R_CUBIC_TO, 0.66f, -0.66f, 1, -1.48f, 1, -2.44f,
+R_CUBIC_TO, 0, -0.97f, -0.33f, -1.78f, -1, -2.45f,
+R_CUBIC_TO, -0.66f, -0.66f, -1.48f, -1, -2.45f, -1,
+R_CUBIC_TO, -0.97f, 0, -1.78f, 0.33f, -2.44f, 1,
+R_CUBIC_TO, -0.67f, 0.67f, -1, 1.48f, -1, 2.45f,
+R_CUBIC_TO, 0, 0.97f, 0.33f, 1.78f, 1, 2.44f,
+R_CUBIC_TO, 0.66f, 0.67f, 1.48f, 1, 2.44f, 1,
+CLOSE,
+R_MOVE_TO, -16.92f, -16.25f,
+R_H_LINE_TO, -0.03f,
+R_H_LINE_TO, 0.03f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 98, 71.5f,
+R_V_LINE_TO, -2.66f,
+R_H_LINE_TO, 30,
+V_LINE_TO, 71.5f,
+H_LINE_TO, 98,
+CLOSE,
+R_MOVE_TO, 1.58f, -9.3f,
+R_LINE_TO, -1.72f, -0.97f,
+R_LINE_TO, 1.39f, -2.4f,
+H_LINE_TO, 96.5f,
+R_V_LINE_TO, -1.99f,
+R_H_LINE_TO, 2.74f,
+R_LINE_TO, -1.39f, -2.36f,
+R_LINE_TO, 1.73f, -0.97f,
+R_LINE_TO, 1.35f, 2.36f,
+R_LINE_TO, 1.35f, -2.36f,
+R_LINE_TO, 1.73f, 0.98f,
+R_LINE_TO, -1.39f, 2.36f,
+R_H_LINE_TO, 2.74f,
+R_V_LINE_TO, 1.99f,
+R_H_LINE_TO, -2.74f,
+R_LINE_TO, 1.39f, 2.4f,
+R_LINE_TO, -1.72f, 0.98f,
+R_LINE_TO, -1.35f, -2.4f,
+R_LINE_TO, -1.35f, 2.4f,
+CLOSE,
+R_MOVE_TO, 12.08f, 0,
+R_LINE_TO, -1.72f, -1.01f,
+R_LINE_TO, 1.39f, -2.4f,
+R_H_LINE_TO, -2.74f,
+V_LINE_TO, 56.8f,
+R_H_LINE_TO, 2.74f,
+R_LINE_TO, -1.39f, -2.36f,
+R_LINE_TO, 1.73f, -0.98f,
+R_LINE_TO, 1.35f, 2.36f,
+R_LINE_TO, 1.35f, -2.36f,
+R_LINE_TO, 1.73f, 0.98f,
+R_LINE_TO, -1.39f, 2.36f,
+R_H_LINE_TO, 2.74f,
+R_V_LINE_TO, 1.99f,
+R_H_LINE_TO, -2.74f,
+R_LINE_TO, 1.39f, 2.4f,
+R_LINE_TO, -1.72f, 1.01f,
+R_LINE_TO, -1.35f, -2.4f,
+R_LINE_TO, -1.35f, 2.4f,
+CLOSE,
+R_MOVE_TO, 12.08f, 0,
+LINE_TO, 122, 61.19f,
+R_LINE_TO, 1.39f, -2.4f,
+R_H_LINE_TO, -2.74f,
+V_LINE_TO, 56.8f,
+R_H_LINE_TO, 2.74f,
+LINE_TO, 122, 54.44f,
+R_LINE_TO, 1.73f, -0.98f,
+R_LINE_TO, 1.35f, 2.36f,
+R_LINE_TO, 1.35f, -2.36f,
+R_LINE_TO, 1.73f, 0.98f,
+R_LINE_TO, -1.39f, 2.36f,
+R_H_LINE_TO, 2.74f,
+R_V_LINE_TO, 1.99f,
+R_H_LINE_TO, -2.74f,
+R_LINE_TO, 1.39f, 2.4f,
+R_LINE_TO, -1.72f, 1.01f,
+R_LINE_TO, -1.35f, -2.4f,
+R_LINE_TO, -1.35f, 2.4f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 200.04f, 24,
+R_CUBIC_TO, 1.63f, 0, 3.2f, 0.2f, 4.72f, 0.6f,
+R_CUBIC_TO, 1.55f, 0.4f, 3.04f, 0.96f, 4.46f, 1.69f,
+R_CUBIC_TO, 0.18f, 0.08f, 0.28f, 0.19f, 0.3f, 0.34f,
+R_ARC_TO, 0.65f, 0.65f, 0, 0, 1, -0.04f, 0.38f,
+R_ARC_TO, 0.86f, 0.86f, 0, 0, 1, -0.3f, 0.3f,
+R_CUBIC_TO, -0.12f, 0.08f, -0.29f, 0.08f, -0.49f, 0,
+R_ARC_TO, 17.7f, 17.7f, 0, 0, 0, -4.2f, -1.57f,
+R_ARC_TO, 17.75f, 17.75f, 0, 0, 0, -4.46f, -0.56f,
+R_CUBIC_TO, -1.5f, 0, -2.97f, 0.18f, -4.42f, 0.53f,
+R_CUBIC_TO, -1.42f, 0.35f, -2.79f, 0.89f, -4.09f, 1.61f,
+R_CUBIC_TO, -0.17f, 0.08f, -0.32f, 0.09f, -0.45f, 0.04f,
+R_ARC_TO, 0.61f, 0.61f, 0, 0, 1, -0.3f, -0.26f,
+R_ARC_TO, 0.52f, 0.52f, 0, 0, 1, -0.07f, -0.37f,
+R_CUBIC_TO, 0.03f, -0.15f, 0.1f, -0.26f, 0.23f, -0.34f,
+R_ARC_TO, 20.87f, 20.87f, 0, 0, 1, 4.43f, -1.73f,
+R_ARC_TO, 17.65f, 17.65f, 0, 0, 1, 4.69f, -0.64f,
+CLOSE,
+R_MOVE_TO, 0, 3.75f,
+R_CUBIC_TO, 2.68f, 0, 5.2f, 0.57f, 7.58f, 1.73f,
+R_CUBIC_TO, 2.38f, 1.13f, 4.35f, 2.76f, 5.93f, 4.91f,
+R_CUBIC_TO, 0.13f, 0.18f, 0.16f, 0.33f, 0.11f, 0.45f,
+R_ARC_TO, 0.58f, 0.58f, 0, 0, 1, -0.22f, 0.34f,
+R_CUBIC_TO, -0.1f, 0.1f, -0.24f, 0.15f, -0.41f, 0.15f,
+R_CUBIC_TO, -0.15f, 0, -0.29f, -0.09f, -0.41f, -0.26f,
+R_CUBIC_TO, -1.42f, -2, -3.25f, -3.52f, -5.47f, -4.57f,
+R_ARC_TO, 16.09f, 16.09f, 0, 0, 0, -7.09f, -1.61f,
+R_CUBIC_TO, -2.5f, 0, -4.85f, 0.54f, -7.05f, 1.61f,
+R_ARC_TO, 14.78f, 14.78f, 0, 0, 0, -5.44f, 4.58f,
+R_CUBIC_TO, -0.12f, 0.17f, -0.26f, 0.27f, -0.41f, 0.3f,
+R_ARC_TO, 0.52f, 0.52f, 0, 0, 1, -0.37f, -0.07f,
+R_ARC_TO, 0.56f, 0.56f, 0, 0, 1, -0.26f, -0.37f,
+R_CUBIC_TO, -0.02f, -0.15f, 0.03f, -0.3f, 0.15f, -0.45f,
+R_ARC_TO, 15.68f, 15.68f, 0, 0, 1, 5.81f, -4.95f,
+R_ARC_TO, 16.86f, 16.86f, 0, 0, 1, 7.58f, -1.76f,
+CLOSE,
+R_MOVE_TO, 0, 7.28f,
+R_CUBIC_TO, 2.33f, 0, 4.31f, 0.78f, 5.96f, 2.33f,
+R_CUBIC_TO, 1.68f, 1.53f, 2.51f, 3.41f, 2.51f, 5.66f,
+R_CUBIC_TO, 0, 0.18f, -0.05f, 0.31f, -0.15f, 0.41f,
+R_CUBIC_TO, -0.1f, 0.1f, -0.24f, 0.15f, -0.41f, 0.15f,
+R_ARC_TO, 0.65f, 0.65f, 0, 0, 1, -0.41f, -0.15f,
+R_ARC_TO, 0.56f, 0.56f, 0, 0, 1, -0.15f, -0.41f,
+R_CUBIC_TO, 0, -1.95f, -0.72f, -3.57f, -2.17f, -4.87f,
+R_CUBIC_TO, -1.45f, -1.32f, -3.17f, -1.99f, -5.17f, -1.99f,
+R_CUBIC_TO, -1.97f, 0, -3.67f, 0.66f, -5.1f, 1.99f,
+R_CUBIC_TO, -1.42f, 1.3f, -2.14f, 2.93f, -2.14f, 4.88f,
+R_CUBIC_TO, 0, 2.08f, 0.35f, 3.85f, 1.05f, 5.33f,
+R_CUBIC_TO, 0.73f, 1.45f, 1.79f, 2.9f, 3.19f, 4.35f,
+R_ARC_TO, 0.57f, 0.57f, 0, 0, 1, 0.19f, 0.41f,
+R_CUBIC_TO, 0, 0.15f, -0.06f, 0.28f, -0.19f, 0.38f,
+R_CUBIC_TO, -0.1f, 0.1f, -0.22f, 0.16f, -0.37f, 0.19f,
+R_ARC_TO, 0.57f, 0.57f, 0, 0, 1, -0.41f, -0.19f,
+R_CUBIC_TO, -1.45f, -1.52f, -2.59f, -3.1f, -3.41f, -4.72f,
+R_CUBIC_TO, -0.8f, -1.62f, -1.2f, -3.54f, -1.2f, -5.74f,
+R_CUBIC_TO, 0, -2.25f, 0.83f, -4.14f, 2.48f, -5.66f,
+R_CUBIC_TO, 1.65f, -1.55f, 3.63f, -2.33f, 5.93f, -2.33f,
+CLOSE,
+MOVE_TO, 200, 42.45f,
+R_CUBIC_TO, 0.18f, 0, 0.31f, 0.06f, 0.41f, 0.19f,
+R_CUBIC_TO, 0.1f, 0.1f, 0.15f, 0.22f, 0.15f, 0.38f,
+R_CUBIC_TO, 0, 1.95f, 0.71f, 3.56f, 2.14f, 4.84f,
+R_CUBIC_TO, 1.43f, 1.25f, 3.08f, 1.88f, 4.95f, 1.88f,
+R_CUBIC_TO, 0.18f, 0, 0.4f, -0.01f, 0.68f, -0.04f,
+R_CUBIC_TO, 0.28f, -0.02f, 0.56f, -0.06f, 0.86f, -0.11f,
+R_CUBIC_TO, 0.18f, -0.05f, 0.33f, -0.02f, 0.45f, 0.08f,
+R_CUBIC_TO, 0.13f, 0.08f, 0.2f, 0.19f, 0.23f, 0.34f,
+R_CUBIC_TO, 0.05f, 0.15f, 0.03f, 0.29f, -0.07f, 0.41f,
+R_ARC_TO, 0.67f, 0.67f, 0, 0, 1, -0.34f, 0.23f,
+R_CUBIC_TO, -0.45f, 0.13f, -0.85f, 0.2f, -1.2f, 0.23f,
+R_H_LINE_TO, -0.6f,
+R_CUBIC_TO, -2.22f, 0, -4.15f, -0.74f, -5.77f, -2.21f,
+R_CUBIC_TO, -1.62f, -1.5f, -2.44f, -3.37f, -2.44f, -5.62f,
+R_CUBIC_TO, 0, -0.15f, 0.05f, -0.28f, 0.15f, -0.37f,
+R_ARC_TO, 0.5f, 0.5f, 0, 0, 1, 0.41f, -0.19f,
+CLOSE,
+R_MOVE_TO, 0.04f, -3.71f,
+R_CUBIC_TO, 1.25f, 0, 2.31f, 0.41f, 3.19f, 1.24f,
+R_CUBIC_TO, 0.88f, 0.83f, 1.31f, 1.84f, 1.31f, 3.04f,
+R_CUBIC_TO, 0, 0.9f, 0.34f, 1.65f, 1.01f, 2.25f,
+R_CUBIC_TO, 0.7f, 0.6f, 1.5f, 0.9f, 2.4f, 0.9f,
+R_CUBIC_TO, 0.9f, 0, 1.68f, -0.3f, 2.33f, -0.9f,
+R_CUBIC_TO, 0.68f, -0.6f, 1.01f, -1.35f, 1.01f, -2.25f,
+R_CUBIC_TO, 0, -2.97f, -1.11f, -5.47f, -3.34f, -7.5f,
+R_CUBIC_TO, -2.2f, -2.03f, -4.82f, -3.04f, -7.87f, -3.04f,
+R_CUBIC_TO, -3.07f, 0, -5.71f, 1.01f, -7.91f, 3.04f,
+R_CUBIC_TO, -2.2f, 2.03f, -3.3f, 4.53f, -3.3f, 7.5f,
+R_CUBIC_TO, 0, 0.6f, 0.06f, 1.36f, 0.19f, 2.29f,
+R_CUBIC_TO, 0.13f, 0.93f, 0.4f, 2, 0.83f, 3.23f,
+R_CUBIC_TO, 0.08f, 0.18f, 0.08f, 0.33f, 0, 0.45f,
+R_CUBIC_TO, -0.07f, 0.1f, -0.17f, 0.19f, -0.3f, 0.26f,
+R_CUBIC_TO, -0.15f, 0.05f, -0.3f, 0.05f, -0.45f, 0,
+R_CUBIC_TO, -0.15f, -0.05f, -0.26f, -0.16f, -0.34f, -0.34f,
+R_CUBIC_TO, -0.35f, -0.95f, -0.61f, -1.91f, -0.79f, -2.89f,
+R_ARC_TO, 16.95f, 16.95f, 0, 0, 1, -0.26f, -3,
+R_CUBIC_TO, 0, -3.28f, 1.21f, -6.04f, 3.64f, -8.29f,
+R_CUBIC_TO, 2.45f, -2.27f, 5.34f, -3.41f, 8.66f, -3.41f,
+R_CUBIC_TO, 3.4f, 0, 6.31f, 1.13f, 8.74f, 3.38f,
+R_CUBIC_TO, 2.43f, 2.25f, 3.64f, 5.03f, 3.64f, 8.33f,
+R_CUBIC_TO, 0, 1.2f, -0.44f, 2.21f, -1.31f, 3.04f,
+R_CUBIC_TO, -0.85f, 0.83f, -1.9f, 1.24f, -3.15f, 1.24f,
+R_CUBIC_TO, -1.25f, 0, -2.33f, -0.41f, -3.22f, -1.24f,
+R_CUBIC_TO, -0.87f, -0.82f, -1.31f, -1.84f, -1.31f, -3.04f,
+R_CUBIC_TO, 0, -0.9f, -0.34f, -1.65f, -1.01f, -2.25f,
+R_CUBIC_TO, -0.65f, -0.6f, -1.44f, -0.9f, -2.36f, -0.9f,
+R_CUBIC_TO, -0.9f, 0, -1.69f, 0.3f, -2.36f, 0.9f,
+R_CUBIC_TO, -0.67f, 0.6f, -1.01f, 1.35f, -1.01f, 2.25f,
+R_CUBIC_TO, 0, 2.53f, 0.75f, 4.63f, 2.25f, 6.3f,
+R_CUBIC_TO, 1.53f, 1.67f, 3.44f, 2.85f, 5.74f, 3.52f,
+R_CUBIC_TO, 0.2f, 0.08f, 0.33f, 0.18f, 0.38f, 0.3f,
+R_ARC_TO, 0.76f, 0.76f, 0, 0, 1, 0.04f, 0.41f,
+R_ARC_TO, 0.6f, 0.6f, 0, 0, 1, -0.26f, 0.34f,
+R_CUBIC_TO, -0.1f, 0.08f, -0.24f, 0.1f, -0.41f, 0.08f,
+R_CUBIC_TO, -2.57f, -0.67f, -4.7f, -1.98f, -6.37f, -3.9f,
+R_CUBIC_TO, -1.65f, -1.92f, -2.47f, -4.28f, -2.47f, -7.05f,
+R_CUBIC_TO, 0, -1.2f, 0.44f, -2.21f, 1.31f, -3.04f,
+R_ARC_TO, 4.56f, 4.56f, 0, 0, 1, 3.19f, -1.24f,
+CLOSE
diff --git a/chrome/app/vector_icons/webauthn/passkey_header_dark.icon b/chrome/app/vector_icons/webauthn/passkey_header_dark.icon
new file mode 100644
index 0000000..ff20ec23
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_header_dark.icon
@@ -0,0 +1,366 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0x3C, 0x40, 0x43,
+MOVE_TO, 152.39f, 15.35f,
+R_CUBIC_TO, 3.03f, -4.13f, 9.2f, -4.13f, 12.23f, 0,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 9.17f, 2.46f,
+R_CUBIC_TO, 4.69f, -2.07f, 10.03f, 1.02f, 10.59f, 6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 6.71f, 6.71f,
+R_CUBIC_TO, 5.09f, 0.56f, 8.18f, 5.9f, 6.11f, 10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 2.46f, 9.17f,
+R_CUBIC_TO, 4.13f, 3.03f, 4.13f, 9.2f, 0, 12.23f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -2.46f, 9.17f,
+R_CUBIC_TO, 2.07f, 4.69f, -1.02f, 10.03f, -6.11f, 10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -6.71f, 6.71f,
+R_CUBIC_TO, -0.56f, 5.09f, -5.9f, 8.18f, -10.59f, 6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -9.17f, 2.46f,
+R_CUBIC_TO, -3.03f, 4.13f, -9.2f, 4.13f, -12.23f, 0,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -9.17f, -2.46f,
+R_CUBIC_TO, -4.69f, 2.07f, -10.03f, -1.02f, -10.59f, -6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -6.71f, -6.71f,
+R_CUBIC_TO, -5.09f, -0.56f, -8.18f, -5.9f, -6.11f, -10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, -2.46f, -9.17f,
+R_CUBIC_TO, -4.13f, -3.03f, -4.13f, -9.2f, 0, -12.23f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 2.46f, -9.17f,
+R_CUBIC_TO, -2.07f, -4.69f, 1.02f, -10.03f, 6.11f, -10.59f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 6.71f, -6.71f,
+R_CUBIC_TO, 0.56f, -5.09f, 5.9f, -8.18f, 10.59f, -6.11f,
+R_ARC_TO, 7.58f, 7.58f, 0, 0, 0, 9.17f, -2.46f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 156.58f, 54.76f,
+R_CUBIC_TO, -2.78f, 0, -5.16f, -1, -7.16f, -2.99f,
+R_CUBIC_TO, -1.99f, -1.99f, -2.99f, -4.38f, -2.99f, -7.16f,
+R_CUBIC_TO, 0, -2.82f, 1, -5.22f, 2.99f, -7.19f,
+R_CUBIC_TO, 1.99f, -1.97f, 4.38f, -2.96f, 7.16f, -2.96f,
+R_CUBIC_TO, 2.78f, 0, 5.17f, 1, 7.16f, 2.99f,
+R_CUBIC_TO, 1.99f, 1.99f, 2.99f, 4.38f, 2.99f, 7.16f,
+R_CUBIC_TO, 0, 2.78f, -1, 5.17f, -2.99f, 7.16f,
+R_CUBIC_TO, -1.99f, 2, -4.38f, 2.99f, -7.16f, 2.99f,
+CLOSE,
+R_MOVE_TO, 0, -5.5f,
+R_CUBIC_TO, 1.29f, 0, 2.39f, -0.45f, 3.29f, -1.36f,
+R_CUBIC_TO, 0.91f, -0.91f, 1.36f, -2, 1.36f, -3.29f,
+R_CUBIC_TO, 0, -1.29f, -0.45f, -2.39f, -1.36f, -3.29f,
+R_CUBIC_TO, -0.91f, -0.9f, -2, -1.36f, -3.29f, -1.36f,
+R_CUBIC_TO, -1.29f, 0, -2.39f, 0.45f, -3.29f, 1.36f,
+R_CUBIC_TO, -0.91f, 0.91f, -1.36f, 2.01f, -1.36f, 3.29f,
+R_CUBIC_TO, 0, 1.29f, 0.45f, 2.39f, 1.36f, 3.29f,
+R_CUBIC_TO, 0.91f, 0.91f, 2, 1.36f, 3.29f, 1.36f,
+CLOSE,
+MOVE_TO, 136.77f, 75.06f,
+R_V_LINE_TO, -7.19f,
+R_CUBIC_TO, 0, -1.49f, 0.36f, -2.85f, 1.09f, -4.08f,
+R_ARC_TO, 7.14f, 7.14f, 0, 0, 1, 3.02f, -2.81f,
+R_CUBIC_TO, 2.01f, -1.05f, 4.33f, -1.94f, 6.95f, -2.69f,
+R_CUBIC_TO, 2.62f, -0.74f, 5.5f, -1.12f, 8.64f, -1.12f,
+R_CUBIC_TO, 0.81f, 0, 1.63f, 0.03f, 2.48f, 0.09f,
+R_CUBIC_TO, 0.85f, 0.06f, 1.63f, 0.15f, 2.36f, 0.27f,
+R_CUBIC_TO, 0, 1.05f, 0.13f, 2.08f, 0.39f, 3.08f,
+R_ARC_TO, 10.01f, 10.01f, 0, 0, 0, 1.18f, 2.78f,
+R_ARC_TO, 23.47f, 23.47f, 0, 0, 0, -3.05f, -0.54f,
+R_ARC_TO, 29.87f, 29.87f, 0, 0, 0, -3.35f, -0.18f,
+R_CUBIC_TO, -2.82f, 0, -5.34f, 0.34f, -7.55f, 1.03f,
+R_CUBIC_TO, -2.21f, 0.68f, -4.03f, 1.39f, -5.44f, 2.11f,
+R_ARC_TO, 2.01f, 2.01f, 0, 0, 0, -0.91f, 0.88f,
+R_ARC_TO, 2.62f, 2.62f, 0, 0, 0, -0.3f, 1.24f,
+R_V_LINE_TO, 1.63f,
+R_H_LINE_TO, 23.8f,
+R_V_LINE_TO, 5.5f,
+R_H_LINE_TO, -29.3f,
+CLOSE,
+R_MOVE_TO, 37.34f, 2.24f,
+R_LINE_TO, -3.2f, -3.81f,
+R_V_LINE_TO, -9.12f,
+R_ARC_TO, 7.79f, 7.79f, 0, 0, 1, -3.47f, -2.72f,
+R_CUBIC_TO, -0.91f, -1.25f, -1.36f, -2.66f, -1.36f, -4.23f,
+R_CUBIC_TO, 0, -2.05f, 0.73f, -3.81f, 2.17f, -5.26f,
+R_CUBIC_TO, 1.45f, -1.45f, 3.2f, -2.17f, 5.26f, -2.17f,
+R_CUBIC_TO, 2.05f, 0, 3.81f, 0.73f, 5.26f, 2.17f,
+R_CUBIC_TO, 1.45f, 1.45f, 2.17f, 3.2f, 2.17f, 5.26f,
+R_CUBIC_TO, 0, 1.61f, -0.45f, 3.03f, -1.36f, 4.26f,
+R_ARC_TO, 7.87f, 7.87f, 0, 0, 1, -3.47f, 2.69f,
+R_V_LINE_TO, 0.54f,
+R_LINE_TO, 2.48f, 2.48f,
+R_LINE_TO, -2.42f, 2.42f,
+R_LINE_TO, 2.42f, 2.42f,
+R_LINE_TO, -4.47f, 5.08f,
+CLOSE,
+R_MOVE_TO, -0.6f, -16.43f,
+R_CUBIC_TO, 0.97f, 0, 1.78f, -0.33f, 2.45f, -1,
+R_CUBIC_TO, 0.66f, -0.66f, 1, -1.48f, 1, -2.45f,
+R_CUBIC_TO, 0, -0.97f, -0.33f, -1.78f, -1, -2.45f,
+R_CUBIC_TO, -0.66f, -0.66f, -1.48f, -0.99f, -2.45f, -0.99f,
+R_CUBIC_TO, -0.97f, 0, -1.78f, 0.33f, -2.45f, 1,
+R_CUBIC_TO, -0.66f, 0.67f, -1, 1.48f, -1, 2.45f,
+R_CUBIC_TO, 0, 0.97f, 0.33f, 1.78f, 1, 2.45f,
+R_CUBIC_TO, 0.66f, 0.67f, 1.48f, 1, 2.45f, 1,
+CLOSE,
+MOVE_TO, 156.58f, 44.61f,
+R_H_LINE_TO, -0.03f,
+R_H_LINE_TO, 0.03f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+MOVE_TO, 98, 71.5f,
+R_V_LINE_TO, -2.66f,
+R_H_LINE_TO, 30,
+V_LINE_TO, 71.5f,
+H_LINE_TO, 98,
+CLOSE,
+R_MOVE_TO, 1.58f, -9.3f,
+R_LINE_TO, -1.72f, -0.97f,
+R_LINE_TO, 1.39f, -2.4f,
+H_LINE_TO, 96.5f,
+R_V_LINE_TO, -1.99f,
+R_H_LINE_TO, 2.74f,
+R_LINE_TO, -1.39f, -2.36f,
+R_LINE_TO, 1.73f, -0.97f,
+R_LINE_TO, 1.35f, 2.36f,
+R_LINE_TO, 1.35f, -2.36f,
+R_LINE_TO, 1.73f, 0.98f,
+R_LINE_TO, -1.39f, 2.36f,
+R_H_LINE_TO, 2.74f,
+R_V_LINE_TO, 1.99f,
+R_H_LINE_TO, -2.74f,
+R_LINE_TO, 1.39f, 2.4f,
+R_LINE_TO, -1.72f, 0.98f,
+R_LINE_TO, -1.35f, -2.4f,
+R_LINE_TO, -1.35f, 2.4f,
+CLOSE,
+R_MOVE_TO, 12.08f, 0,
+R_LINE_TO, -1.72f, -1.01f,
+R_LINE_TO, 1.39f, -2.4f,
+R_H_LINE_TO, -2.74f,
+V_LINE_TO, 56.8f,
+R_H_LINE_TO, 2.74f,
+R_LINE_TO, -1.39f, -2.36f,
+R_LINE_TO, 1.73f, -0.97f,
+R_LINE_TO, 1.35f, 2.36f,
+R_LINE_TO, 1.35f, -2.36f,
+R_LINE_TO, 1.73f, 0.98f,
+R_LINE_TO, -1.39f, 2.36f,
+R_H_LINE_TO, 2.74f,
+R_V_LINE_TO, 1.99f,
+R_H_LINE_TO, -2.74f,
+R_LINE_TO, 1.39f, 2.4f,
+R_LINE_TO, -1.72f, 1.01f,
+R_LINE_TO, -1.35f, -2.4f,
+R_LINE_TO, -1.35f, 2.4f,
+CLOSE,
+R_MOVE_TO, 12.08f, 0,
+LINE_TO, 122, 61.19f,
+R_LINE_TO, 1.39f, -2.4f,
+R_H_LINE_TO, -2.74f,
+V_LINE_TO, 56.8f,
+R_H_LINE_TO, 2.74f,
+LINE_TO, 122, 54.44f,
+R_LINE_TO, 1.73f, -0.97f,
+R_LINE_TO, 1.35f, 2.36f,
+R_LINE_TO, 1.35f, -2.36f,
+R_LINE_TO, 1.73f, 0.98f,
+R_LINE_TO, -1.39f, 2.36f,
+R_H_LINE_TO, 2.74f,
+R_V_LINE_TO, 1.99f,
+R_H_LINE_TO, -2.74f,
+R_LINE_TO, 1.39f, 2.4f,
+R_LINE_TO, -1.72f, 1.01f,
+R_LINE_TO, -1.35f, -2.4f,
+R_LINE_TO, -1.35f, 2.4f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+CIRCLE,  92, 17, 1,
+CIRCLE,  96, 17, 1,
+CIRCLE,  84, 17, 1,
+CIRCLE,  88, 17, 1,
+CIRCLE,  100, 17, 1,
+CIRCLE,  107, 86, 1,
+CIRCLE,  99, 86, 1,
+CIRCLE,  103, 86, 1,
+CIRCLE,  111, 86, 1,
+CIRCLE,  229, 20, 1,
+CIRCLE,  233, 20, 1,
+CIRCLE,  221, 20, 1,
+CIRCLE,  225, 20, 1,
+CIRCLE,  115, 86, 1,
+CIRCLE,  281, 37, 1,
+CIRCLE,  285, 37, 1,
+CIRCLE,  76, 21, 1,
+CIRCLE,  80, 21, 1,
+CIRCLE,  64, 21, 1,
+CIRCLE,  84, 21, 1,
+CIRCLE,  88, 21, 1,
+CIRCLE,  273, 37, 1,
+CIRCLE,  72, 21, 1,
+CIRCLE,  277, 37, 1,
+CIRCLE,  289, 37, 1,
+CIRCLE,  293, 37, 1,
+CIRCLE,  297, 37, 1,
+CIRCLE,  91, 90, 1,
+CIRCLE,  95, 90, 1,
+CIRCLE,  99, 90, 1,
+CIRCLE,  103, 90, 1,
+CIRCLE,  107, 90, 1,
+CIRCLE,  87, 90, 1,
+CIRCLE,  265, 41, 1,
+CIRCLE,  269, 41, 1,
+CIRCLE,  273, 41, 1,
+CIRCLE,  253, 90, 1,
+CIRCLE,  257, 90, 1,
+CIRCLE,  249, 86, 1,
+CIRCLE,  253, 86, 1,
+CIRCLE,  261, 90, 1,
+CIRCLE,  39, 69, 1,
+CIRCLE,  257, 86, 1,
+CIRCLE,  43, 69, 1,
+CIRCLE,  35, 65, 1,
+CIRCLE,  233, 90, 1,
+CIRCLE,  249, 90, 1,
+CIRCLE,  237, 90, 1,
+CIRCLE,  241, 90, 1,
+CIRCLE,  245, 90, 1,
+CIRCLE,  245, 86, 1,
+CIRCLE,  39, 65, 1,
+CIRCLE,  47, 69, 1,
+CIRCLE,  43, 65, 1,
+CIRCLE,  19, 69, 1,
+CIRCLE,  35, 69, 1,
+CIRCLE,  23, 69, 1,
+CIRCLE,  27, 69, 1,
+CIRCLE,  31, 69, 1,
+CIRCLE,  31, 65, 1,
+CIRCLE,  261, 41, 1,
+CIRCLE,  277, 41, 1,
+CIRCLE,  281, 41, 1,
+CIRCLE,  70, 44, 3,
+CIRCLE,  78, 44, 3,
+CIRCLE,  86, 44, 3,
+CIRCLE,  54, 44, 3,
+CIRCLE,  220, 69, 3,
+CIRCLE,  228, 69, 3,
+CIRCLE,  236, 69, 3,
+CIRCLE,  252, 69, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+MOVE_TO, 200.04f, 24,
+R_CUBIC_TO, 1.63f, 0, 3.2f, 0.2f, 4.72f, 0.6f,
+R_CUBIC_TO, 1.55f, 0.4f, 3.04f, 0.96f, 4.46f, 1.69f,
+R_CUBIC_TO, 0.18f, 0.08f, 0.28f, 0.19f, 0.3f, 0.34f,
+R_ARC_TO, 0.65f, 0.65f, 0, 0, 1, -0.04f, 0.38f,
+R_ARC_TO, 0.86f, 0.86f, 0, 0, 1, -0.3f, 0.3f,
+R_CUBIC_TO, -0.12f, 0.08f, -0.29f, 0.08f, -0.49f, 0,
+R_ARC_TO, 17.7f, 17.7f, 0, 0, 0, -4.2f, -1.57f,
+R_ARC_TO, 17.75f, 17.75f, 0, 0, 0, -4.46f, -0.56f,
+R_CUBIC_TO, -1.5f, 0, -2.97f, 0.18f, -4.42f, 0.53f,
+R_CUBIC_TO, -1.42f, 0.35f, -2.79f, 0.89f, -4.09f, 1.61f,
+R_CUBIC_TO, -0.17f, 0.08f, -0.32f, 0.09f, -0.45f, 0.04f,
+R_ARC_TO, 0.61f, 0.61f, 0, 0, 1, -0.3f, -0.26f,
+R_ARC_TO, 0.52f, 0.52f, 0, 0, 1, -0.07f, -0.37f,
+R_CUBIC_TO, 0.03f, -0.15f, 0.1f, -0.26f, 0.23f, -0.34f,
+R_ARC_TO, 20.87f, 20.87f, 0, 0, 1, 4.43f, -1.73f,
+R_ARC_TO, 17.66f, 17.66f, 0, 0, 1, 4.69f, -0.64f,
+CLOSE,
+R_MOVE_TO, 0, 3.75f,
+R_CUBIC_TO, 2.68f, 0, 5.2f, 0.57f, 7.58f, 1.73f,
+R_CUBIC_TO, 2.38f, 1.13f, 4.35f, 2.76f, 5.93f, 4.91f,
+R_CUBIC_TO, 0.13f, 0.18f, 0.16f, 0.33f, 0.11f, 0.45f,
+R_ARC_TO, 0.58f, 0.58f, 0, 0, 1, -0.22f, 0.34f,
+R_CUBIC_TO, -0.1f, 0.1f, -0.24f, 0.15f, -0.41f, 0.15f,
+R_CUBIC_TO, -0.15f, 0, -0.29f, -0.09f, -0.41f, -0.26f,
+R_CUBIC_TO, -1.42f, -2, -3.25f, -3.52f, -5.47f, -4.57f,
+R_ARC_TO, 16.08f, 16.08f, 0, 0, 0, -7.09f, -1.61f,
+R_CUBIC_TO, -2.5f, 0, -4.85f, 0.54f, -7.05f, 1.61f,
+R_ARC_TO, 14.79f, 14.79f, 0, 0, 0, -5.44f, 4.58f,
+R_CUBIC_TO, -0.12f, 0.17f, -0.26f, 0.27f, -0.41f, 0.3f,
+R_ARC_TO, 0.52f, 0.52f, 0, 0, 1, -0.37f, -0.07f,
+R_ARC_TO, 0.56f, 0.56f, 0, 0, 1, -0.26f, -0.37f,
+R_CUBIC_TO, -0.02f, -0.15f, 0.03f, -0.3f, 0.15f, -0.45f,
+R_ARC_TO, 15.68f, 15.68f, 0, 0, 1, 5.81f, -4.95f,
+R_ARC_TO, 16.86f, 16.86f, 0, 0, 1, 7.58f, -1.76f,
+CLOSE,
+R_MOVE_TO, 0, 7.28f,
+R_CUBIC_TO, 2.33f, 0, 4.31f, 0.78f, 5.96f, 2.33f,
+R_CUBIC_TO, 1.68f, 1.53f, 2.51f, 3.41f, 2.51f, 5.66f,
+R_CUBIC_TO, 0, 0.18f, -0.05f, 0.31f, -0.15f, 0.41f,
+R_CUBIC_TO, -0.1f, 0.1f, -0.24f, 0.15f, -0.41f, 0.15f,
+R_ARC_TO, 0.64f, 0.64f, 0, 0, 1, -0.41f, -0.15f,
+R_ARC_TO, 0.56f, 0.56f, 0, 0, 1, -0.15f, -0.41f,
+R_CUBIC_TO, 0, -1.95f, -0.72f, -3.57f, -2.17f, -4.87f,
+R_CUBIC_TO, -1.45f, -1.32f, -3.17f, -1.99f, -5.17f, -1.99f,
+R_CUBIC_TO, -1.97f, 0, -3.67f, 0.66f, -5.1f, 1.99f,
+R_CUBIC_TO, -1.42f, 1.3f, -2.14f, 2.93f, -2.14f, 4.88f,
+R_CUBIC_TO, 0, 2.08f, 0.35f, 3.85f, 1.05f, 5.33f,
+R_CUBIC_TO, 0.73f, 1.45f, 1.79f, 2.9f, 3.19f, 4.35f,
+R_ARC_TO, 0.57f, 0.57f, 0, 0, 1, 0.19f, 0.41f,
+R_CUBIC_TO, 0, 0.15f, -0.06f, 0.28f, -0.19f, 0.38f,
+R_CUBIC_TO, -0.1f, 0.1f, -0.22f, 0.16f, -0.37f, 0.19f,
+R_ARC_TO, 0.57f, 0.57f, 0, 0, 1, -0.41f, -0.19f,
+R_CUBIC_TO, -1.45f, -1.52f, -2.59f, -3.1f, -3.41f, -4.72f,
+R_CUBIC_TO, -0.8f, -1.62f, -1.2f, -3.54f, -1.2f, -5.74f,
+R_CUBIC_TO, 0, -2.25f, 0.83f, -4.14f, 2.48f, -5.66f,
+R_CUBIC_TO, 1.65f, -1.55f, 3.63f, -2.33f, 5.93f, -2.33f,
+CLOSE,
+MOVE_TO, 200, 42.45f,
+R_ARC_TO, 0.5f, 0.5f, 0, 0, 1, 0.41f, 0.19f,
+R_CUBIC_TO, 0.1f, 0.1f, 0.15f, 0.22f, 0.15f, 0.38f,
+R_CUBIC_TO, 0, 1.95f, 0.71f, 3.56f, 2.14f, 4.84f,
+R_CUBIC_TO, 1.43f, 1.25f, 3.08f, 1.88f, 4.95f, 1.88f,
+R_ARC_TO, 11.18f, 11.18f, 0, 0, 0, 1.54f, -0.15f,
+R_CUBIC_TO, 0.18f, -0.05f, 0.33f, -0.02f, 0.45f, 0.08f,
+R_CUBIC_TO, 0.13f, 0.08f, 0.2f, 0.19f, 0.23f, 0.34f,
+R_CUBIC_TO, 0.05f, 0.15f, 0.03f, 0.29f, -0.07f, 0.41f,
+R_ARC_TO, 0.67f, 0.67f, 0, 0, 1, -0.34f, 0.23f,
+R_CUBIC_TO, -0.45f, 0.13f, -0.85f, 0.2f, -1.2f, 0.23f,
+R_H_LINE_TO, -0.6f,
+R_CUBIC_TO, -2.22f, 0, -4.15f, -0.74f, -5.77f, -2.21f,
+R_CUBIC_TO, -1.62f, -1.5f, -2.44f, -3.37f, -2.44f, -5.62f,
+R_CUBIC_TO, 0, -0.15f, 0.05f, -0.28f, 0.15f, -0.37f,
+R_ARC_TO, 0.5f, 0.5f, 0, 0, 1, 0.41f, -0.19f,
+CLOSE,
+R_MOVE_TO, 0.04f, -3.71f,
+R_CUBIC_TO, 1.25f, 0, 2.31f, 0.41f, 3.19f, 1.24f,
+R_CUBIC_TO, 0.88f, 0.83f, 1.31f, 1.84f, 1.31f, 3.04f,
+R_CUBIC_TO, 0, 0.9f, 0.34f, 1.65f, 1.01f, 2.25f,
+R_CUBIC_TO, 0.7f, 0.6f, 1.5f, 0.9f, 2.4f, 0.9f,
+R_CUBIC_TO, 0.9f, 0, 1.68f, -0.3f, 2.33f, -0.9f,
+R_CUBIC_TO, 0.68f, -0.6f, 1.01f, -1.35f, 1.01f, -2.25f,
+R_CUBIC_TO, 0, -2.97f, -1.11f, -5.47f, -3.34f, -7.5f,
+R_CUBIC_TO, -2.2f, -2.03f, -4.82f, -3.04f, -7.87f, -3.04f,
+R_CUBIC_TO, -3.07f, 0, -5.71f, 1.01f, -7.91f, 3.04f,
+R_CUBIC_TO, -2.2f, 2.03f, -3.3f, 4.53f, -3.3f, 7.5f,
+R_CUBIC_TO, 0, 0.6f, 0.06f, 1.36f, 0.19f, 2.29f,
+R_CUBIC_TO, 0.13f, 0.93f, 0.4f, 2, 0.83f, 3.23f,
+R_CUBIC_TO, 0.08f, 0.18f, 0.08f, 0.33f, 0, 0.45f,
+R_CUBIC_TO, -0.07f, 0.1f, -0.17f, 0.19f, -0.3f, 0.26f,
+R_CUBIC_TO, -0.15f, 0.05f, -0.3f, 0.05f, -0.45f, 0,
+R_CUBIC_TO, -0.15f, -0.05f, -0.26f, -0.16f, -0.34f, -0.34f,
+R_CUBIC_TO, -0.35f, -0.95f, -0.61f, -1.91f, -0.79f, -2.89f,
+R_ARC_TO, 16.95f, 16.95f, 0, 0, 1, -0.26f, -3,
+R_CUBIC_TO, 0, -3.28f, 1.21f, -6.04f, 3.64f, -8.29f,
+R_CUBIC_TO, 2.45f, -2.27f, 5.34f, -3.41f, 8.66f, -3.41f,
+R_CUBIC_TO, 3.4f, 0, 6.31f, 1.13f, 8.74f, 3.38f,
+R_CUBIC_TO, 2.43f, 2.25f, 3.64f, 5.03f, 3.64f, 8.33f,
+R_CUBIC_TO, 0, 1.2f, -0.44f, 2.21f, -1.31f, 3.04f,
+R_CUBIC_TO, -0.85f, 0.83f, -1.9f, 1.24f, -3.15f, 1.24f,
+R_CUBIC_TO, -1.25f, 0, -2.33f, -0.41f, -3.22f, -1.24f,
+R_CUBIC_TO, -0.87f, -0.82f, -1.31f, -1.84f, -1.31f, -3.04f,
+R_CUBIC_TO, 0, -0.9f, -0.34f, -1.65f, -1.01f, -2.25f,
+R_CUBIC_TO, -0.65f, -0.6f, -1.44f, -0.9f, -2.36f, -0.9f,
+R_CUBIC_TO, -0.9f, 0, -1.69f, 0.3f, -2.36f, 0.9f,
+R_CUBIC_TO, -0.67f, 0.6f, -1.01f, 1.35f, -1.01f, 2.25f,
+R_CUBIC_TO, 0, 2.53f, 0.75f, 4.63f, 2.25f, 6.3f,
+R_CUBIC_TO, 1.53f, 1.67f, 3.44f, 2.85f, 5.74f, 3.52f,
+R_CUBIC_TO, 0.2f, 0.08f, 0.33f, 0.18f, 0.38f, 0.3f,
+R_ARC_TO, 0.76f, 0.76f, 0, 0, 1, 0.04f, 0.41f,
+R_ARC_TO, 0.6f, 0.6f, 0, 0, 1, -0.26f, 0.34f,
+R_CUBIC_TO, -0.1f, 0.08f, -0.24f, 0.1f, -0.41f, 0.08f,
+R_CUBIC_TO, -2.57f, -0.67f, -4.7f, -1.98f, -6.37f, -3.9f,
+R_CUBIC_TO, -1.65f, -1.92f, -2.47f, -4.28f, -2.47f, -7.05f,
+R_CUBIC_TO, 0, -1.2f, 0.44f, -2.21f, 1.31f, -3.04f,
+R_ARC_TO, 4.56f, 4.56f, 0, 0, 1, 3.19f, -1.24f,
+CLOSE
diff --git a/chrome/app/vector_icons/webauthn/passkey_phone.icon b/chrome/app/vector_icons/webauthn/passkey_phone.icon
new file mode 100644
index 0000000..fce10bd6
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_phone.icon
@@ -0,0 +1,136 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+CIRCLE, 92, 16, 1,
+CIRCLE, 96, 16, 1,
+CIRCLE, 84, 16, 1,
+CIRCLE, 88, 16, 1,
+CIRCLE, 100, 16, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 20, 1,
+CIRCLE, 80, 20, 1,
+CIRCLE, 64, 20, 1,
+CIRCLE, 84, 20, 1,
+CIRCLE, 88, 20, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 20, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+ROUND_RECT, 139, 14, 38, 82, 3,
+NEW_PATH,
+STROKE, 2,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+ROUND_RECT, 139, 14, 38, 82, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+MOVE_TO, 161.38f, 59.62f,
+V_LINE_TO, 54.82f,
+R_LINE_TO, 0.01f, -0.11f,
+R_ARC_TO, 3.27f, 3.27f, 0, 0, 0, -0.78f, -2.41f,
+R_ARC_TO, 3.16f, 3.16f, 0, 0, 0, -1.61f, -0.99f,
+R_ARC_TO, 3.09f, 3.09f, 0, 0, 0, -1.49f, 0,
+R_H_LINE_TO, 0,
+R_ARC_TO, 3.14f, 3.14f, 0, 0, 0, -1.79f, 1.22f,
+R_ARC_TO, 3.27f, 3.27f, 0, 0, 0, -0.6f, 2.18f,
+R_LINE_TO, 0.01f, 0.11f,
+R_V_LINE_TO, 4.8f,
+R_H_LINE_TO, 6.25f,
+CLOSE,
+R_MOVE_TO, -7.81f, -4.8f,
+R_ARC_TO, 4.98f, 4.98f, 0, 0, 1, 0.87f, -3.18f,
+R_ARC_TO, 4.77f, 4.77f, 0, 0, 1, 2.65f, -1.88f,
+R_V_LINE_TO, -0.55f,
+R_ARC_TO, 1.23f, 1.23f, 0, 0, 1, 0.34f, -0.86f,
+R_ARC_TO, 1.17f, 1.17f, 0, 0, 1, 0.83f, -0.36f,
+R_ARC_TO, 1.15f, 1.15f, 0, 0, 1, 0.83f, 0.36f,
+R_ARC_TO, 1.22f, 1.22f, 0, 0, 1, 0.34f, 0.86f,
+R_V_LINE_TO, 0.54f,
+R_ARC_TO, 4.76f, 4.76f, 0, 0, 1, 2.65f, 1.88f,
+R_ARC_TO, 4.94f, 4.94f, 0, 0, 1, 0.87f, 3.18f,
+R_V_LINE_TO, 4.8f,
+R_H_LINE_TO, 1.56f,
+R_V_LINE_TO, 1.6f,
+H_LINE_TO, 152,
+R_V_LINE_TO, -1.6f,
+R_H_LINE_TO, 1.56f,
+R_V_LINE_TO, -4.8f,
+CLOSE,
+R_MOVE_TO, 4.69f, 8.81f,
+R_ARC_TO, 1.55f, 1.55f, 0, 0, 0, 1.1f, -0.47f,
+R_CUBIC_TO, 0.29f, -0.3f, 0.46f, -0.71f, 0.46f, -1.13f,
+R_H_LINE_TO, -3.12f,
+R_ARC_TO, 1.62f, 1.62f, 0, 0, 0, 0.53f, 1.2f,
+R_CUBIC_TO, 0.28f, 0.26f, 0.65f, 0.4f, 1.03f, 0.4f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+ROUND_RECT, 149, 92, 17.143, 2, 1,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+STROKE, 2,
+CIRCLE, 158, 56, 13,
+CIRCLE, 158, 56, 27,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xFF, 0xFF, 0xFF,
+CIRCLE, 144.055, 20, 2
diff --git a/chrome/app/vector_icons/webauthn/passkey_phone_dark.icon b/chrome/app/vector_icons/webauthn/passkey_phone_dark.icon
new file mode 100644
index 0000000..a5636e6
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_phone_dark.icon
@@ -0,0 +1,136 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+CIRCLE, 92, 16, 1,
+CIRCLE, 96, 16, 1,
+CIRCLE, 84, 16, 1,
+CIRCLE, 88, 16, 1,
+CIRCLE, 100, 16, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 20, 1,
+CIRCLE, 80, 20, 1,
+CIRCLE, 64, 20, 1,
+CIRCLE, 84, 20, 1,
+CIRCLE, 88, 20, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 20, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x3C, 0x40, 0x43,
+ROUND_RECT, 139, 14, 38, 82, 3,
+NEW_PATH,
+STROKE, 2,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+ROUND_RECT, 139, 14, 38, 82, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+MOVE_TO, 161.38f, 59.62f,
+V_LINE_TO, 54.82f,
+R_LINE_TO, 0.01f, -0.11f,
+R_ARC_TO, 3.27f, 3.27f, 0, 0, 0, -0.78f, -2.41f,
+R_ARC_TO, 3.16f, 3.16f, 0, 0, 0, -1.61f, -0.99f,
+R_ARC_TO, 3.09f, 3.09f, 0, 0, 0, -1.49f, 0,
+R_H_LINE_TO, 0,
+R_ARC_TO, 3.14f, 3.14f, 0, 0, 0, -1.79f, 1.22f,
+R_ARC_TO, 3.27f, 3.27f, 0, 0, 0, -0.6f, 2.18f,
+R_LINE_TO, 0.01f, 0.11f,
+R_V_LINE_TO, 4.8f,
+R_H_LINE_TO, 6.25f,
+CLOSE,
+R_MOVE_TO, -7.81f, -4.8f,
+R_ARC_TO, 4.98f, 4.98f, 0, 0, 1, 0.87f, -3.18f,
+R_ARC_TO, 4.77f, 4.77f, 0, 0, 1, 2.65f, -1.88f,
+R_V_LINE_TO, -0.55f,
+R_ARC_TO, 1.23f, 1.23f, 0, 0, 1, 0.34f, -0.86f,
+R_ARC_TO, 1.17f, 1.17f, 0, 0, 1, 0.83f, -0.36f,
+R_ARC_TO, 1.15f, 1.15f, 0, 0, 1, 0.83f, 0.36f,
+R_ARC_TO, 1.22f, 1.22f, 0, 0, 1, 0.34f, 0.86f,
+R_V_LINE_TO, 0.54f,
+R_ARC_TO, 4.76f, 4.76f, 0, 0, 1, 2.65f, 1.88f,
+R_ARC_TO, 4.94f, 4.94f, 0, 0, 1, 0.87f, 3.18f,
+R_V_LINE_TO, 4.8f,
+R_H_LINE_TO, 1.56f,
+R_V_LINE_TO, 1.6f,
+H_LINE_TO, 152,
+R_V_LINE_TO, -1.6f,
+R_H_LINE_TO, 1.56f,
+R_V_LINE_TO, -4.8f,
+CLOSE,
+R_MOVE_TO, 4.69f, 8.81f,
+R_ARC_TO, 1.55f, 1.55f, 0, 0, 0, 1.1f, -0.47f,
+R_CUBIC_TO, 0.29f, -0.3f, 0.46f, -0.71f, 0.46f, -1.13f,
+R_H_LINE_TO, -3.12f,
+R_ARC_TO, 1.62f, 1.62f, 0, 0, 0, 0.53f, 1.2f,
+R_CUBIC_TO, 0.28f, 0.26f, 0.65f, 0.4f, 1.03f, 0.4f,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+ROUND_RECT, 149, 92, 17.143, 2, 1,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+STROKE, 2,
+CIRCLE, 158, 56, 13,
+CIRCLE, 158, 56, 27,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+CIRCLE, 144.055, 20, 2
diff --git a/chrome/app/vector_icons/webauthn/passkey_usb.icon b/chrome/app/vector_icons/webauthn/passkey_usb.icon
new file mode 100644
index 0000000..382633d
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_usb.icon
@@ -0,0 +1,142 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+MOVE_TO, 149, 74,
+R_H_LINE_TO, 18,
+R_V_LINE_TO, 16,
+R_H_LINE_TO, -18,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+STROKE, 2,
+MOVE_TO, 149, 74,
+R_H_LINE_TO, 18,
+R_V_LINE_TO, 16,
+R_H_LINE_TO, -18,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x7C, 0xAC, 0xF8,
+ROUND_RECT, 161, 75, 2, 10, 1,
+ROUND_RECT, 157, 75, 2, 10, 1,
+ROUND_RECT, 153, 75, 2, 10, 1,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x7C, 0xAC, 0xF8,
+MOVE_TO, 150, 75,
+R_H_LINE_TO, 16,
+R_V_LINE_TO, 2,
+R_H_LINE_TO, -16,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0xDA, 0xDC, 0xE0,
+MOVE_TO, 158, 20,
+R_CUBIC_TO, 9.94f, 0, 18, 8.06f, 18, 18,
+R_V_LINE_TO, 33,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, 4,
+R_H_LINE_TO, -28,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, -4,
+V_LINE_TO, 38,
+R_CUBIC_TO, 0, -9.94f, 8.06f, -18, 18, -18,
+CLOSE,
+R_MOVE_TO, 0, 23,
+R_ARC_TO, 5, 5, 0, 1, 0, 0, -10,
+R_ARC_TO, 5, 5, 0, 0, 0, 0, 10,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+STROKE, 2,
+MOVE_TO, 158, 20,
+R_CUBIC_TO, 9.94f, 0, 18, 8.06f, 18, 18,
+R_V_LINE_TO, 33,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, 4,
+R_H_LINE_TO, -28,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, -4,
+V_LINE_TO, 38,
+R_CUBIC_TO, 0, -9.94f, 8.06f, -18, 18, -18,
+CLOSE,
+R_MOVE_TO, 0, 23,
+R_ARC_TO, 5, 5, 0, 1, 0, 0, -10,
+R_ARC_TO, 5, 5, 0, 0, 0, 0, 10,
+CLOSE,
+NEW_PATH,
+PATH_MODE_CLEAR,
+CIRCLE, 158, 38, 6,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+STROKE, 2,
+CIRCLE, 158, 38, 6
diff --git a/chrome/app/vector_icons/webauthn/passkey_usb_dark.icon b/chrome/app/vector_icons/webauthn/passkey_usb_dark.icon
new file mode 100644
index 0000000..9a654a8
--- /dev/null
+++ b/chrome/app/vector_icons/webauthn/passkey_usb_dark.icon
@@ -0,0 +1,142 @@
+// Copyright 2022 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, 316,
+PATH_COLOR_ARGB, 0xFF, 0x3C, 0x40, 0x43,
+MOVE_TO, 149, 74,
+R_H_LINE_TO, 18,
+R_V_LINE_TO, 16,
+R_H_LINE_TO, -18,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x1B, 0x6E, 0xF3,
+STROKE, 2,
+MOVE_TO, 149, 74,
+R_H_LINE_TO, 18,
+R_V_LINE_TO, 16,
+R_H_LINE_TO, -18,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x5F, 0x63, 0x68,
+CIRCLE, 92, 17, 1,
+CIRCLE, 96, 17, 1,
+CIRCLE, 84, 17, 1,
+CIRCLE, 88, 17, 1,
+CIRCLE, 100, 17, 1,
+CIRCLE, 107, 86, 1,
+CIRCLE, 99, 86, 1,
+CIRCLE, 103, 86, 1,
+CIRCLE, 111, 86, 1,
+CIRCLE, 229, 20, 1,
+CIRCLE, 233, 20, 1,
+CIRCLE, 221, 20, 1,
+CIRCLE, 225, 20, 1,
+CIRCLE, 115, 86, 1,
+CIRCLE, 281, 37, 1,
+CIRCLE, 285, 37, 1,
+CIRCLE, 76, 21, 1,
+CIRCLE, 80, 21, 1,
+CIRCLE, 64, 21, 1,
+CIRCLE, 84, 21, 1,
+CIRCLE, 88, 21, 1,
+CIRCLE, 273, 37, 1,
+CIRCLE, 72, 21, 1,
+CIRCLE, 277, 37, 1,
+CIRCLE, 289, 37, 1,
+CIRCLE, 293, 37, 1,
+CIRCLE, 297, 37, 1,
+CIRCLE, 91, 90, 1,
+CIRCLE, 95, 90, 1,
+CIRCLE, 99, 90, 1,
+CIRCLE, 103, 90, 1,
+CIRCLE, 107, 90, 1,
+CIRCLE, 87, 90, 1,
+CIRCLE, 265, 41, 1,
+CIRCLE, 269, 41, 1,
+CIRCLE, 273, 41, 1,
+CIRCLE, 253, 90, 1,
+CIRCLE, 257, 90, 1,
+CIRCLE, 249, 86, 1,
+CIRCLE, 253, 86, 1,
+CIRCLE, 261, 90, 1,
+CIRCLE, 39, 69, 1,
+CIRCLE, 257, 86, 1,
+CIRCLE, 43, 69, 1,
+CIRCLE, 35, 65, 1,
+CIRCLE, 233, 90, 1,
+CIRCLE, 249, 90, 1,
+CIRCLE, 237, 90, 1,
+CIRCLE, 241, 90, 1,
+CIRCLE, 245, 90, 1,
+CIRCLE, 245, 86, 1,
+CIRCLE, 39, 65, 1,
+CIRCLE, 47, 69, 1,
+CIRCLE, 43, 65, 1,
+CIRCLE, 19, 69, 1,
+CIRCLE, 35, 69, 1,
+CIRCLE, 23, 69, 1,
+CIRCLE, 27, 69, 1,
+CIRCLE, 31, 69, 1,
+CIRCLE, 31, 65, 1,
+CIRCLE, 261, 41, 1,
+CIRCLE, 277, 41, 1,
+CIRCLE, 281, 41, 1,
+CIRCLE, 70, 44, 3,
+CIRCLE, 78, 44, 3,
+CIRCLE, 86, 44, 3,
+CIRCLE, 54, 44, 3,
+CIRCLE, 220, 69, 3,
+CIRCLE, 228, 69, 3,
+CIRCLE, 236, 69, 3,
+CIRCLE, 252, 69, 3,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+ROUND_RECT, 161, 75, 2, 10, 1,
+ROUND_RECT, 157, 75, 2, 10, 1,
+ROUND_RECT, 153, 75, 2, 10, 1,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+MOVE_TO, 150, 75,
+R_H_LINE_TO, 16,
+R_V_LINE_TO, 2,
+R_H_LINE_TO, -16,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x3C, 0x40, 0x43,
+MOVE_TO, 158, 20,
+R_CUBIC_TO, 9.94f, 0, 18, 8.06f, 18, 18,
+R_V_LINE_TO, 33,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, 4,
+R_H_LINE_TO, -28,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, -4,
+V_LINE_TO, 38,
+R_CUBIC_TO, 0, -9.94f, 8.06f, -18, 18, -18,
+CLOSE,
+R_MOVE_TO, 0, 23,
+R_ARC_TO, 5, 5, 0, 1, 0, 0, -10,
+R_ARC_TO, 5, 5, 0, 0, 0, 0, 10,
+CLOSE,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x4C, 0x8D, 0xF6,
+STROKE, 2,
+MOVE_TO, 158, 20,
+R_CUBIC_TO, 9.94f, 0, 18, 8.06f, 18, 18,
+R_V_LINE_TO, 33,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, 4,
+R_H_LINE_TO, -28,
+R_ARC_TO, 4, 4, 0, 0, 1, -4, -4,
+V_LINE_TO, 38,
+R_CUBIC_TO, 0, -9.94f, 8.06f, -18, 18, -18,
+CLOSE,
+R_MOVE_TO, 0, 23,
+R_ARC_TO, 5, 5, 0, 1, 0, 0, -10,
+R_ARC_TO, 5, 5, 0, 0, 0, 0, 10,
+CLOSE,
+NEW_PATH,
+PATH_MODE_CLEAR,
+CIRCLE, 158, 38, 6,
+NEW_PATH,
+PATH_COLOR_ARGB, 0xFF, 0x0B, 0x57, 0xD0,
+STROKE, 2,
+CIRCLE, 158, 38, 6
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index f0ef065..89f5ce3 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1871,6 +1871,8 @@
     "webapps/chrome_webapps_client.h",
     "webapps/web_app_offline.cc",
     "webapps/web_app_offline.h",
+    "webauthn/webauthn_metrics_util.cc",
+    "webauthn/webauthn_metrics_util.h",
     "webid/federated_identity_account_keyed_permission_context.cc",
     "webid/federated_identity_account_keyed_permission_context.h",
     "webid/federated_identity_active_session_permission_context.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index bc71442..e8efb4d 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -8802,10 +8802,6 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(IS_ANDROID)
-    {"context-menu-popup-style", flag_descriptions::kContextMenuPopupStyleName,
-     flag_descriptions::kContextMenuPopupStyleDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(chrome::android::kContextMenuPopupStyle)},
-
     {"grid-tab-switcher-for-tablets",
      flag_descriptions::kGridTabSwitcherForTabletsName,
      flag_descriptions::kGridTabSwitcherForTabletsDescription, kOsAndroid,
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index 1c27a0b6..32becbf1 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -247,20 +247,18 @@
   void PrimaryMainFrameRenderProcessGone(
       base::TerminationStatus status) override {
     terminated_ = true;
-    if (message_loop_runner_.get())
-      message_loop_runner_->Quit();
+    run_loop_.Quit();
   }
 
   void WaitForEmbedderRenderProcessTerminate() {
     if (terminated_)
       return;
-    message_loop_runner_ = new content::MessageLoopRunner;
-    message_loop_runner_->Run();
+    run_loop_.Run();
   }
 
  private:
   bool terminated_ = false;
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
+  base::RunLoop run_loop_;
 };
 
 void ExecuteScriptWaitForTitle(content::WebContents* web_contents,
@@ -290,14 +288,14 @@
 
   void Wait(bool wait_for_widget_shown) {
     wait_for_widget_shown_ = wait_for_widget_shown;
-    message_loop_runner_ = new content::MessageLoopRunner;
-    message_loop_runner_->Run();
+    run_loop_ = std::make_unique<base::RunLoop>();
+    run_loop_->Run();
     base::RunLoop().RunUntilIdle();
   }
 
   void OnWindowVisibilityChanged(aura::Window* window, bool visible) override {
     if (wait_for_widget_shown_ && visible)
-      message_loop_runner_->Quit();
+      run_loop_->Quit();
   }
 
   void OnWindowInitialized(aura::Window* window) override {
@@ -310,11 +308,11 @@
   void OnWindowDestroyed(aura::Window* window) override {
     observed_windows_.erase(window);
     if (!wait_for_widget_shown_ && observed_windows_.empty())
-      message_loop_runner_->Quit();
+      run_loop_->Quit();
   }
 
  private:
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
+  std::unique_ptr<base::RunLoop> run_loop_;
   std::set<aura::Window*> observed_windows_;
   bool wait_for_widget_shown_ = false;
 };
@@ -358,9 +356,8 @@
   void Wait() {
     if (click_completed_)
       return;
-    message_loop_runner_ = new content::MessageLoopRunner;
-    message_loop_runner_->Run();
-    message_loop_runner_ = nullptr;
+    run_loop_ = std::make_unique<base::RunLoop>();
+    run_loop_->Run();
   }
 
  private:
@@ -368,14 +365,14 @@
     mouse_event_.SetType(blink::WebInputEvent::Type::kMouseUp);
     render_frame_host_->GetRenderWidgetHost()->ForwardMouseEvent(mouse_event_);
     click_completed_ = true;
-    if (message_loop_runner_)
-      message_loop_runner_->Quit();
+    if (run_loop_)
+      run_loop_->Quit();
   }
 
   // Unowned pointer.
   raw_ptr<content::RenderFrameHost> render_frame_host_;
 
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
+  std::unique_ptr<base::RunLoop> run_loop_;
 
   blink::WebMouseEvent mouse_event_;
 
@@ -425,38 +422,38 @@
       const content::MediaStreamRequest& request,
       content::MediaResponseCallback callback) override {
     requested_ = true;
-    if (request_message_loop_runner_.get())
-      request_message_loop_runner_->Quit();
+    if (request_run_loop_)
+      request_run_loop_->Quit();
   }
 
   bool CheckMediaAccessPermission(content::RenderFrameHost* render_frame_host,
                                   const GURL& security_origin,
                                   blink::mojom::MediaStreamType type) override {
     checked_ = true;
-    if (check_message_loop_runner_.get())
-      check_message_loop_runner_->Quit();
+    if (check_run_loop_)
+      check_run_loop_->Quit();
     return true;
   }
 
   void WaitForRequestMediaPermission() {
     if (requested_)
       return;
-    request_message_loop_runner_ = new content::MessageLoopRunner;
-    request_message_loop_runner_->Run();
+    request_run_loop_ = std::make_unique<base::RunLoop>();
+    request_run_loop_->Run();
   }
 
   void WaitForCheckMediaPermission() {
     if (checked_)
       return;
-    check_message_loop_runner_ = new content::MessageLoopRunner;
-    check_message_loop_runner_->Run();
+    check_run_loop_ = std::make_unique<base::RunLoop>();
+    check_run_loop_->Run();
   }
 
  private:
   bool requested_ = false;
   bool checked_ = false;
-  scoped_refptr<content::MessageLoopRunner> request_message_loop_runner_;
-  scoped_refptr<content::MessageLoopRunner> check_message_loop_runner_;
+  std::unique_ptr<base::RunLoop> request_run_loop_;
+  std::unique_ptr<base::RunLoop> check_run_loop_;
 };
 
 // This class intercepts download request from the guest.
@@ -490,8 +487,8 @@
     }
 
     expect_allow_ = expect_allow;
-    message_loop_runner_ = new content::MessageLoopRunner;
-    message_loop_runner_->Run();
+    run_loop_ = std::make_unique<base::RunLoop>();
+    run_loop_->Run();
   }
 
   void DownloadDecided(base::OnceCallback<void(bool)> callback, bool allow) {
@@ -500,8 +497,8 @@
 
     if (waiting_for_decision_) {
       EXPECT_EQ(expect_allow_, allow);
-      if (message_loop_runner_.get())
-        message_loop_runner_->Quit();
+      if (run_loop_)
+        run_loop_->Quit();
       std::move(callback).Run(allow);
       return;
     }
@@ -520,7 +517,7 @@
   bool expect_allow_ = false;
   bool decision_made_ = false;
   bool last_download_allowed_ = false;
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
+  std::unique_ptr<base::RunLoop> run_loop_;
 };
 
 class WebViewTestBase : public extensions::PlatformAppBrowserTest {
@@ -920,8 +917,7 @@
 class WebContentsAudioMutedObserver : public content::WebContentsObserver {
  public:
   explicit WebContentsAudioMutedObserver(content::WebContents* web_contents)
-      : WebContentsObserver(web_contents),
-        loop_runner_(new content::MessageLoopRunner) {}
+      : WebContentsObserver(web_contents) {}
   WebContentsAudioMutedObserver(const WebContentsAudioMutedObserver&) = delete;
   WebContentsAudioMutedObserver& operator=(
       const WebContentsAudioMutedObserver&) = delete;
@@ -929,17 +925,15 @@
   // WebContentsObserver.
   void DidUpdateAudioMutingState(bool muted) override {
     muting_update_observed_ = true;
-    loop_runner_->Quit();
+    run_loop_.Quit();
   }
 
-  void WaitForUpdate() {
-    loop_runner_->Run();
-  }
+  void WaitForUpdate() { run_loop_.Run(); }
 
   bool muting_update_observed() { return muting_update_observed_; }
 
  private:
-  scoped_refptr<content::MessageLoopRunner> loop_runner_;
+  base::RunLoop run_loop_;
   bool muting_update_observed_ = false;
 };
 
@@ -956,9 +950,8 @@
     if (web_contents()->IsCurrentlyAudible() == audible)
       return;
 
-    message_loop_runner_ = new content::MessageLoopRunner;
-    message_loop_runner_->Run();
-    message_loop_runner_ = nullptr;
+    run_loop_ = std::make_unique<base::RunLoop>();
+    run_loop_->Run();
 
     EXPECT_EQ(audible, web_contents()->IsCurrentlyAudible());
     EXPECT_EQ(audible, audible_);
@@ -967,12 +960,11 @@
  private:
   void OnAudioStateChanged(bool audible) override {
     audible_ = audible;
-    if (message_loop_runner_.get())
-      message_loop_runner_->Quit();
+    run_loop_->Quit();
   }
 
   bool audible_ = false;
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
+  std::unique_ptr<base::RunLoop> run_loop_;
 };
 
 IN_PROC_BROWSER_TEST_P(WebViewTest, AudibilityStatePropagates) {
@@ -1151,32 +1143,28 @@
 IN_PROC_BROWSER_TEST_P(WebViewVisibilityTest, GuestVisibilityChanged) {
   LoadAppWithGuest("web_view/visibility_changed");
 
-  scoped_refptr<content::MessageLoopRunner> loop_runner(
-      new content::MessageLoopRunner);
+  base::RunLoop run_loop;
   RenderWidgetHostVisibilityObserver observer(
-      GetGuestRenderFrameHost()->GetRenderWidgetHost(),
-      loop_runner->QuitClosure());
+      GetGuestRenderFrameHost()->GetRenderWidgetHost(), run_loop.QuitClosure());
 
   // Handled in platform_apps/web_view/visibility_changed/main.js
   SendMessageToEmbedder("hide-guest");
   if (!observer.hidden_observed())
-    loop_runner->Run();
+    run_loop.Run();
 }
 
 // This test verifies that hiding the embedder also hides the guest.
 IN_PROC_BROWSER_TEST_P(WebViewVisibilityTest, EmbedderVisibilityChanged) {
   LoadAppWithGuest("web_view/visibility_changed");
 
-  scoped_refptr<content::MessageLoopRunner> loop_runner(
-      new content::MessageLoopRunner);
+  base::RunLoop run_loop;
   RenderWidgetHostVisibilityObserver observer(
-      GetGuestRenderFrameHost()->GetRenderWidgetHost(),
-      loop_runner->QuitClosure());
+      GetGuestRenderFrameHost()->GetRenderWidgetHost(), run_loop.QuitClosure());
 
   // Handled in platform_apps/web_view/visibility_changed/main.js
   SendMessageToEmbedder("hide-embedder");
   if (!observer.hidden_observed())
-    loop_runner->Run();
+    run_loop.Run();
 }
 
 // This test verifies that reloading the embedder reloads the guest (and doest
@@ -4691,8 +4679,8 @@
 
   void Wait() {
     if (count_ == 0) {
-      loop_runner_ = new content::MessageLoopRunner();
-      loop_runner_->Run();
+      run_loop_ = std::make_unique<base::RunLoop>();
+      run_loop_->Run();
     }
   }
 
@@ -4715,7 +4703,7 @@
         if (node.id == event_node_id) {
           count_++;
           node_data_ = node;
-          loop_runner_->Quit();
+          run_loop_->Quit();
           return;
         }
       }
@@ -4727,7 +4715,7 @@
   const ui::AXNodeData& node_data() const { return node_data_; }
 
  private:
-  scoped_refptr<content::MessageLoopRunner> loop_runner_;
+  std::unique_ptr<base::RunLoop> run_loop_;
   ax::mojom::Event event_;
   ui::AXNodeData node_data_;
   size_t count_;
diff --git a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
index 256a9b73..e2898ce 100644
--- a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
@@ -379,8 +379,8 @@
         gfx::Rect popup_bounds =
             last_render_widget_host_->GetView()->GetViewBounds();
         if (!popup_bounds.size().IsEmpty()) {
-          if (message_loop_.get())
-            message_loop_->Quit();
+          if (run_loop_)
+            run_loop_->Quit();
           return;
         }
       }
@@ -389,9 +389,9 @@
       // schedule waiting.
       ScheduleWait(wait_retry_left - 1);
 
-      if (!message_loop_.get()) {
-        message_loop_ = new content::MessageLoopRunner;
-        message_loop_->Run();
+      if (!run_loop_) {
+        run_loop_ = std::make_unique<base::RunLoop>();
+        run_loop_->Run();
       }
     }
 
@@ -426,7 +426,7 @@
 
     size_t initial_widget_count_ = 0;
     content::RenderWidgetHost* last_render_widget_host_ = nullptr;
-    scoped_refptr<content::MessageLoopRunner> message_loop_;
+    std::unique_ptr<base::RunLoop> run_loop_;
   };
 
   void PopupTestHelper(const gfx::Point& padding) {
@@ -1191,11 +1191,10 @@
       context_menu_gesture_event_type);
 
   // Wait for guest to load (without this the events never reach the guest).
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner =
-      new content::MessageLoopRunner;
+  std::unique_ptr<base::RunLoop> run_loop = std::make_unique<base::RunLoop>();
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, message_loop_runner->QuitClosure(), base::Milliseconds(200));
-  message_loop_runner->Run();
+      FROM_HERE, run_loop->QuitClosure(), base::Milliseconds(200));
+  run_loop->Run();
 
   gfx::Rect guest_rect = GetGuestRenderFrameHost()->GetView()->GetViewBounds();
   gfx::Point embedder_origin =
@@ -1212,10 +1211,10 @@
             filter->GetAckStateWaitIfNecessary());
 
   // Give enough time for the quick menu to fire.
-  message_loop_runner = new content::MessageLoopRunner;
+  run_loop = std::make_unique<base::RunLoop>();
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, message_loop_runner->QuitClosure(), base::Milliseconds(200));
-  message_loop_runner->Run();
+      FROM_HERE, run_loop->QuitClosure(), base::Milliseconds(200));
+  run_loop->Run();
 
 // TODO: Fix quick menu opening on Windows.
 #if !BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/ash/login/oobe_interactive_ui_test.cc b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
index c5b5092a..7b95e89 100644
--- a/chrome/browser/ash/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
@@ -479,11 +479,11 @@
       delegate_->OnLoadSuccess(base::Value(std::move(response_dict)));
       return;
     }
-    base::Value app(base::Value::Type::DICTIONARY);
-    app.SetKey("package_name", base::Value("test.package"));
-    base::Value app_list(base::Value::Type::LIST);
+    base::Value::Dict app;
+    app.Set("package_name", "test.package");
+    base::Value::List app_list;
     app_list.Append(std::move(app));
-    delegate_->OnLoadSuccess(std::move(app_list));
+    delegate_->OnLoadSuccess(base::Value(std::move(app_list)));
   }
 
   void Retry() override { NOTREACHED(); }
diff --git a/chrome/browser/ash/usb/cros_usb_detector.cc b/chrome/browser/ash/usb/cros_usb_detector.cc
index 11ba373..2e2a63eb 100644
--- a/chrome/browser/ash/usb/cros_usb_detector.cc
+++ b/chrome/browser/ash/usb/cros_usb_detector.cc
@@ -9,7 +9,6 @@
 #include <string>
 #include <utility>
 
-#include "ash/components/arc/arc_features.h"
 #include "ash/components/arc/arc_util.h"
 #include "ash/constants/ash_features.h"
 #include "ash/constants/notifier_catalogs.h"
@@ -309,8 +308,7 @@
         chromeos::settings::mojom::kPluginVmUsbPreferencesSubpagePath;
   }
 
-  if (IsPlayStoreEnabledWithArcVmForProfile(profile()) &&
-      base::FeatureList::IsEnabled(arc::kUsbDeviceDefaultAttachToArcVm)) {
+  if (IsPlayStoreEnabledWithArcVmForProfile(profile())) {
     vm_name = l10n_util::GetStringUTF16(IDS_CROSUSB_NOTIFICATION_ARCVM);
     vm_name_button_text =
         l10n_util::GetStringUTF16(IDS_CROSUSB_NOTIFICATION_ARCVM_BUTTON);
@@ -547,8 +545,7 @@
 bool CrosUsbDetector::ShouldShowNotification(const UsbDevice& device) {
   if (!crostini::CrostiniFeatures::Get()->IsEnabled(profile()) &&
       !plugin_vm::PluginVmFeatures::Get()->IsEnabled(profile()) &&
-      !(IsPlayStoreEnabledWithArcVmForProfile(profile()) &&
-        base::FeatureList::IsEnabled(arc::kUsbDeviceDefaultAttachToArcVm))) {
+      !IsPlayStoreEnabledWithArcVmForProfile(profile())) {
     return false;
   }
   if (!device.shareable) {
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index caed404..1420399e 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -395,7 +395,6 @@
 #include "chrome/browser/chrome_browser_main_linux.h"
 #elif BUILDFLAG(IS_ANDROID)
 #include "base/android/application_status_listener.h"
-#include "base/android/build_info.h"
 #include "base/feature_list.h"
 #include "chrome/android/features/dev_ui/buildflags.h"
 #include "chrome/browser/android/customtabs/client_data_header_web_contents_observer.h"
@@ -3945,11 +3944,6 @@
   // If the pref is not set, the default value (true) will be used:
   web_prefs->webxr_immersive_ar_allowed =
       prefs->GetBoolean(prefs::kWebXRImmersiveArEnabled);
-
-  // APIs for Web Authentication are not available prior to N.
-  web_prefs->disable_webauthn =
-      base::android::BuildInfo::GetInstance()->sdk_int() <
-      base::android::SDK_VERSION_NOUGAT;
 #endif
 
   for (ChromeContentBrowserClientParts* parts : extra_parts_)
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 10aec53..35847bf7 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1079,11 +1079,6 @@
     "expiry_milestone": 108
   },
   {
-    "name": "context-menu-popup-style",
-    "owners": [ "wenyufu", "clank-app-team@google.com" ],
-    "expiry_milestone": 108
-  },
-  {
     "name": "context-menu-search-with-google-lens",
     "owners": [ "benwgold@google.com", "lens-chrome@google.com" ],
     "expiry_milestone": 107
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 5982bfb..70d2219 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3490,11 +3490,6 @@
     "A new method of persisting Tab data across restarts has been devised "
     "and implemented. This actives the new approach.";
 
-const char kContextMenuPopupStyleName[] = "Context menu popup style";
-const char kContextMenuPopupStyleDescription[] =
-    "Enable the popup style context menu, where the context menu will be"
-    "anchored around the touch point.";
-
 const char kContextualSearchDebugName[] = "Contextual Search debug";
 const char kContextualSearchDebugDescription[] =
     "Enables internal debugging of Contextual Search behavior on the client "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index d23c29b..ef5cd6c 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1970,9 +1970,6 @@
 extern const char kCriticalPersistedTabDataName[];
 extern const char kCriticalPersistedTabDataDescription[];
 
-extern const char kContextMenuPopupStyleName[];
-extern const char kContextMenuPopupStyleDescription[];
-
 extern const char kContextualSearchDebugName[];
 extern const char kContextualSearchDebugDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 6d8b553..53edf4f 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -219,7 +219,6 @@
     &kContextMenuShopWithGoogleLens,
     &kContextMenuSearchAndShopWithGoogleLens,
     &kContextMenuTranslateWithGoogleLens,
-    &kContextMenuPopupStyle,
     &kContextualSearchDebug,
     &kContextualSearchDelayedIntelligence,
     &kContextualSearchDisableOnlineDetection,
@@ -666,10 +665,6 @@
              "ContextMenuGoogleLensChip",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-BASE_FEATURE(kContextMenuPopupStyle,
-             "ContextMenuPopupStyle",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 BASE_FEATURE(kContextMenuSearchWithGoogleLens,
              "ContextMenuSearchWithGoogleLens",
              base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index aeb24ead..dff4d06 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -69,7 +69,6 @@
 BASE_DECLARE_FEATURE(kContextMenuEnableLensShoppingAllowlist);
 BASE_DECLARE_FEATURE(kContextMenuGoogleLensChip);
 BASE_DECLARE_FEATURE(kContextMenuPerformanceInfo);
-BASE_DECLARE_FEATURE(kContextMenuPopupStyle);
 BASE_DECLARE_FEATURE(kContextMenuSearchWithGoogleLens);
 BASE_DECLARE_FEATURE(kContextMenuShopWithGoogleLens);
 BASE_DECLARE_FEATURE(kContextMenuSearchAndShopWithGoogleLens);
diff --git a/chrome/browser/flags/android/chrome_session_state.cc b/chrome/browser/flags/android/chrome_session_state.cc
index 2c2d2a4..dfddb62a 100644
--- a/chrome/browser/flags/android/chrome_session_state.cc
+++ b/chrome/browser/flags/android/chrome_session_state.cc
@@ -73,9 +73,6 @@
     SaveActivityTypeToLocalState(local_state, activity_type);
   }
 
-  // TODO(crbug/1228735): deprecate custom tab field.
-  ukm::UkmSource::SetCustomTabVisible(
-      GetCustomTabsVisibleValue(activity_type) == VISIBLE_CUSTOM_TAB);
   ukm::UkmSource::SetAndroidActivityTypeState(static_cast<int>(activity_type));
 }
 
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 77cae6f5..fee495c 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -288,7 +288,6 @@
     public static final String CONTEXT_MENU_ENABLE_LENS_SHOPPING_ALLOWLIST =
             "ContextMenuEnableLensShoppingAllowlist";
     public static final String CONTEXT_MENU_GOOGLE_LENS_CHIP = "ContextMenuGoogleLensChip";
-    public static final String CONTEXT_MENU_POPUP_STYLE = "ContextMenuPopupStyle";
     public static final String CONTEXT_MENU_SEARCH_WITH_GOOGLE_LENS =
             "ContextMenuSearchWithGoogleLens";
     public static final String CONTEXT_MENU_TRANSLATE_WITH_GOOGLE_LENS =
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java
index 6c4c4d4..cd00f7d 100644
--- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java
+++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinator.java
@@ -25,6 +25,7 @@
 import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager.SnackbarController;
+import org.chromium.components.browser_ui.widget.MoreProgressButton;
 import org.chromium.components.browser_ui.widget.selectable_list.SelectableItemView;
 import org.chromium.components.browser_ui.widget.selectable_list.SelectableListLayout;
 import org.chromium.components.browser_ui.widget.selectable_list.SelectableListToolbar;
@@ -232,13 +233,16 @@
     }
 
     private View buildMoreProgressView(ViewGroup parent) {
-        View view = LayoutInflater.from(parent.getContext())
-                            .inflate(R.layout.more_progress_button, parent, false);
-        View progressSpinner = view.findViewById(R.id.progress_spinner);
+        MoreProgressButton moreProgressButton =
+                (MoreProgressButton) LayoutInflater.from(parent.getContext())
+                        .inflate(R.layout.more_progress_button, parent, false);
+        moreProgressButton.setButtonText(moreProgressButton.getResources().getString(
+                R.string.history_clusters_show_more_button_label));
+        View progressSpinner = moreProgressButton.findViewById(R.id.progress_spinner);
         if (progressSpinner != null) {
             ((LayoutParams) progressSpinner.getLayoutParams()).gravity = Gravity.CENTER;
         }
-        return view;
+        return moreProgressButton;
     }
 
     private View buildClusterView(ViewGroup parent) {
diff --git a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
index c519831..555796b 100644
--- a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
@@ -592,31 +592,11 @@
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
     EncryptedMediaSupportedTypesWidevineTest::SetUpCommandLine(command_line);
-    // Pretend that we support hardware secure decryption for vp8, vp9, and av01
-    // but not for avc1. This will also pretend that there is support for vorbis
+    // Pretend that we support hardware secure decryption for vp8 and vp9, but
+    // not for avc1. This will also pretend that there is support for vorbis
     // audio.
     command_line->AppendSwitchASCII(
-        switches::kOverrideHardwareSecureCodecsForTesting,
-        "vp8,vp9,av01-no-clearlead,vorbis");
-  }
-};
-
-class EncryptedMediaSupportedTypesWidevineHwSecureDefaultAndExperimentTest
-    : public EncryptedMediaSupportedTypesWidevineTest {
- protected:
-  EncryptedMediaSupportedTypesWidevineHwSecureDefaultAndExperimentTest() {
-    enabled_features_.push_back(media::kHardwareSecureDecryption);
-    enabled_features_.push_back(media::kHardwareSecureDecryptionExperiment);
-  }
-
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    EncryptedMediaSupportedTypesWidevineTest::SetUpCommandLine(command_line);
-    // Pretend that we support hardware secure decryption for vp8 and vp9 with
-    // clearlead fix supported and av01 without clear lead support.  This will
-    // also pretend that there is support for vorbis audio.
-    command_line->AppendSwitchASCII(
-        switches::kOverrideHardwareSecureCodecsForTesting,
-        "vp8,vp9,av01-no-clearlead,vorbis");
+        switches::kOverrideHardwareSecureCodecsForTesting, "vp8,vp9,vorbis");
   }
 };
 
@@ -1534,8 +1514,6 @@
 }
 #endif  // BUILDFLAG(ENABLE_PLATFORM_ENCRYPTED_DOLBY_VISION)
 
-// Widevine experiment key system should not be supported without the
-// `kHardwareSecureDecryptionExperiment` feature enabled.
 IN_PROC_BROWSER_TEST_F(EncryptedMediaSupportedTypesWidevineHwSecureTest,
                        WidevineExperiment) {
   EXPECT_UNSUPPORTED(
@@ -1587,104 +1565,6 @@
 #endif
 }
 
-IN_PROC_BROWSER_TEST_F(
-    EncryptedMediaSupportedTypesWidevineHwSecureExperimentTest,
-    SupportedCodecs) {
-  EXPECT_UNSUPPORTED(
-      IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType, video_webm_codecs(),
-                             SessionType::kTemporary, "HW_SECURE_ALL"));
-  EXPECT_UNSUPPORTED(
-      IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, av1_codecs(),
-                             SessionType::kTemporary, "HW_SECURE_ALL"));
-
-  // Widevine experiment key system is only supported on Windows.
-#if BUILDFLAG(IS_WIN)
-  EXPECT_WV(IsSupportedByKeySystem(kWidevineExperiment, kVideoWebMMimeType,
-                                   video_webm_codecs(), SessionType::kTemporary,
-                                   "HW_SECURE_ALL"));
-  // AV1 is supported for the experimental key system despite not having clear
-  // lead support.
-  EXPECT_WV_AV1(IsSupportedByKeySystem(kWidevineExperiment, kVideoMP4MimeType,
-                                       av1_codecs(), SessionType::kTemporary,
-                                       "HW_SECURE_ALL"));
-#else
-  EXPECT_UNSUPPORTED(IsSupportedByKeySystem(
-      kWidevineExperiment, kVideoWebMMimeType, video_webm_codecs(),
-      SessionType::kTemporary, "HW_SECURE_ALL"));
-  EXPECT_UNSUPPORTED(IsSupportedByKeySystem(
-      kWidevineExperiment, kVideoMP4MimeType, av1_codecs(),
-      SessionType::kTemporary, "HW_SECURE_ALL"));
-#endif
-}
-
-IN_PROC_BROWSER_TEST_F(
-    EncryptedMediaSupportedTypesWidevineHwSecureDefaultAndExperimentTest,
-    Robustness) {
-  // Widevine software security should always be supported.
-  EXPECT_WV(IsVideoRobustnessSupported(kWidevine, "SW_SECURE_CRYPTO"));
-  EXPECT_WV(IsVideoRobustnessSupported(kWidevine, "SW_SECURE_DECODE"));
-  EXPECT_WV(IsAudioRobustnessSupported(kWidevine, "SW_SECURE_CRYPTO"));
-
-  // Widevine key system supports hardware security.
-  EXPECT_WV(IsVideoRobustnessSupported(kWidevine, "HW_SECURE_CRYPTO"));
-  EXPECT_WV(IsVideoRobustnessSupported(kWidevine, "HW_SECURE_ALL"));
-  EXPECT_WV(IsAudioRobustnessSupported(kWidevine, "HW_SECURE_CRYPTO"));
-
-  // Widevine experiment key system is only supported on Windows.
-#if BUILDFLAG(IS_WIN)
-  // Widevine experiment key system supports both software/hardware security.
-  EXPECT_WV(
-      IsVideoRobustnessSupported(kWidevineExperiment, "SW_SECURE_CRYPTO"));
-  EXPECT_WV(
-      IsVideoRobustnessSupported(kWidevineExperiment, "SW_SECURE_DECODE"));
-  EXPECT_WV(
-      IsVideoRobustnessSupported(kWidevineExperiment, "HW_SECURE_CRYPTO"));
-  EXPECT_WV(IsVideoRobustnessSupported(kWidevineExperiment, "HW_SECURE_ALL"));
-  EXPECT_WV(
-      IsAudioRobustnessSupported(kWidevineExperiment, "SW_SECURE_CRYPTO"));
-  EXPECT_WV(
-      IsAudioRobustnessSupported(kWidevineExperiment, "HW_SECURE_CRYPTO"));
-#else
-  EXPECT_UNSUPPORTED(
-      IsAudioRobustnessSupported(kWidevineExperiment, "SW_SECURE_DECODE"));
-  EXPECT_UNSUPPORTED(
-      IsAudioRobustnessSupported(kWidevineExperiment, "HW_SECURE_ALL"));
-#endif
-}
-
-// Widevine experiment key system should only support codecs that support
-// clear lead.
-IN_PROC_BROWSER_TEST_F(
-    EncryptedMediaSupportedTypesWidevineHwSecureDefaultAndExperimentTest,
-    SupportedCodecs) {
-  EXPECT_WV(IsSupportedByKeySystem(kWidevine, kVideoWebMMimeType,
-                                   video_webm_codecs(), SessionType::kTemporary,
-                                   "HW_SECURE_ALL"));
-  // AV1 codec does not have clear lead support, so should be unsupported in the
-  // normal Widevine key system.
-  EXPECT_UNSUPPORTED(
-      IsSupportedByKeySystem(kWidevine, kVideoMP4MimeType, av1_codecs(),
-                             SessionType::kTemporary, "HW_SECURE_ALL"));
-
-  // Widevine experiment key system is only supported on Windows.
-#if BUILDFLAG(IS_WIN)
-  // Clear lead support for codecs do not matter for the experimental key system
-  EXPECT_WV(IsSupportedByKeySystem(kWidevineExperiment, kVideoWebMMimeType,
-                                   video_webm_codecs(), SessionType::kTemporary,
-                                   "HW_SECURE_ALL"));
-  EXPECT_WV_AV1(IsSupportedByKeySystem(kWidevineExperiment, kVideoMP4MimeType,
-                                       av1_codecs(), SessionType::kTemporary,
-                                       "HW_SECURE_ALL"));
-#else
-  EXPECT_UNSUPPORTED(IsSupportedByKeySystem(
-      kWidevineExperiment, kVideoWebMMimeType, video_webm_codecs(),
-      SessionType::kTemporary, "HW_SECURE_ALL"));
-  EXPECT_UNSUPPORTED(IsSupportedByKeySystem(
-      kWidevineExperiment, kVideoMP4MimeType, av1_codecs(),
-      SessionType::kTemporary, "HW_SECURE_ALL"));
-#endif  // BUILDFLAG(IS_WIN)
-}
-
 //
 // Misc failure test cases.
 //
diff --git a/chrome/browser/media/webrtc/region_capture_browsertest.cc b/chrome/browser/media/webrtc/region_capture_browsertest.cc
index ff4a477..cb33074 100644
--- a/chrome/browser/media/webrtc/region_capture_browsertest.cc
+++ b/chrome/browser/media/webrtc/region_capture_browsertest.cc
@@ -364,6 +364,19 @@
     }
   }
 
+  void TestCanCropToElementTag(const char* tag) {
+    TabInfo& tab = tabs_[kMainTab];
+
+    const std::string element_id = base::StrCat({"new_id_", tag});
+    ASSERT_TRUE(
+        tab.CreateNewElement(Frame::kTopLevelDocument, tag, element_id));
+    const std::string crop_target =
+        tab.CropTargetFromElement(Frame::kTopLevelDocument, element_id);
+    ASSERT_THAT(crop_target, IsExpectedCropTarget("0"));
+
+    EXPECT_TRUE(tab.CropTo(crop_target, Frame::kTopLevelDocument));
+  }
+
   // Manipulation after SetUpCommandLine, but before capture starts,
   // allows tests to set which tab to capture.
   raw_ptr<base::CommandLine> command_line_ = nullptr;
@@ -378,6 +391,40 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
+class RegionCaptureBrowserCropTest
+    : public RegionCaptureBrowserTest,
+      public testing::WithParamInterface<const char*> {
+ public:
+  ~RegionCaptureBrowserCropTest() override = default;
+};
+
+INSTANTIATE_TEST_SUITE_P(RegionCaptureBrowserCropTestInstantiation,
+                         RegionCaptureBrowserCropTest,
+                         Values("a",
+                                "blockquote",
+                                "body",
+                                "button",
+                                "canvas",
+                                "col",
+                                "div",
+                                "fieldset",
+                                "form",
+                                "h1",
+                                "header",
+                                "hr"
+                                "iframe",
+                                "img",
+                                "input",
+                                "output",
+                                "span",
+                                "svg",
+                                "video"));
+
+IN_PROC_BROWSER_TEST_P(RegionCaptureBrowserCropTest, CanCropTo) {
+  SetUpTest(Frame::kTopLevelDocument, /*self_capture=*/true);
+  TestCanCropToElementTag(GetParam());
+}
+
 IN_PROC_BROWSER_TEST_F(RegionCaptureBrowserTest,
                        CropTargetFromElementReturnsValidIdInMainPage) {
   SetUpTest(Frame::kTopLevelDocument, /*self_capture=*/true);
@@ -502,50 +549,6 @@
   EXPECT_TRUE(tab.CropTo(crop_target, Frame::kTopLevelDocument));
 }
 
-// https://crbug.com/1358839: Flaky on Mac and Linux
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
-#define MAYBE_CropToWorksForAllElements DISABLED_CropToWorksForAllElements
-#else
-#define MAYBE_CropToWorksForAllElements CropToWorksForAllElements
-#endif
-IN_PROC_BROWSER_TEST_F(RegionCaptureBrowserTest, MAYBE_CropToWorksForAllElements) {
-  // NOTE: this list is intentionally non-exhaustive, but represents a wide
-  // variety of element types.
-  static const std::vector<const char*> kElementTags{"a",
-                                                     "blockquote",
-                                                     "body",
-                                                     "button",
-                                                     "canvas",
-                                                     "col",
-                                                     "div",
-                                                     "fieldset",
-                                                     "form",
-                                                     "h1",
-                                                     "header",
-                                                     "hr"
-                                                     "iframe",
-                                                     "img",
-                                                     "input",
-                                                     "output",
-                                                     "span",
-                                                     "svg",
-                                                     "video"};
-
-  SetUpTest(Frame::kTopLevelDocument, /*self_capture=*/true);
-  TabInfo& tab = tabs_[kMainTab];
-
-  for (size_t i = 0; i < kElementTags.size(); ++i) {
-    const std::string element_id = ("new_id_" + base::NumberToString(i));
-    ASSERT_TRUE(tab.CreateNewElement(Frame::kTopLevelDocument, kElementTags[i],
-                                     element_id));
-    const std::string crop_target =
-        tab.CropTargetFromElement(Frame::kTopLevelDocument, element_id);
-    ASSERT_THAT(crop_target, IsExpectedCropTarget(base::NumberToString(i)));
-
-    EXPECT_TRUE(tab.CropTo(crop_target, Frame::kTopLevelDocument));
-  }
-}
-
 IN_PROC_BROWSER_TEST_F(RegionCaptureBrowserTest, MaxCropIdsInTopLevelDocument) {
   SetUpTest(Frame::kNone, /*self_capture=*/false);
   TabInfo& tab = tabs_[kMainTab];
diff --git a/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc b/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc
index 9c83281..1c7cb12 100644
--- a/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc
+++ b/chrome/browser/optimization_guide/page_content_annotations_service_browsertest.cc
@@ -35,6 +35,7 @@
 #include "net/dns/mock_host_resolver.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_source.h"
+#include "services/metrics/public/mojom/ukm_interface.mojom-forward.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -622,17 +623,29 @@
 IN_PROC_BROWSER_TEST_F(PageContentAnnotationsServiceBrowserTest,
                        DISABLED_OgImagePresent) {
   base::HistogramTester histogram_tester;
+  ukm::TestAutoSetUkmRecorder ukm_recorder;
 
   GURL url(embedded_test_server()->GetURL("a.com", "/og_image.html"));
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
 
+  // Value taken from SalientImageAvailability enum.
+  static const int kAvailableFromOgImage = 3;
+
   RetryForHistogramUntilCountReached(
       &histogram_tester,
       "OptimizationGuide.PageContentAnnotations.SalientImageAvailability", 1);
 
   histogram_tester.ExpectBucketCount(
-      "OptimizationGuide.PageContentAnnotations.SalientImageAvailability", 3,
-      1);
+      "OptimizationGuide.PageContentAnnotations.SalientImageAvailability",
+      kAvailableFromOgImage, 1);
+
+  std::vector<const ukm::mojom::UkmEntry*> entries =
+      ukm_recorder.GetEntriesByName(
+          ukm::builders::SalientImageAvailability::kEntryName);
+  ASSERT_EQ(1u, entries.size());
+
+  ASSERT_EQ(1u, entries[0]->metrics.size());
+  EXPECT_EQ(kAvailableFromOgImage, entries[0]->metrics.begin()->second);
 }
 
 // Flaky timeout in debug builds (crbug.com/1338408).
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 8b149ca..c5542992 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -76,6 +76,7 @@
 #include "components/enterprise/content/pref_names.h"
 #include "components/feed/core/shared_prefs/pref_names.h"
 #include "components/history/core/common/pref_names.h"
+#include "components/history_clusters/core/history_clusters_prefs.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/network_time/network_time_pref_names.h"
@@ -131,7 +132,6 @@
 #include "chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h"
 #include "chrome/browser/policy/local_sync_policy_handler.h"
 #include "chrome/browser/policy/managed_account_policy_handler.h"
-#include "components/history_clusters/core/history_clusters_prefs.h"
 #include "components/media_router/common/pref_names.h"
 #endif  // BUILDFLAG(IS_ANDROID)
 
@@ -261,6 +261,9 @@
   { key::kUrlKeyedAnonymizedDataCollectionEnabled,
     unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
     base::Value::Type::BOOLEAN },
+  { key::kHistoryClustersVisible,
+    history_clusters::prefs::kVisible,
+    base::Value::Type::BOOLEAN },
 // Policies for all platforms - End
 #if BUILDFLAG(IS_ANDROID)
   { key::kAuthAndroidNegotiateAccountType,
@@ -445,9 +448,6 @@
   { key::kHideWebStoreIcon,
     prefs::kHideWebStoreIcon,
     base::Value::Type::BOOLEAN },
-  { key::kHistoryClustersVisible,
-    history_clusters::prefs::kVisible,
-    base::Value::Type::BOOLEAN },
   { key::kHomepageIsNewTabPage,
     prefs::kHomePageIsNewTabPage,
     base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/printing/print_browsertest.cc b/chrome/browser/printing/print_browsertest.cc
index dd7ee9c..e4e403b 100644
--- a/chrome/browser/printing/print_browsertest.cc
+++ b/chrome/browser/printing/print_browsertest.cc
@@ -3608,8 +3608,10 @@
     print_view_manager->WaitOnScanning();
     ASSERT_EQ(print_view_manager->scripted_print_called(),
               content_analysis_allows_print());
-    // TODO(crbug.com/1352193): Update this to expect 0 calls.
-    ASSERT_EQ(new_document_called_count(), 1);
+
+    // Validate that `NewDocument` was never call as that can needlessly
+    // prompt the user.
+    ASSERT_EQ(new_document_called_count(), 0);
   }
 };
 
@@ -3641,8 +3643,10 @@
   ASSERT_TRUE(print_view_manager->print_now_called());
   ASSERT_EQ(print_view_manager->scripted_print_called(),
             content_analysis_allows_print());
-  // TODO(crbug.com/1352193): Update this to expect 0 calls.
-  ASSERT_EQ(new_document_called_count(), 1);
+
+  // Validate that `NewDocument` was never call as that can needlessly
+  // prompt the user.
+  ASSERT_EQ(new_document_called_count(), 0);
 }
 
 IN_PROC_BROWSER_TEST_P(MAYBE_ContentAnalysisPrintBrowserTest,
@@ -3667,8 +3671,10 @@
   print_view_manager->WaitOnScanning();
   ASSERT_EQ(print_view_manager->preview_allowed(),
             content_analysis_allows_print());
-  // TODO(crbug.com/1352193): Update this to expect 0 calls.
-  ASSERT_EQ(new_document_called_count(), 1);
+
+  // Validate that `NewDocument` was never call as that can needlessly
+  // prompt the user.
+  ASSERT_EQ(new_document_called_count(), 0);
 }
 
 IN_PROC_BROWSER_TEST_P(MAYBE_ContentAnalysisScriptedPreviewlessPrintBrowserTest,
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc
index cebbbc3c..75846d8 100644
--- a/chrome/browser/printing/print_view_manager.cc
+++ b/chrome/browser/printing/print_view_manager.cc
@@ -283,6 +283,7 @@
           Profile::FromBrowserContext(web_contents()->GetBrowserContext()),
           web_contents()->GetLastCommittedURL(), &scanning_data,
           enterprise_connectors::AnalysisConnector::PRINT)) {
+    set_snapshotting_for_content_analysis();
     GetPrintRenderFrame(rfh)->SnapshotForContentAnalysis(base::BindOnce(
         &PrintViewManager::OnGotSnapshotCallback, weak_factory_.GetWeakPtr(),
         std::move(callback), std::move(scanning_data), rfh_id));
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc
index cbb6c592..d252084 100644
--- a/chrome/browser/printing/print_view_manager_base.cc
+++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -651,6 +651,7 @@
     auto scanning_done_callback = base::BindOnce(
         &PrintViewManagerBase::CompleteScriptedPrintAfterContentAnalysis,
         weak_ptr_factory_.GetWeakPtr(), std::move(params), std::move(callback));
+    set_snapshotting_for_content_analysis();
     GetPrintRenderFrame(render_frame_host)
         ->SnapshotForContentAnalysis(base::BindOnce(
             &PrintViewManagerBase::OnGotSnapshotCallback,
@@ -972,6 +973,12 @@
     return false;
   }
 
+#if BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
+  // Don't start printing if the print job was created only for snapshotting.
+  if (snapshotting_for_content_analysis_)
+    return true;
+#endif
+
   // Settings are already loaded. Go ahead. This will set
   // print_job_->is_job_pending() to true.
   print_job_->StartPrinting();
@@ -1117,6 +1124,7 @@
     enterprise_connectors::ContentAnalysisDelegate::Data data,
     content::GlobalRenderFrameHostId rfh_id,
     mojom::DidPrintDocumentParamsPtr params) {
+  snapshotting_for_content_analysis_ = false;
   auto* rfh = content::RenderFrameHost::FromID(rfh_id);
   if (!params || !rfh || !PrintJobHasDocument(params->document_cookie) ||
       !params->content->metafile_data_region.IsValid()) {
@@ -1170,6 +1178,11 @@
           std::move(callback)),
       safe_browsing::DeepScanAccessPoint::PRINT);
 }
+
+void PrintViewManagerBase::set_snapshotting_for_content_analysis() {
+  snapshotting_for_content_analysis_ = true;
+}
+
 #endif  // BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
 
 }  // namespace printing
diff --git a/chrome/browser/printing/print_view_manager_base.h b/chrome/browser/printing/print_view_manager_base.h
index ffbdbe36..a413a26 100644
--- a/chrome/browser/printing/print_view_manager_base.h
+++ b/chrome/browser/printing/print_view_manager_base.h
@@ -199,6 +199,9 @@
       content::GlobalRenderFrameHostId rfh_id,
       mojom::PrintCompositor::Status status,
       base::ReadOnlySharedMemoryRegion page_region);
+
+  // Helper method to set `snapshotting_for_content_analysis_` in child classes.
+  void set_snapshotting_for_content_analysis();
 #endif  // BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
 
   // Manages the low-level talk to the printer.
@@ -340,6 +343,11 @@
   absl::optional<uint32_t> service_manager_client_id_;
 #endif
 
+#if BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
+  // Indicates that a snapshot of the page/document is currently being made.
+  bool snapshotting_for_content_analysis_ = false;
+#endif  // BUILDFLAG(ENABLE_PRINT_CONTENT_ANALYSIS)
+
   const scoped_refptr<PrintQueriesQueue> queue_;
 
   base::ObserverList<Observer> observers_;
diff --git a/chrome/browser/resources/bookmarks/debouncer.ts b/chrome/browser/resources/bookmarks/debouncer.ts
index 5c647a6..5c51c51f 100644
--- a/chrome/browser/resources/bookmarks/debouncer.ts
+++ b/chrome/browser/resources/bookmarks/debouncer.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {assert} from 'chrome://resources/js/assert_ts.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 /**
  * @fileoverview A debouncer which fires the given callback after a delay. The
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
index 3ff68c9..38ed744 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -8,6 +8,7 @@
 import {CursorRange} from '../../common/cursors/range.js';
 import {InstanceChecker} from '../../common/instance_checker.js';
 import {AbstractEarcons} from '../common/abstract_earcons.js';
+import {NavBraille} from '../common/braille/nav_braille.js';
 import {ExtensionBridge} from '../common/extension_bridge.js';
 import {LocaleOutputHelper} from '../common/locale_output_helper.js';
 import {Msgs} from '../common/msgs.js';
@@ -88,6 +89,10 @@
     // Initialize legacy background page first.
     ChromeVoxBackground.init(this);
 
+    chrome.accessibilityPrivate.onIntroduceChromeVox.addListener(
+        () => this.onIntroduceChromeVox_());
+
+
     // Read-only earcons.
     Object.defineProperty(ChromeVox, 'earcons', {
       get: () => this.earcons_,
@@ -472,6 +477,17 @@
   }
 
   /**
+   * Handles the onIntroduceChromeVox event.
+   * @private
+   */
+  onIntroduceChromeVox_() {
+    ChromeVox.tts.speak(
+        Msgs.getMsg('chromevox_intro'), QueueMode.QUEUE,
+        new TtsSpeechProperties({doNotInterrupt: true}));
+    ChromeVox.braille.write(NavBraille.fromText(Msgs.getMsg('intro_brl')));
+  }
+
+  /**
    * Converts a list of globs, as used in the extension manifest, to a regular
    * expression that matches if and only if any of the globs in the list
    * matches.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js
index ba019ed..f9ff3e1 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/classic_background.js
@@ -61,9 +61,6 @@
     ChromeVox.tts = this.tts;
     ChromeVox.braille = this.backgroundBraille_;
 
-    chrome.accessibilityPrivate.onIntroduceChromeVox.addListener(
-        this.onIntroduceChromeVox);
-
     // Set up a message passing system for goog.provide() calls from
     // within the content scripts.
     chrome.extension.onMessage.addListener((request, sender, callback) => {
@@ -231,16 +228,6 @@
   }
 
   /**
-   * Handles the onIntroduceChromeVox event.
-   */
-  onIntroduceChromeVox() {
-    ChromeVox.tts.speak(
-        Msgs.getMsg('chromevox_intro'), QueueMode.QUEUE,
-        new TtsSpeechProperties({doNotInterrupt: true}));
-    ChromeVox.braille.write(NavBraille.fromText(Msgs.getMsg('intro_brl')));
-  }
-
-  /**
    * Gets the voice currently used by ChromeVox when calling tts.
    * @return {string}
    */
diff --git a/chrome/browser/resources/chromeos/parent_access/BUILD.gn b/chrome/browser/resources/chromeos/parent_access/BUILD.gn
index be167daf..5bb9a340 100644
--- a/chrome/browser/resources/chromeos/parent_access/BUILD.gn
+++ b/chrome/browser/resources/chromeos/parent_access/BUILD.gn
@@ -49,7 +49,7 @@
 js_library("parent_access_controller") {
   deps = [
     "//ash/webui/common/resources/post_message_api:post_message_api_server",
-    "//ui/webui/resources/js:promise_resolver.m",
+    "//ui/webui/resources/js:promise_resolver",
   ]
 }
 
diff --git a/chrome/browser/resources/chromeos/parent_access/parent_access_controller.js b/chrome/browser/resources/chromeos/parent_access/parent_access_controller.js
index 90d792f..b6abe5a 100644
--- a/chrome/browser/resources/chromeos/parent_access/parent_access_controller.js
+++ b/chrome/browser/resources/chromeos/parent_access/parent_access_controller.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {PostMessageAPIServer} from 'chrome://resources/ash/common/post_message_api/post_message_api_server.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 /**
  * Class that implements the Chrome side of the ParentAccess PostMessageAPI.
diff --git a/chrome/browser/resources/chromeos/sys_internals/BUILD.gn b/chrome/browser/resources/chromeos/sys_internals/BUILD.gn
index b7537c8..1d03e83 100644
--- a/chrome/browser/resources/chromeos/sys_internals/BUILD.gn
+++ b/chrome/browser/resources/chromeos/sys_internals/BUILD.gn
@@ -19,7 +19,7 @@
     "line_chart:line_chart",
     "line_chart:unit_label",
     "//ui/webui/resources/js:cr.m",
-    "//ui/webui/resources/js:promise_resolver.m",
+    "//ui/webui/resources/js:promise_resolver",
     "//ui/webui/resources/js:util.m",
   ]
 
diff --git a/chrome/browser/resources/chromeos/sys_internals/index.js b/chrome/browser/resources/chromeos/sys_internals/index.js
index 2f9b32b..e8f96a79 100644
--- a/chrome/browser/resources/chromeos/sys_internals/index.js
+++ b/chrome/browser/resources/chromeos/sys_internals/index.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {$} from 'chrome://resources/js/util.m.js';
 
 import {CPU_COLOR_SET, INFO_PAGE_PRECISION, MEMORY_COLOR_SET, PAGE_HASH, UNITBASE_MEMORY, UNITBASE_NUMBER_PER_SECOND, UNITS_MEMORY, UNITS_NUMBER_PER_SECOND, UPDATE_PERIOD, ZRAM_COLOR_SET} from './constants.js';
diff --git a/chrome/browser/resources/downloads/icon_loader.ts b/chrome/browser/resources/downloads/icon_loader.ts
index 9b9e9c29..e0d4c21 100644
--- a/chrome/browser/resources/downloads/icon_loader.ts
+++ b/chrome/browser/resources/downloads/icon_loader.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {getFileIconUrl} from 'chrome://resources/js/icon.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 export interface IconLoader {
   loadIcon(imageEl: HTMLImageElement, filePath: string): Promise<boolean>;
diff --git a/chrome/browser/resources/downloads/manager.ts b/chrome/browser/resources/downloads/manager.ts
index 7c8707a..57f8c06 100644
--- a/chrome/browser/resources/downloads/manager.ts
+++ b/chrome/browser/resources/downloads/manager.ts
@@ -19,7 +19,7 @@
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {EventTracker} from 'chrome://resources/js/event_tracker.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import {Debouncer, PolymerElement, timeOut} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/engagement/site_engagement.ts b/chrome/browser/resources/engagement/site_engagement.ts
index d64d5ea..084f439d 100644
--- a/chrome/browser/resources/engagement/site_engagement.ts
+++ b/chrome/browser/resources/engagement/site_engagement.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {createElementWithClassName} from 'chrome://resources/js/util.m.js';
 import {Url} from 'chrome://resources/mojo/url/mojom/url.mojom-webui.js';
 
diff --git a/chrome/browser/resources/extensions/activity_log/activity_log_history.ts b/chrome/browser/resources/extensions/activity_log/activity_log_history.ts
index 89edb03..7f49b3e 100644
--- a/chrome/browser/resources/extensions/activity_log/activity_log_history.ts
+++ b/chrome/browser/resources/extensions/activity_log/activity_log_history.ts
@@ -10,7 +10,7 @@
 import './activity_log_history_item.js';
 
 import {assert} from 'chrome://resources/js/assert_ts.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './activity_log_history.html.js';
diff --git a/chrome/browser/resources/media/media_engagement.ts b/chrome/browser/resources/media/media_engagement.ts
index 03c251d..a0efda2 100644
--- a/chrome/browser/resources/media/media_engagement.ts
+++ b/chrome/browser/resources/media/media_engagement.ts
@@ -5,7 +5,7 @@
 import 'chrome://resources/mojo/url/mojom/origin.mojom-webui.js';
 
 import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {MediaEngagementConfig, MediaEngagementScoreDetails, MediaEngagementScoreDetailsProvider, MediaEngagementScoreDetailsProviderRemote} from './media_engagement_score_details.mojom-webui.js';
 
diff --git a/chrome/browser/resources/media/media_history.ts b/chrome/browser/resources/media/media_history.ts
index 9483935..eb6aaa2 100644
--- a/chrome/browser/resources/media/media_history.ts
+++ b/chrome/browser/resources/media/media_history.ts
@@ -5,7 +5,7 @@
 import 'chrome://resources/cr_elements/cr_tab_box/cr_tab_box.js';
 
 import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js';
 
 import {MediaDataTable, MediaDataTableDelegate} from './media_data_table.js';
diff --git a/chrome/browser/resources/new_tab_page/background_manager.ts b/chrome/browser/resources/new_tab_page/background_manager.ts
index 1179fce..f47b812 100644
--- a/chrome/browser/resources/new_tab_page/background_manager.ts
+++ b/chrome/browser/resources/new_tab_page/background_manager.ts
@@ -4,7 +4,7 @@
 
 import {skColorToRgba} from 'chrome://resources/js/color_utils.js';
 import {EventTracker} from 'chrome://resources/js/event_tracker.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {SkColor} from 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js';
 
 import {BackgroundImage} from './new_tab_page.mojom-webui.js';
diff --git a/chrome/browser/resources/pdf/controller.ts b/chrome/browser/resources/pdf/controller.ts
index 1c42841..487b548 100644
--- a/chrome/browser/resources/pdf/controller.ts
+++ b/chrome/browser/resources/pdf/controller.ts
@@ -4,7 +4,7 @@
 
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {NamedDestinationMessageData, SaveRequestType} from './constants.js';
 import {PdfPluginElement} from './internal_plugin.js';
diff --git a/chrome/browser/resources/pdf/elements/viewer-download-controls.ts b/chrome/browser/resources/pdf/elements/viewer-download-controls.ts
index 6e73ec9..9c5d7eb 100644
--- a/chrome/browser/resources/pdf/elements/viewer-download-controls.ts
+++ b/chrome/browser/resources/pdf/elements/viewer-download-controls.ts
@@ -10,7 +10,7 @@
 
 import {AnchorAlignment, CrActionMenuElement} from 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
 import {CrIconButtonElement} from 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {SaveRequestType} from '../constants.js';
diff --git a/chrome/browser/resources/pdf/pdf_viewer_base.ts b/chrome/browser/resources/pdf/pdf_viewer_base.ts
index 31a2c69..d30222f 100644
--- a/chrome/browser/resources/pdf/pdf_viewer_base.ts
+++ b/chrome/browser/resources/pdf/pdf_viewer_base.ts
@@ -5,7 +5,7 @@
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {EventTracker} from 'chrome://resources/js/event_tracker.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {BrowserApi, ZoomBehavior} from './browser_api.js';
diff --git a/chrome/browser/resources/print_preview/data/model.ts b/chrome/browser/resources/print_preview/data/model.ts
index 64f4f1a..977bcbf 100644
--- a/chrome/browser/resources/print_preview/data/model.ts
+++ b/chrome/browser/resources/print_preview/data/model.ts
@@ -6,7 +6,7 @@
 // <if expr="is_chromeos">
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 // </if>
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {BackgroundGraphicsModeRestriction, Policies} from '../native_layer.js';
diff --git a/chrome/browser/resources/print_preview/ui/provisional_destination_resolver.ts b/chrome/browser/resources/print_preview/ui/provisional_destination_resolver.ts
index 76fdc81..084eb1f 100644
--- a/chrome/browser/resources/print_preview/ui/provisional_destination_resolver.ts
+++ b/chrome/browser/resources/print_preview/ui/provisional_destination_resolver.ts
@@ -14,7 +14,7 @@
 import {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Destination} from '../data/destination.js';
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index ff96a92..8d62280 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -504,7 +504,7 @@
   deps = [
     ":route_observer_behavior",
     "..:router",
-    "//ui/webui/resources/js:promise_resolver.m",
+    "//ui/webui/resources/js:promise_resolver",
   ]
 }
 
diff --git a/chrome/browser/resources/settings/chromeos/global_scroll_target_behavior.js b/chrome/browser/resources/settings/chromeos/global_scroll_target_behavior.js
index 3b5304c..3dc64140 100644
--- a/chrome/browser/resources/settings/chromeos/global_scroll_target_behavior.js
+++ b/chrome/browser/resources/settings/chromeos/global_scroll_target_behavior.js
@@ -14,7 +14,7 @@
  * |setGlobalScrollTarget| should only be called once.
  */
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {Route, Router} from '../router.js';
 import {RouteObserverBehavior} from './route_observer_behavior.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
index 3854dd3..c7b0ba9f 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
@@ -136,14 +136,14 @@
   deps = [
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
     "//ui/webui/resources/js:assert.m",
-    "//ui/webui/resources/js:promise_resolver.m",
+    "//ui/webui/resources/js:promise_resolver",
   ]
 }
 
 js_library("fake_page_handler") {
   deps = [
     "//ui/webui/resources/cr_components/app_management:mojo_bindings_js_library_for_compile",
-    "//ui/webui/resources/js:promise_resolver.m",
+    "//ui/webui/resources/js:promise_resolver",
   ]
   externs_list = [ "./types.js" ]
 }
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/dom_switch.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/dom_switch.js
index 59c8f7d..26eb6d4 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/dom_switch.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/dom_switch.js
@@ -32,7 +32,7 @@
 
 // TODO(crbug.com/992795) Merge with cr-view-manager.
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {html, PolymerElement, TemplateInstanceBase, templatize} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /** @polymer */
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/fake_page_handler.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/fake_page_handler.js
index 407831f..1bdf424 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/fake_page_handler.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/fake_page_handler.js
@@ -6,7 +6,7 @@
 import {AppType, InstallReason, InstallSource, OptionalBool, WindowMode} from 'chrome://resources/cr_components/app_management/constants.js';
 import {createBoolPermission, createTriStatePermission, getTriStatePermissionValue} from 'chrome://resources/cr_components/app_management/permission_util.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {AppManagementStore} from './store.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
index bcfe5fb..ab6d762 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
@@ -47,7 +47,7 @@
     "//ui/webui/resources/js:assert.m",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
-    "//ui/webui/resources/js:promise_resolver.m",
+    "//ui/webui/resources/js:promise_resolver",
   ]
   externs_list = [
     "$externs_path/input_method_private.js",
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/languages.js b/chrome/browser/resources/settings/chromeos/os_languages_page/languages.js
index 3071052..f53ff6b 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/languages.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/languages.js
@@ -14,7 +14,7 @@
 
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {CrSettingsPrefs} from '../../prefs/prefs_types.js';
diff --git a/chrome/browser/resources/settings/global_scroll_target_mixin.ts b/chrome/browser/resources/settings/global_scroll_target_mixin.ts
index a401899..9b833d3 100644
--- a/chrome/browser/resources/settings/global_scroll_target_mixin.ts
+++ b/chrome/browser/resources/settings/global_scroll_target_mixin.ts
@@ -14,7 +14,7 @@
  * |setGlobalScrollTarget| should only be called once.
  */
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from './router.js';
diff --git a/chrome/browser/resources/settings/languages_page/languages.ts b/chrome/browser/resources/settings/languages_page/languages.ts
index c05825e..4720bbd5 100644
--- a/chrome/browser/resources/settings/languages_page/languages.ts
+++ b/chrome/browser/resources/settings/languages_page/languages.ts
@@ -13,7 +13,7 @@
 import '../prefs/prefs.js';
 
 import {assert} from '//resources/js/assert_ts.js';
-import {PromiseResolver} from '//resources/js/promise_resolver.m.js';
+import {PromiseResolver} from '//resources/js/promise_resolver.js';
 import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {PrefsMixin} from '../prefs/prefs_mixin.js';
diff --git a/chrome/browser/resources/settings/prefs/prefs_types.ts b/chrome/browser/resources/settings/prefs/prefs_types.ts
index 5f952586..2246de9 100644
--- a/chrome/browser/resources/settings/prefs/prefs_types.ts
+++ b/chrome/browser/resources/settings/prefs/prefs_types.ts
@@ -6,7 +6,7 @@
  * @fileoverview Global state for prefs initialization status.
  */
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 class CrSettingsPrefsInternal {
   isInitialized: boolean = false;
diff --git a/chrome/browser/resources/settings/search_settings.ts b/chrome/browser/resources/settings/search_settings.ts
index d77f9e95..ec7fe62 100644
--- a/chrome/browser/resources/settings/search_settings.ts
+++ b/chrome/browser/resources/settings/search_settings.ts
@@ -5,7 +5,7 @@
 // clang-format off
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {createEmptySearchBubble, findAndRemoveHighlights, highlight, removeHighlights, stripDiacritics} from 'chrome://resources/js/search_highlight_utils.js';
 import {findAncestor} from 'chrome://resources/js/util.m.js';
 import {DomIf, microTask} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/side_panel/read_anything/app.ts b/chrome/browser/resources/side_panel/read_anything/app.ts
index c63d344..14fab5b0 100644
--- a/chrome/browser/resources/side_panel/read_anything/app.ts
+++ b/chrome/browser/resources/side_panel/read_anything/app.ts
@@ -147,7 +147,7 @@
       '--foreground-color': skColorToRgba(foregroundColor),
       '--background-color': skColorToRgba(backgroundColor),
       '--font-family': this.validatedFontName(),
-      '--font-size': chrome.readAnything.fontSize + 'px',
+      '--font-size': chrome.readAnything.fontSize + 'em',
       '--letter-spacing': chrome.readAnything.letterSpacing + 'em',
     });
   }
diff --git a/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service.cc b/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service.cc
index f0d29080..b66f8690 100644
--- a/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service.cc
+++ b/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service.cc
@@ -70,12 +70,18 @@
 }
 
 bool ChromeEnterpriseRealTimeUrlLookupService::CanCheckSafeBrowsingDb() const {
-  // Check database if safe browsing is enabled and allowlist bypass is
+  // Check database if safe browsing is enabled.
+  return safe_browsing::IsSafeBrowsingEnabled(*profile_->GetPrefs());
+}
+
+bool ChromeEnterpriseRealTimeUrlLookupService::
+    CanCheckSafeBrowsingHighConfidenceAllowlist() const {
+  // Check allowlist if it can check database and allowlist bypass is
   // disabled. Check the feature value at the end. This ensures that with the
   // finch experiment set to starts_active false, the active users in our
   // control and experimental arms will be a comparable population (Enterprise
   // users with SafeBrowsing and RTLookup enabled)
-  return safe_browsing::IsSafeBrowsingEnabled(*profile_->GetPrefs()) &&
+  return CanCheckSafeBrowsingDb() &&
          (!CanPerformFullURLLookup() ||
           !base::FeatureList::IsEnabled(
               safe_browsing::kRealTimeUrlLookupForEnterpriseAllowlistBypass));
diff --git a/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service.h b/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service.h
index 0cdb0ff..c2e7462 100644
--- a/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service.h
+++ b/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service.h
@@ -54,6 +54,7 @@
   bool CanPerformFullURLLookup() const override;
   bool CanCheckSubresourceURL() const override;
   bool CanCheckSafeBrowsingDb() const override;
+  bool CanCheckSafeBrowsingHighConfidenceAllowlist() const override;
   bool CanSendRTSampleRequest() const override;
 
  private:
diff --git a/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service_unittest.cc b/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service_unittest.cc
index ae02da37..276f474 100644
--- a/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service_unittest.cc
+++ b/chrome/browser/safe_browsing/chrome_enterprise_url_lookup_service_unittest.cc
@@ -251,7 +251,7 @@
 }
 
 TEST_F(ChromeEnterpriseRealTimeUrlLookupServiceTest,
-       TestCanCheckSafeBrowsingDb_BypassAllowlistFeature) {
+       TestCanCheckSafeBrowsingHighConfidenceAllowlist_BypassAllowlistFeature) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       {safe_browsing::kRealTimeUrlLookupForEnterpriseAllowlistBypass}, {});
@@ -263,18 +263,20 @@
   test_profile_->GetPrefs()->SetInteger(
       prefs::kSafeBrowsingEnterpriseRealTimeUrlCheckMode,
       REAL_TIME_CHECK_DISABLED);
-  EXPECT_TRUE(enterprise_rt_service()->CanCheckSafeBrowsingDb());
+  EXPECT_TRUE(
+      enterprise_rt_service()->CanCheckSafeBrowsingHighConfidenceAllowlist());
 
   // Bypass allowlist if the SafeBrowsingEnterpriseRealTimeUrlCheckMode pref is
   // set.
   test_profile_->GetPrefs()->SetInteger(
       prefs::kSafeBrowsingEnterpriseRealTimeUrlCheckMode,
       REAL_TIME_CHECK_FOR_MAINFRAME_ENABLED);
-  EXPECT_FALSE(enterprise_rt_service()->CanCheckSafeBrowsingDb());
+  EXPECT_FALSE(
+      enterprise_rt_service()->CanCheckSafeBrowsingHighConfidenceAllowlist());
 }
 
 TEST_F(ChromeEnterpriseRealTimeUrlLookupServiceTest,
-       TestCanCheckSafeBrowsingDb_CheckAllowlist) {
+       TestCanCheckSafeBrowsingHighConfidenceAllowlist_CheckAllowlist) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       {}, {safe_browsing::kRealTimeUrlLookupForEnterpriseAllowlistBypass});
@@ -284,7 +286,8 @@
   test_profile_->GetPrefs()->SetInteger(
       prefs::kSafeBrowsingEnterpriseRealTimeUrlCheckMode,
       REAL_TIME_CHECK_FOR_MAINFRAME_ENABLED);
-  EXPECT_TRUE(enterprise_rt_service()->CanCheckSafeBrowsingDb());
+  EXPECT_TRUE(
+      enterprise_rt_service()->CanCheckSafeBrowsingHighConfidenceAllowlist());
 }
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/segmentation_platform/chrome_browser_main_extra_parts_segmentation_platform.cc b/chrome/browser/segmentation_platform/chrome_browser_main_extra_parts_segmentation_platform.cc
index ecd9f93e..ef603e4 100644
--- a/chrome/browser/segmentation_platform/chrome_browser_main_extra_parts_segmentation_platform.cc
+++ b/chrome/browser/segmentation_platform/chrome_browser_main_extra_parts_segmentation_platform.cc
@@ -4,13 +4,10 @@
 
 #include "chrome/browser/segmentation_platform/chrome_browser_main_extra_parts_segmentation_platform.h"
 
-#include "base/feature_list.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/segmentation_platform/segmentation_platform_service_factory.h"
 #include "chrome/browser/segmentation_platform/ukm_database_client.h"
-#include "components/segmentation_platform/public/config.h"
-#include "components/segmentation_platform/public/features.h"
 #include "components/segmentation_platform/public/local_state_helper.h"
 #include "components/segmentation_platform/public/segmentation_platform_service.h"
 
@@ -32,17 +29,8 @@
   // Always create SegmentationPlatformService when a new Profile is
   // initialized. This will trigger model downloads and feature storage, so when
   // the client requests segment the platform is ready with results.
-  auto* service =
-      segmentation_platform::SegmentationPlatformServiceFactory::GetForProfile(
-          profile);
-
-  // If dummy feature is enabled, make sure the platform triggers all selection
-  // code paths and computes results.
-  if (base::FeatureList::IsEnabled(
-          segmentation_platform::features::kSegmentationPlatformDummyFeature)) {
-    service->GetSelectedSegment(segmentation_platform::kDummySegmentationKey,
-                                base::DoNothing());
-  }
+  segmentation_platform::SegmentationPlatformServiceFactory::GetForProfile(
+      profile);
 }
 
 void ChromeBrowserMainExtraPartsSegmentationPlatform::PostMainMessageLoopRun() {
diff --git a/chrome/browser/segmentation_platform/segmentation_platform_config.cc b/chrome/browser/segmentation_platform/segmentation_platform_config.cc
index 00d503d0..3c3c702 100644
--- a/chrome/browser/segmentation_platform/segmentation_platform_config.cc
+++ b/chrome/browser/segmentation_platform/segmentation_platform_config.cc
@@ -54,8 +54,6 @@
 
 // Default TTL for segment selection and unknown selection:
 
-constexpr int kDummyFeatureSelectionTTLDays = 1;
-
 constexpr int kChromeLowUserEngagementSelectionTTLDays = 7;
 
 constexpr int kFeedUserSegmentSelectionTTLDays = 14;
@@ -116,16 +114,6 @@
 }
 #endif
 
-std::unique_ptr<Config> GetConfigForDummyFeature() {
-  auto config = std::make_unique<Config>();
-  config->segmentation_key = kDummySegmentationKey;
-  config->segmentation_uma_name = kDummyFeatureUmaName;
-  config->AddSegmentId(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_DUMMY);
-  config->segment_selection_ttl = base::Days(kDummyFeatureSelectionTTLDays);
-  config->unknown_selection_ttl = base::Days(kDummyFeatureSelectionTTLDays);
-  return config;
-}
-
 #if BUILDFLAG(IS_ANDROID)
 std::unique_ptr<ModelProvider> GetChromeStartAndroidModel() {
   if (!base::GetFieldTrialParamByFeatureAsBool(
@@ -419,10 +407,6 @@
 std::vector<std::unique_ptr<Config>> GetSegmentationPlatformConfig(
     content::BrowserContext* context) {
   std::vector<std::unique_ptr<Config>> configs;
-  if (base::FeatureList::IsEnabled(
-          segmentation_platform::features::kSegmentationPlatformDummyFeature)) {
-    configs.emplace_back(GetConfigForDummyFeature());
-  }
 #if BUILDFLAG(IS_ANDROID)
   if (base::FeatureList::IsEnabled(
           chrome::android::kAdaptiveButtonInTopToolbarCustomizationV2)) {
diff --git a/chrome/browser/share/qr_code_generation_request.cc b/chrome/browser/share/qr_code_generation_request.cc
index 7c93039..ca111c6 100644
--- a/chrome/browser/share/qr_code_generation_request.cc
+++ b/chrome/browser/share/qr_code_generation_request.cc
@@ -33,7 +33,7 @@
       qrcode_generator::mojom::GenerateQRCodeRequest::New();
   request->data = url_string;
   request->should_render = true;
-  request->render_dino = true;
+  request->center_image = qrcode_generator::mojom::CenterImage::CHROME_DINO;
   request->render_module_style = qrcode_generator::mojom::ModuleStyle::CIRCLES;
   request->render_locator_style =
       qrcode_generator::mojom::LocatorStyle::ROUNDED;
diff --git a/chrome/browser/speech/extension_api/tts_extension_api_ash_browsertest.cc b/chrome/browser/speech/extension_api/tts_extension_api_ash_browsertest.cc
new file mode 100644
index 0000000..45fcd9b
--- /dev/null
+++ b/chrome/browser/speech/extension_api/tts_extension_api_ash_browsertest.cc
@@ -0,0 +1,151 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+#include <vector>
+
+#include "ash/constants/ash_features.h"
+#include "base/feature_list.h"
+#include "base/location.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/extensions/extension_apitest.h"
+#include "chrome/browser/speech/extension_api/tts_engine_extension_api.h"
+#include "chrome/browser/speech/tts_crosapi_util.h"
+#include "chrome/test/base/chromeos/ash_browser_test_starter.h"
+#include "content/public/browser/tts_controller.h"
+#include "content/public/test/browser_test.h"
+
+namespace {
+
+void GiveItSomeTime(base::TimeDelta delta) {
+  base::RunLoop run_loop;
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, run_loop.QuitClosure(), delta);
+  run_loop.Run();
+}
+
+}  // namespace
+
+namespace extensions {
+class AshTtsApiTest : public ExtensionApiTest,
+                      public content::VoicesChangedDelegate {
+ public:
+  void SetUpInProcessBrowserTestFixture() override {
+    ExtensionApiTest::SetUpInProcessBrowserTestFixture();
+
+    if (!ash_starter_.HasLacrosArgument())
+      return;
+
+    // Prepare environment for loading Lacros for Lacros Only mode.
+    ASSERT_TRUE(ash_starter_.PrepareEnvironmentForLacros());
+
+    // Enable Lacros tts support feature, and disable the 1st party Ash
+    // extension keeplist feature so that it will allow loading test extension
+    // in Ash in Lacros only mode.
+    scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>();
+    scoped_feature_list_->InitWithFeatures(
+        {}, {chromeos::features::kEnforceAshExtensionKeeplist,
+             ash::features::kDisableLacrosTtsSupport});
+
+    content::TtsController::SkipAddNetworkChangeObserverForTests(true);
+    content::TtsController* tts_controller =
+        content::TtsController::GetInstance();
+    TtsExtensionEngine::GetInstance()->DisableBuiltInTTSEngineForTesting();
+    tts_controller->SetTtsEngineDelegate(TtsExtensionEngine::GetInstance());
+  }
+
+  void SetUpOnMainThread() override {
+    ExtensionApiTest::SetUpOnMainThread();
+
+    if (!ash_starter_.HasLacrosArgument())
+      return;
+
+    ash_starter_.StartLacros(this);
+  }
+
+  void TearDownInProcessBrowserTestFixture() override {
+    scoped_feature_list_.reset(nullptr);
+  }
+
+ protected:
+  bool HasVoiceWithName(const std::string& name) {
+    std::vector<content::VoiceData> voices;
+
+    content::TtsController::GetInstance()->GetVoices(profile(), GURL(),
+                                                     &voices);
+
+    for (const auto& voice : voices) {
+      if (voice.name == name)
+        return true;
+    }
+
+    return false;
+  }
+
+  // content::VoicesChangedDelegate:
+  void OnVoicesChanged() override {
+    voices_changed_ = true;
+    std::vector<content::VoiceData> voices;
+    content::TtsController::GetInstance()->GetVoices(profile(), GURL(),
+                                                     &voices);
+    expected_voice_loaded_ = false;
+    for (const auto& voice : voices) {
+      if (voice.name == "Amy") {
+        expected_voice_loaded_ = true;
+        break;
+      }
+    }
+  }
+
+  void WaitUntilVoicesLoaded() {
+    while (!expected_voice_loaded_) {
+      GiveItSomeTime(base::Milliseconds(100));
+    }
+  }
+
+  bool VoicesChangedNotified() { return voices_changed_; }
+  void ResetVoicesChanged() { voices_changed_ = false; }
+
+  std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_;
+  test::AshBrowserTestStarter ash_starter_;
+
+ private:
+  bool voices_changed_ = false;
+  bool expected_voice_loaded_ = false;
+};
+
+//
+// TTS Engine tests.
+//
+
+IN_PROC_BROWSER_TEST_F(AshTtsApiTest, RegisterEngine) {
+  if (!ash_starter_.HasLacrosArgument())
+    return;
+
+  EXPECT_FALSE(VoicesChangedNotified());
+  EXPECT_FALSE(HasVoiceWithName("Amy"));
+  EXPECT_FALSE(HasVoiceWithName("Alex"));
+  EXPECT_FALSE(HasVoiceWithName("Amanda"));
+
+  ResetVoicesChanged();
+  content::TtsController::GetInstance()->AddVoicesChangedDelegate(this);
+  ASSERT_TRUE(
+      RunExtensionTest("tts_engine/lacros_tts_support/register_ash_engine", {},
+                       {.ignore_manifest_warnings = true}))
+      << message_;
+
+  WaitUntilVoicesLoaded();
+
+  EXPECT_TRUE(VoicesChangedNotified());
+
+  // Verify all the voices from tts engine extension are returned by
+  // TtsController::GetVoices().
+  std::vector<content::VoiceData> voices;
+  content::TtsController::GetInstance()->GetVoices(profile(), GURL(), &voices);
+  EXPECT_TRUE(HasVoiceWithName("Amy"));
+  EXPECT_TRUE(HasVoiceWithName("Alex"));
+  EXPECT_TRUE(HasVoiceWithName("Amanda"));
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/sync/sync_service_factory_unittest.cc b/chrome/browser/sync/sync_service_factory_unittest.cc
index 1f8daa6a..0a07ec6c 100644
--- a/chrome/browser/sync/sync_service_factory_unittest.cc
+++ b/chrome/browser/sync/sync_service_factory_unittest.cc
@@ -143,7 +143,9 @@
     datatypes.Put(syncer::AUTOFILL_WALLET_METADATA);
     datatypes.Put(syncer::AUTOFILL_WALLET_OFFER);
     datatypes.Put(syncer::BOOKMARKS);
-    // TODO(crbug.com/1348294): Add CONTACT_INFO once it has a controller.
+    if (base::FeatureList::IsEnabled(syncer::kSyncEnableContactInfoDataType)) {
+      datatypes.Put(syncer::CONTACT_INFO);
+    }
     datatypes.Put(syncer::DEVICE_INFO);
     if (base::FeatureList::IsEnabled(syncer::kSyncEnableHistoryDataType)) {
       datatypes.Put(syncer::HISTORY);
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabHidingType.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabHidingType.java
index 87a713e..877760ca 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabHidingType.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabHidingType.java
@@ -9,8 +9,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
-@IntDef({TabHidingType.CHANGED_TABS, TabHidingType.ACTIVITY_HIDDEN, TabHidingType.REPARENTED,
-        TabHidingType.OVERVIEW_SHOWN})
+@IntDef({TabHidingType.CHANGED_TABS, TabHidingType.ACTIVITY_HIDDEN, TabHidingType.REPARENTED})
 @Retention(RetentionPolicy.SOURCE)
 public @interface TabHidingType {
     /** A tab was hidden due to other tab getting foreground. */
@@ -21,10 +20,4 @@
 
     /** A tab was hidden while being reparented to a new activity. */
     int REPARENTED = 2;
-
-    /**
-     * A tab was hidden due to overview page (start surface or tab switcher surface) getting
-     * foreground.
-     */
-    int OVERVIEW_SHOWN = 3;
 }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 2390b929..ce72f5a 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1256,6 +1256,8 @@
       "performance_controls/high_efficiency_bubble_delegate.cc",
       "performance_controls/high_efficiency_bubble_delegate.h",
       "performance_controls/high_efficiency_bubble_observer.h",
+      "performance_controls/high_efficiency_iph_controller.cc",
+      "performance_controls/high_efficiency_iph_controller.h",
       "performance_controls/tab_discard_tab_helper.cc",
       "performance_controls/tab_discard_tab_helper.h",
       "permission_bubble/permission_prompt.h",
@@ -5212,8 +5214,8 @@
       "views/webauthn/authenticator_select_account_sheet_view.h",
       "views/webauthn/hover_list_view.cc",
       "views/webauthn/hover_list_view.h",
-      "views/webauthn/passkey_pill_view.cc",
-      "views/webauthn/passkey_pill_view.h",
+      "views/webauthn/passkey_detail_view.cc",
+      "views/webauthn/passkey_detail_view.h",
       "views/webauthn/ring_progress_bar.cc",
       "views/webauthn/ring_progress_bar.h",
       "views/webauthn/sheet_view_factory.cc",
diff --git a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java
index ee86038..e7f737d 100644
--- a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java
+++ b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java
@@ -242,12 +242,10 @@
     }
 
     private void updateVisibility() {
-        boolean shouldShowLogo = mIsParentSurfaceShown
+        mShouldShowLogo = mIsParentSurfaceShown
                 && (!mIsNativeInitialized
                         || TemplateUrlServiceFactory.get().doesDefaultSearchEngineHaveLogo());
-        if (shouldShowLogo == mShouldShowLogo) return;
 
-        mShouldShowLogo = shouldShowLogo;
         mLogoView.setVisibility(mShouldShowLogo ? View.VISIBLE : View.GONE);
     }
 
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc
index f4b2dc9..7bdb566 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc
+++ b/chrome/browser/ui/ash/holding_space/holding_space_ui_browsertest.cc
@@ -708,8 +708,15 @@
   ASSERT_FALSE(test_api().IsShowing());
 }
 
+// Disabled due to flakiness. http://crbug.com/1261364
+#if BUILDFLAG(IS_CHROMEOS)
+#define MAYBE_DragAndDropToPin DISABLED_DragAndDropToPin
+#else
+#define MAYBE_DragAndDropToPin DragAndDropToPin
+#endif
 // Verifies that drag-and-drop to pin holding space items works.
-IN_PROC_BROWSER_TEST_P(HoldingSpaceUiDragAndDropBrowserTest, DragAndDropToPin) {
+IN_PROC_BROWSER_TEST_P(HoldingSpaceUiDragAndDropBrowserTest,
+                       MAYBE_DragAndDropToPin) {
   ui::ScopedAnimationDurationScaleMode scoped_animation_duration_scale_mode(
       ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
 
diff --git a/chrome/browser/ui/ash/projector/pending_screencast_manager.cc b/chrome/browser/ui/ash/projector/pending_screencast_manager.cc
index 4e7fe70..7e5a86cb 100644
--- a/chrome/browser/ui/ash/projector/pending_screencast_manager.cc
+++ b/chrome/browser/ui/ash/projector/pending_screencast_manager.cc
@@ -560,6 +560,7 @@
       GURL(base::StrCat({ash::kDriveV3BaseUrl, file_id})),
       ash::kRequestMethodPatch, request_body,
       /*use_credentials=*/false,
+      /*use_api_key=*/false,
       base::BindOnce([](bool success, const std::string& response_body,
                         const std::string& error) {
         if (!success) {
diff --git a/chrome/browser/ui/performance_controls/high_efficiency_iph_controller.cc b/chrome/browser/ui/performance_controls/high_efficiency_iph_controller.cc
new file mode 100644
index 0000000..562bbfa
--- /dev/null
+++ b/chrome/browser/ui/performance_controls/high_efficiency_iph_controller.cc
@@ -0,0 +1,48 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/performance_controls/high_efficiency_iph_controller.h"
+
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/performance_manager/public/features.h"
+#include "components/performance_manager/public/user_tuning/prefs.h"
+#include "components/prefs/pref_service.h"
+
+HighEfficiencyIPHController::HighEfficiencyIPHController(Browser* browser)
+    : browser_(browser) {
+  auto* manager = performance_manager::user_tuning::
+      UserPerformanceTuningManager::GetInstance();
+  high_efficiency_observer_.Observe(manager);
+}
+
+HighEfficiencyIPHController::~HighEfficiencyIPHController() = default;
+
+void HighEfficiencyIPHController::OnMemoryThresholdReached() {
+  MaybeTriggerPromo();
+}
+
+void HighEfficiencyIPHController::OnTabCountThresholdReached() {
+  MaybeTriggerPromo();
+}
+
+void HighEfficiencyIPHController::OnJankThresholdReached() {
+  MaybeTriggerPromo();
+}
+
+void HighEfficiencyIPHController::MaybeTriggerPromo() {
+  BrowserWindow* browser_window = browser_->window();
+  PrefService* prefs = g_browser_process->local_state();
+  if (browser_window != nullptr &&
+      prefs
+          ->FindPreference(performance_manager::user_tuning::prefs::
+                               kHighEfficiencyModeEnabled)
+          ->IsDefaultValue()) {
+    browser_window->MaybeShowStartupFeaturePromo(
+        feature_engagement::kIPHHighEfficiencyModeFeature);
+  }
+}
diff --git a/chrome/browser/ui/performance_controls/high_efficiency_iph_controller.h b/chrome/browser/ui/performance_controls/high_efficiency_iph_controller.h
new file mode 100644
index 0000000..dfcbf4d
--- /dev/null
+++ b/chrome/browser/ui/performance_controls/high_efficiency_iph_controller.h
@@ -0,0 +1,39 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_HIGH_EFFICIENCY_IPH_CONTROLLER_H_
+#define CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_HIGH_EFFICIENCY_IPH_CONTROLLER_H_
+
+#include "base/memory/raw_ptr.h"
+#include "base/scoped_observation.h"
+#include "chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h"
+#include "chrome/browser/ui/browser.h"
+
+class HighEfficiencyIPHController : public performance_manager::user_tuning::
+                                        UserPerformanceTuningManager::Observer {
+ public:
+  explicit HighEfficiencyIPHController(Browser* browser);
+  ~HighEfficiencyIPHController() override;
+
+  HighEfficiencyIPHController(const HighEfficiencyIPHController&) = delete;
+  HighEfficiencyIPHController& operator=(const HighEfficiencyIPHController&) =
+      delete;
+
+  // UserPerformanceTuningManager::Observer:
+  void OnMemoryThresholdReached() override;
+  void OnTabCountThresholdReached() override;
+  void OnJankThresholdReached() override;
+
+ private:
+  void MaybeTriggerPromo();
+
+  base::ScopedObservation<
+      performance_manager::user_tuning::UserPerformanceTuningManager,
+      performance_manager::user_tuning::UserPerformanceTuningManager::Observer>
+      high_efficiency_observer_{this};
+
+  const raw_ptr<Browser> browser_;
+};
+
+#endif  // CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_HIGH_EFFICIENCY_IPH_CONTROLLER_H_
diff --git a/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller_desktop_impl.cc b/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller_desktop_impl.cc
index 7efea54..eb205f8 100644
--- a/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller_desktop_impl.cc
+++ b/chrome/browser/ui/sharing_hub/sharing_hub_bubble_controller_desktop_impl.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/color/chrome_color_id.h"
 #include "chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.h"
 #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble.h"
 #include "chrome/browser/ui/sharing_hub/sharing_hub_bubble_view.h"
@@ -33,6 +34,8 @@
 #include "content/public/browser/web_contents.h"
 #include "third_party/blink/public/mojom/opengraph/metadata.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/color/color_provider.h"
+#include "ui/native_theme/native_theme.h"
 
 namespace sharing_hub {
 
@@ -237,9 +240,25 @@
 }
 
 void SharingHubBubbleControllerDesktopImpl::FetchFaviconForPreview() {
-  gfx::Image favicon = favicon::TabFaviconFromWebContents(&GetWebContents());
-  if (!favicon.IsEmpty())
-    preview_image_changed_callbacks_.Notify(ui::ImageModel::FromImage(favicon));
+  content::WebContents* web_contents = &GetWebContents();
+  gfx::Image favicon = favicon::TabFaviconFromWebContents(web_contents);
+  if (favicon.IsEmpty())
+    return;
+
+  content::NavigationController& controller = web_contents->GetController();
+  content::NavigationEntry* entry = controller.GetLastCommittedEntry();
+  // Select chrome URLs show themified icons in dark mode.
+  if (favicon::ShouldThemifyFaviconForEntry(entry) &&
+      ui::NativeTheme::GetInstanceForNativeUi()->ShouldUseDarkColors()) {
+    const ui::ColorProvider& color_provider = web_contents->GetColorProvider();
+    favicon = gfx::Image(favicon::ThemeFavicon(
+        *favicon.ToImageSkia(),
+        color_provider.GetColor(kColorToolbarButtonIcon),
+        color_provider.GetColor(kColorTabBackgroundActiveFrameActive),
+        color_provider.GetColor(kColorTabBackgroundInactiveFrameActive)));
+  }
+
+  preview_image_changed_callbacks_.Notify(ui::ImageModel::FromImage(favicon));
 }
 
 void SharingHubBubbleControllerDesktopImpl::FetchHQImageForPreview() {
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 60b252e..1294ce4 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -68,6 +68,7 @@
 #include "chrome/browser/ui/find_bar/find_bar.h"
 #include "chrome/browser/ui/find_bar/find_bar_controller.h"
 #include "chrome/browser/ui/layout_constants.h"
+#include "chrome/browser/ui/performance_controls/high_efficiency_iph_controller.h"
 #include "chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.h"
 #include "chrome/browser/ui/recently_audible_helper.h"
 #include "chrome/browser/ui/sad_tab_helper.h"
@@ -182,6 +183,7 @@
 #include "components/lens/lens_features.h"
 #include "components/omnibox/browser/omnibox_popup_view.h"
 #include "components/omnibox/browser/omnibox_view.h"
+#include "components/performance_manager/public/features.h"
 #include "components/permissions/permission_request_manager.h"
 #include "components/prefs/pref_service.h"
 #include "components/reading_list/core/reading_list_pref_names.h"
@@ -966,6 +968,14 @@
                        weak_ptr_factory_.GetWeakPtr()));
   }
 #endif
+
+  // High Efficiency mode is default off but is available to turn on
+  if (!performance_manager::features::kHighEfficiencyModeDefaultState.Get() &&
+      base::FeatureList::IsEnabled(
+          performance_manager::features::kHighEfficiencyModeAvailable)) {
+    high_efficiency_iph_controller_ =
+        std::make_unique<HighEfficiencyIPHController>(browser_.get());
+  }
 }
 
 BrowserView::~BrowserView() {
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index 0dfde39..5460858 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -25,6 +25,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/exclusive_access/exclusive_access_context.h"
+#include "chrome/browser/ui/performance_controls/high_efficiency_iph_controller.h"
 #include "chrome/browser/ui/tabs/tab_renderer_data.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 #include "chrome/browser/ui/translate/partial_translate_bubble_model.h"
@@ -1203,6 +1204,8 @@
 
   OnLinkOpeningFromGestureCallbackList link_opened_from_gesture_callbacks_;
 
+  std::unique_ptr<HighEfficiencyIPHController> high_efficiency_iph_controller_;
+
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   // |loading_animation_tracker_| is used to measure animation smoothness for
   // tab loading animation.
diff --git a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
index 1f24ec6..3c660a4 100644
--- a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
+++ b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
@@ -48,10 +48,10 @@
 
   explicit BackToTabButton(PressedCallback callback)
       : OverlayWindowImageButton(std::move(callback)) {
-    SetImageModel(
-        views::Button::STATE_NORMAL,
-        ui::ImageModel::FromVectorIcon(
-            kBackToTabIcon, kColorPipWindowForeground, kBackToTabImageSize));
+    SetImageModel(views::Button::STATE_NORMAL,
+                  ui::ImageModel::FromVectorIcon(vector_icons::kBackToTabIcon,
+                                                 kColorPipWindowForeground,
+                                                 kBackToTabImageSize));
 
     const std::u16string back_to_tab_button_label = l10n_util::GetStringUTF16(
         IDS_PICTURE_IN_PICTURE_BACK_TO_TAB_CONTROL_TEXT);
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_controller.cc b/chrome/browser/ui/views/page_action/page_action_icon_controller.cc
index 63791877..b46b49b 100644
--- a/chrome/browser/ui/views/page_action/page_action_icon_controller.cc
+++ b/chrome/browser/ui/views/page_action/page_action_icon_controller.cc
@@ -366,6 +366,7 @@
     // first time they are displayed on the new page.
     icon_item.second->set_should_record_metrics_if_shown(true);
   }
+  max_actions_recorded_on_current_page_ = 0;
 }
 
 void PageActionIconController::PrimaryPageChanged(content::Page& page) {
@@ -379,6 +380,8 @@
     }
     RecordIndividualMetrics(icon_item.first, icon_item.second);
   }
+  base::UmaHistogramEnumeration("PageActionController.PagesWithActionsShown",
+                                PageActionPageEvent::kPageShown);
 }
 
 int PageActionIconController::VisibleEphemeralActionCount() const {
@@ -389,9 +392,28 @@
       });
 }
 
-void PageActionIconController::RecordOverallMetrics() const {
+void PageActionIconController::RecordOverallMetrics() {
+  int num_actions_shown = VisibleEphemeralActionCount();
   base::UmaHistogramExactLinear("PageActionController.NumberActionsShown",
-                                VisibleEphemeralActionCount(), 20);
+                                num_actions_shown, 20);
+  // Record kActionShown if this is the first time an ephemeral action has been
+  // shown on the current page.
+  if (num_actions_shown > 0 && max_actions_recorded_on_current_page_ < 1) {
+    base::UmaHistogramEnumeration("PageActionController.PagesWithActionsShown",
+                                  PageActionPageEvent::kActionShown);
+  }
+  // Record kMultipleActionsShown if this is the first time multiple ephemeral
+  // actions have been shown on the current page. It is possible for this to
+  // happen concurrently with the above if case, in the instance that a page is
+  // loaded with multiple ephemeral actions immediately showing. kActionShown
+  // and kMultipleActionsShown are not intended to be mutually exclusive, so in
+  // this case we should log both.
+  if (num_actions_shown > 1 && max_actions_recorded_on_current_page_ < 2) {
+    base::UmaHistogramEnumeration("PageActionController.PagesWithActionsShown",
+                                  PageActionPageEvent::kMultipleActionsShown);
+  }
+  max_actions_recorded_on_current_page_ =
+      std::max(num_actions_shown, max_actions_recorded_on_current_page_);
 }
 
 void PageActionIconController::RecordIndividualMetrics(
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_controller.h b/chrome/browser/ui/views/page_action/page_action_icon_controller.h
index 3f902a7..8e892d1 100644
--- a/chrome/browser/ui/views/page_action/page_action_icon_controller.h
+++ b/chrome/browser/ui/views/page_action/page_action_icon_controller.h
@@ -84,7 +84,7 @@
 
   // Logs UMA data about the set of currently visible page actions overall, eg.
   // the total number of page actions shown.
-  void RecordOverallMetrics() const;
+  void RecordOverallMetrics();
 
   // Logs UMA data about an individual visible page action, eg. the type of
   // action shown.
@@ -105,6 +105,11 @@
   base::ScopedObservation<zoom::ZoomEventManager,
                           zoom::ZoomEventManagerObserver>
       zoom_observation_{this};
+
+  // Max number of actions shown concurrently after the latest page change, as
+  // tracked in metrics logging. Used to ensure we don't double-count certain
+  // metrics.
+  int max_actions_recorded_on_current_page_ = 0;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_PAGE_ACTION_PAGE_ACTION_ICON_CONTROLLER_H_
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_view.h b/chrome/browser/ui/views/page_action/page_action_icon_view.h
index 3f48f65..efcb0d3 100644
--- a/chrome/browser/ui/views/page_action/page_action_icon_view.h
+++ b/chrome/browser/ui/views/page_action/page_action_icon_view.h
@@ -42,6 +42,14 @@
   kMaxValue = kClicked,
 };
 
+// Used for histograms, do not reorder.
+enum class PageActionPageEvent {
+  kPageShown = 0,
+  kActionShown,
+  kMultipleActionsShown,
+  kMaxValue = kMultipleActionsShown,
+};
+
 // Represents an inbuilt (as opposed to an extension) page action icon that
 // shows a bubble when clicked.
 class PageActionIconView : public IconLabelBubbleView {
diff --git a/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc b/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc
index fa6ec3fb..029a6bd 100644
--- a/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc
+++ b/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/ui/views/performance_controls/high_efficiency_chip_view.h"
+#include "chrome/browser/performance_manager/test_support/test_user_performance_tuning_manager_environment.h"
 #include "chrome/browser/ui/performance_controls/tab_discard_tab_helper.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/frame/test_with_browser_view.h"
@@ -10,6 +11,7 @@
 #include "chrome/browser/ui/views/page_action/page_action_icon_controller.h"
 #include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
 #include "components/performance_manager/public/features.h"
+#include "components/performance_manager/public/user_tuning/prefs.h"
 #include "components/prefs/testing_pref_service.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/mock_navigation_handle.h"
@@ -33,7 +35,9 @@
   void SetUp() override {
     feature_list_.InitAndEnableFeature(
         performance_manager::features::kHighEfficiencyModeAvailable);
-
+    performance_manager::user_tuning::prefs::RegisterLocalStatePrefs(
+        local_state_.registry());
+    environment_.SetUp(&local_state_);
     TestWithBrowserView::SetUp();
 
     AddTab(browser(), GURL("http://foo"));
@@ -42,7 +46,10 @@
     TabDiscardTabHelper::CreateForWebContents(contents);
   }
 
-  void TearDown() override { TestWithBrowserView::TearDown(); }
+  void TearDown() override {
+    TestWithBrowserView::TearDown();
+    environment_.TearDown();
+  }
 
   void SetTabDiscardState(bool is_discarded) {
     TabDiscardTabHelper* tab_helper = TabDiscardTabHelper::FromWebContents(
@@ -68,6 +75,8 @@
  private:
   base::test::ScopedFeatureList feature_list_;
   TestingPrefServiceSimple local_state_;
+  performance_manager::user_tuning::TestUserPerformanceTuningManagerEnvironment
+      environment_;
 };
 
 // When the previous page has a tab discard state of true, when the icon is
diff --git a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
index 840a020..2bb4e36 100644
--- a/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
+++ b/chrome/browser/ui/views/qrcode_generator/qrcode_generator_bubble.cc
@@ -136,7 +136,7 @@
   mojom::GenerateQRCodeRequestPtr request = mojom::GenerateQRCodeRequest::New();
   request->data = base::UTF16ToASCII(textfield_url_->GetText());
   request->should_render = true;
-  request->render_dino = true;
+  request->center_image = mojom::CenterImage::CHROME_DINO;
   request->render_module_style = mojom::ModuleStyle::CIRCLES;
   request->render_locator_style = mojom::LocatorStyle::ROUNDED;
 
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h
index f4be2dc1..438cff7 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h
@@ -21,13 +21,11 @@
 
 const char kReadAnythingDefaultFontName[] = "Standard font";
 
-// Font size is stored in prefs as a (double) scaling factor, which is a number
-// not presented to the user. The final font size sent to the UI is the default
-// font size * font scale (in pixels).
-const float kReadAnythingDefaultFontSize = 18.0f;
-const double kReadAnythingDefaultFontScale = 1.0;
-const double kReadAnythingMinimumFontScale = 0.2;
-const double kReadAnythingMaximumFontScale = 5.0;
+// Font size in em
+const double kReadAnythingDefaultFontScale = 1;
+const double kReadAnythingMinimumFontScale = 0.5;
+const double kReadAnythingMaximumFontScale = 4.5;
+const double kReadAnythingFontScaleIncrement = 0.25;
 
 // Custom feature colors.
 constexpr SkColor kReadAnythingDarkBackground = SkColorSetRGB(0x33, 0x36, 0x39);
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc
index f6a88c6..b371f1c 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller_unittest.cc
@@ -94,7 +94,7 @@
 
   MockOnFontSizeChanged(true);
 
-  EXPECT_NEAR(GetPrefFontScale(), 1.2, 0.01);
+  EXPECT_NEAR(GetPrefFontScale(), 1.25, 0.01);
 }
 
 TEST_F(ReadAnythingControllerTest, OnFontSizeChangedDecreasePref) {
@@ -102,31 +102,33 @@
 
   MockOnFontSizeChanged(false);
 
-  EXPECT_NEAR(GetPrefFontScale(), 0.8, 0.01);
+  EXPECT_NEAR(GetPrefFontScale(), 0.75, 0.01);
 }
 
 TEST_F(ReadAnythingControllerTest, OnFontSizeChangedHonorsMax) {
   EXPECT_NEAR(GetPrefFontScale(), 1.0, 0.01);
 
   std::string font_name;
-  MockModelInit(font_name, 4.9, read_anything::mojom::Colors::kDefaultValue,
+
+  MockModelInit(font_name, 4.5, read_anything::mojom::Colors::kDefaultValue,
                 read_anything::mojom::LetterSpacing::kDefaultValue);
 
   MockOnFontSizeChanged(true);
 
-  EXPECT_NEAR(GetPrefFontScale(), 5.0, 0.01);
+  EXPECT_NEAR(GetPrefFontScale(), 4.5, 0.01);
 }
 
 TEST_F(ReadAnythingControllerTest, OnFontSizeChangedHonorsMin) {
   EXPECT_NEAR(GetPrefFontScale(), 1.0, 0.01);
 
   std::string font_name;
-  MockModelInit(font_name, 0.3, read_anything::mojom::Colors::kDefaultValue,
+
+  MockModelInit(font_name, 0.5, read_anything::mojom::Colors::kDefaultValue,
                 read_anything::mojom::LetterSpacing::kDefaultValue);
 
   MockOnFontSizeChanged(false);
 
-  EXPECT_NEAR(GetPrefFontScale(), 0.2, 0.01);
+  EXPECT_NEAR(GetPrefFontScale(), 0.5, 0.01);
 }
 
 TEST_F(ReadAnythingControllerTest, OnColorsChangedUpdatesPref) {
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
index 20d2e4e1..940f746 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
@@ -115,7 +115,7 @@
 
 // TODO(1266555): Update with text scaling approach based on UI/UX feedback.
 void ReadAnythingModel::DecreaseTextSize() {
-  font_scale_ -= 0.2f;
+  font_scale_ -= kReadAnythingFontScaleIncrement;
   if (font_scale_ < kReadAnythingMinimumFontScale)
     font_scale_ = kReadAnythingMinimumFontScale;
 
@@ -123,7 +123,7 @@
 }
 
 void ReadAnythingModel::IncreaseTextSize() {
-  font_scale_ += 0.2;
+  font_scale_ += kReadAnythingFontScaleIncrement;
   if (font_scale_ > kReadAnythingMaximumFontScale)
     font_scale_ = kReadAnythingMaximumFontScale;
 
@@ -138,9 +138,9 @@
 
 void ReadAnythingModel::NotifyThemeChanged() {
   for (Observer& obs : observers_) {
-    obs.OnReadAnythingThemeChanged(ReadAnythingTheme::New(
-        font_name_, kReadAnythingDefaultFontSize * font_scale_,
-        foreground_color_, background_color_, letter_spacing_));
+    obs.OnReadAnythingThemeChanged(
+        ReadAnythingTheme::New(font_name_, font_scale_, foreground_color_,
+                               background_color_, letter_spacing_));
   }
 }
 
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc
index 1beffe9..0223456a 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model_unittest.cc
@@ -113,7 +113,7 @@
 
   model_->DecreaseTextSize();
 
-  EXPECT_NEAR(model_->GetFontScale(), 0.8, 0.01);
+  EXPECT_NEAR(model_->GetFontScale(), 0.75, 0.01);
 }
 
 TEST_F(ReadAnythingModelTest, NotificationsOnIncreasedFontSize) {
@@ -123,7 +123,7 @@
 
   model_->IncreaseTextSize();
 
-  EXPECT_NEAR(model_->GetFontScale(), 1.2, 0.01);
+  EXPECT_NEAR(model_->GetFontScale(), 1.25, 0.01);
 }
 
 TEST_F(ReadAnythingModelTest, NotificationsOnSetSelectedColorsIndex) {
@@ -144,18 +144,18 @@
 
 TEST_F(ReadAnythingModelTest, MinimumFontScaleIsEnforced) {
   std::string font_name;
-  model_->Init(font_name, 0.3, read_anything::mojom::Colors::kDefaultValue,
+  model_->Init(font_name, 0.5, read_anything::mojom::Colors::kDefaultValue,
                read_anything::mojom::LetterSpacing::kDefaultValue);
   model_->DecreaseTextSize();
-  EXPECT_NEAR(model_->GetFontScale(), 0.2, 0.01);
+  EXPECT_NEAR(model_->GetFontScale(), 0.5, 0.01);
 }
 
 TEST_F(ReadAnythingModelTest, MaximumFontScaleIsEnforced) {
   std::string font_name;
-  model_->Init(font_name, 4.9, read_anything::mojom::Colors::kDefaultValue,
+  model_->Init(font_name, 4.5, read_anything::mojom::Colors::kDefaultValue,
                read_anything::mojom::LetterSpacing::kDefaultValue);
   model_->IncreaseTextSize();
-  EXPECT_NEAR(model_->GetFontScale(), 5.0, 0.01);
+  EXPECT_NEAR(model_->GetFontScale(), 4.5, 0.01);
 }
 
 TEST_F(ReadAnythingModelTest, FontModelIsValidFontName) {
diff --git a/chrome/browser/ui/views/toolbar/browser_app_menu_browsertest.cc b/chrome/browser/ui/views/toolbar/browser_app_menu_browsertest.cc
new file mode 100644
index 0000000..b6a7b7d
--- /dev/null
+++ b/chrome/browser/ui/views/toolbar/browser_app_menu_browsertest.cc
@@ -0,0 +1,123 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
+#include "chrome/browser/ui/browser_tabstrip.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
+#include "chrome/browser/ui/views/user_education/browser_feature_promo_controller.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/performance_manager/public/features.h"
+#include "components/performance_manager/public/user_tuning/prefs.h"
+#include "components/user_education/test/feature_promo_test_util.h"
+#include "components/user_education/views/help_bubble_factory_views.h"
+#include "components/user_education/views/help_bubble_view.h"
+#include "content/public/test/browser_test.h"
+#include "ui/views/bubble/bubble_dialog_model_host.h"
+#include "ui/views/interaction/element_tracker_views.h"
+#include "ui/views/interaction/interaction_test_util_views.h"
+#include "ui/views/view_utils.h"
+#include "url/gurl.h"
+
+class HighEfficiencyHelpPromoTest : public InProcessBrowserTest {
+ public:
+  HighEfficiencyHelpPromoTest() = default;
+  ~HighEfficiencyHelpPromoTest() override = default;
+  // using performance_manager::features;
+
+  void SetUp() override {
+    feature_list_.InitWithFeatures(
+        {feature_engagement::kIPHHighEfficiencyModeFeature,
+         performance_manager::features::kHighEfficiencyModeAvailable},
+        {});
+
+    InProcessBrowserTest::SetUp();
+  }
+
+  void TearDown() override { InProcessBrowserTest::TearDown(); }
+
+  BrowserFeaturePromoController* GetFeaturePromoController() {
+    auto* promo_controller = static_cast<BrowserFeaturePromoController*>(
+        browser()->window()->GetFeaturePromoController());
+    return promo_controller;
+  }
+
+  void PressButton(views::Button* button) {
+    views::test::InteractionTestUtilSimulatorViews::PressButton(
+        button, ui::test::InteractionTestUtil::InputType::kMouse);
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+// Check that the high efficiency mode in-product help promo is shown when
+// a tab threshold (10) is reached and dismisses correctly when the app menu
+// button is pushed
+IN_PROC_BROWSER_TEST_F(HighEfficiencyHelpPromoTest, ShowPromoOnTabThreshold) {
+  auto lock = BrowserFeaturePromoController::BlockActiveWindowCheckForTesting();
+  int tab_count_threshold =
+      performance_manager::features::kHighEfficiencyModePromoTabCountThreshold
+          .Get();
+  for (int i = 0; i < tab_count_threshold; i++)
+    chrome::AddTabAt(browser(), GURL(), i, true);
+
+  base::RunLoop().RunUntilIdle();
+
+  auto* const promo_controller = GetFeaturePromoController();
+  bool promo_active = user_education::test::WaitForStartupPromo(
+      promo_controller, feature_engagement::kIPHHighEfficiencyModeFeature);
+  EXPECT_TRUE(promo_active);
+
+  auto* app_menu_button_view =
+      views::ElementTrackerViews::GetInstance()->GetFirstMatchingView(
+          kAppMenuButtonElementId, browser()->window()->GetElementContext());
+  PressButton(views::AsViewClass<views::Button>(app_menu_button_view));
+
+  base::RunLoop().RunUntilIdle();
+
+  promo_active = promo_controller->IsPromoActive(
+      feature_engagement::kIPHHighEfficiencyModeFeature);
+  EXPECT_FALSE(promo_active);
+}
+
+// Confirm that High Efficiency mode is enabled when the custom action
+// button for high efficiency mode is clicked
+IN_PROC_BROWSER_TEST_F(HighEfficiencyHelpPromoTest, PromoCustomActionClicked) {
+  PrefService* prefs = g_browser_process->local_state();
+  EXPECT_TRUE(prefs
+                  ->FindPreference(performance_manager::user_tuning::prefs::
+                                       kHighEfficiencyModeEnabled)
+                  ->IsDefaultValue());
+  EXPECT_FALSE(prefs->GetBoolean(
+      performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled));
+
+  auto lock = BrowserFeaturePromoController::BlockActiveWindowCheckForTesting();
+  int tab_count_threshold =
+      performance_manager::features::kHighEfficiencyModePromoTabCountThreshold
+          .Get();
+  for (int i = 0; i < tab_count_threshold; i++)
+    chrome::AddTabAt(browser(), GURL(), i, true);
+
+  base::RunLoop().RunUntilIdle();
+
+  auto* const promo_controller = GetFeaturePromoController();
+  bool promo_active = user_education::test::WaitForStartupPromo(
+      promo_controller, feature_engagement::kIPHHighEfficiencyModeFeature);
+  EXPECT_TRUE(promo_active);
+
+  auto* promo_bubble = promo_controller->promo_bubble_for_testing()
+                           ->AsA<user_education::HelpBubbleViews>()
+                           ->bubble_view();
+  auto* custom_action_button = promo_bubble->GetDefaultButtonForTesting();
+  PressButton(custom_action_button);
+
+  EXPECT_FALSE(prefs
+                   ->FindPreference(performance_manager::user_tuning::prefs::
+                                        kHighEfficiencyModeEnabled)
+                   ->IsDefaultValue());
+  EXPECT_TRUE(prefs->GetBoolean(
+      performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled));
+}
diff --git a/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc b/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
index d33e1129..bf05ab7 100644
--- a/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
+++ b/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
@@ -95,6 +95,9 @@
       std::make_unique<AppMenuModel>(toolbar_view_, browser,
                                      toolbar_view_->app_menu_icon_controller()),
       browser, run_types, reopen_tab_promo_handle_.is_valid());
+
+  browser->window()->CloseFeaturePromo(
+      feature_engagement::kIPHHighEfficiencyModeFeature);
 }
 
 void BrowserAppMenuButton::OnThemeChanged() {
diff --git a/chrome/browser/ui/views/user_education/browser_user_education_service.cc b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
index 03e763d..87842e0 100644
--- a/chrome/browser/ui/views/user_education/browser_user_education_service.cc
+++ b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
@@ -10,6 +10,7 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/themes/theme_properties.h"
 #include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -22,6 +23,7 @@
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/google_chrome_strings.h"
 #include "components/feature_engagement/public/feature_constants.h"
+#include "components/performance_manager/public/user_tuning/prefs.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/user_education/common/feature_promo_handle.h"
 #include "components/user_education/common/feature_promo_registry.h"
@@ -312,6 +314,23 @@
               }))
           .SetBubbleTitleText(IDS_HIGH_EFFICIENCY_INFO_MODE_PROMO_TITLE)
           .SetBubbleArrow(HelpBubbleArrow::kTopCenter)));
+
+  // kIPHHighEfficiencyModeFeature:
+  registry.RegisterFeature(std::move(
+      FeaturePromoSpecification::CreateForCustomAction(
+          feature_engagement::kIPHHighEfficiencyModeFeature,
+          kAppMenuButtonElementId, IDS_HIGH_EFFICIENCY_MODE_PROMO_TEXT,
+          IDS_HIGH_EFFICIENCY_MODE_PROMO_ACTION_TEXT,
+          base::BindRepeating(
+              [](ui::ElementContext context,
+                 user_education::FeaturePromoHandle promo_handle) {
+                PrefService* prefs = g_browser_process->local_state();
+                prefs->SetBoolean(performance_manager::user_tuning::prefs::
+                                      kHighEfficiencyModeEnabled,
+                                  true);
+              }))
+          .SetCustomActionIsDefault(true)
+          .SetBubbleTitleText(IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE)));
 }
 
 void MaybeRegisterChromeTutorials(
diff --git a/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc b/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc
index e0a4ed8..7a09175 100644
--- a/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc
+++ b/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc
@@ -52,13 +52,20 @@
         qrcode_generator::mojom::GenerateQRCodeRequest::New();
     request->data = qr_string;
     request->should_render = true;
-    request->render_dino =
-        !base::FeatureList::IsEnabled(device::kWebAuthPasskeysUI);
+    request->center_image =
+        base::FeatureList::IsEnabled(
+            device::kWebAuthnNewDiscoverableCredentialsUi) ||
+                base::FeatureList::IsEnabled(device::kWebAuthPasskeysUI)
+            ? qrcode_generator::mojom::CenterImage::PASSKEY_ICON
+            : qrcode_generator::mojom::CenterImage::CHROME_DINO;
 
     request->render_module_style =
         qrcode_generator::mojom::ModuleStyle::CIRCLES;
     request->render_locator_style =
-        qrcode_generator::mojom::LocatorStyle::DEFAULT_SQUARE;
+        base::FeatureList::IsEnabled(
+            device::kWebAuthnNewDiscoverableCredentialsUi)
+            ? qrcode_generator::mojom::LocatorStyle::ROUNDED
+            : qrcode_generator::mojom::LocatorStyle::DEFAULT_SQUARE;
 
     // Deleting the view will close the channel so base::Unretained is safe
     // here.
@@ -81,9 +88,12 @@
         views::LayoutProvider::Get()->GetCornerRadiusMetric(
             views::Emphasis::kHigh);
     const auto* color_provider = GetColorProvider();
-    qr_code_image_->SetBorder(views::CreateRoundedRectBorder(
-        /*thickness=*/2, border_radius,
-        color_provider->GetColor(kColorQrCodeBorder)));
+    if (!base::FeatureList::IsEnabled(
+            device::kWebAuthnNewDiscoverableCredentialsUi)) {
+      qr_code_image_->SetBorder(views::CreateRoundedRectBorder(
+          /*thickness=*/2, border_radius,
+          color_provider->GetColor(kColorQrCodeBorder)));
+    }
     qr_code_image_->SetBackground(views::CreateRoundedRectBackground(
         color_provider->GetColor(kColorQrCodeBackground), border_radius, 2));
   }
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc b/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc
index c6ab276..c2b17ed 100644
--- a/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc
+++ b/chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/feature_list.h"
@@ -21,21 +22,19 @@
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/color/color_provider.h"
 #include "ui/gfx/color_utils.h"
+#include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/native_theme/native_theme.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/button/image_button_factory.h"
+#include "ui/views/controls/image_view.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/progress_bar.h"
 #include "ui/views/layout/box_layout.h"
-#include "ui/views/layout/fill_layout.h"
 
 namespace {
 
-// Fixed height of the illustration shown in the top half of the sheet.
-constexpr int kIllustrationHeight = 148;
-
 // Height of the progress bar style activity indicator shown at the top of some
 // sheets.
 constexpr int kActivityIndicatorHeight = 4;
@@ -97,20 +96,32 @@
     }
   }
 
-  const int illustration_width = ChromeLayoutProvider::Get()->GetDistanceMetric(
+  const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric(
       views::DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH);
-  const gfx::Size illustration_size(illustration_width, kIllustrationHeight);
+  constexpr int kImageHeight = 112, kImageMarginTop = 22,
+                kImageMarginBottom = 2;
+  const int header_height =
+      base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)
+          ? (kImageHeight + kImageMarginTop + kImageMarginBottom)
+          : 148;
+  const gfx::Size image_view_size(dialog_width, header_height);
 
   // The container view has no layout, so its preferred size is hardcoded to
   // match the size of the image, and all overlays are absolutely positioned.
-  auto image_with_overlays = std::make_unique<views::View>();
-  image_with_overlays->SetPreferredSize(illustration_size);
+  auto header_view = std::make_unique<views::View>();
+  header_view->SetPreferredSize(image_view_size);
 
   auto image_view = std::make_unique<NonAccessibleImageView>();
   step_illustration_ = image_view.get();
-  image_view->SetSize(illustration_size);
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    image_view->SetBorder(views::CreateEmptyBorder(
+        gfx::Insets::TLBR(kImageMarginTop, 0, kImageMarginTop, 0)));
+  }
+  image_view->SetSize(image_view_size);
   image_view->SetVerticalAlignment(views::ImageView::Alignment::kLeading);
-  image_with_overlays->AddChildView(image_view.release());
+  header_view->AddChildView(image_view.release());
 
   if (model()->IsActivityIndicatorVisible()) {
     auto activity_indicator = std::make_unique<views::ProgressBar>(
@@ -118,9 +129,9 @@
     activity_indicator->SetValue(-1 /* inifinite animation */);
     activity_indicator->SetBackgroundColor(SK_ColorTRANSPARENT);
     activity_indicator->SetPreferredSize(
-        gfx::Size(illustration_width, kActivityIndicatorHeight));
+        gfx::Size(dialog_width, kActivityIndicatorHeight));
     activity_indicator->SizeToPreferredSize();
-    image_with_overlays->AddChildView(activity_indicator.release());
+    header_view->AddChildView(activity_indicator.release());
   }
 
   if (!base::FeatureList::IsEnabled(
@@ -144,8 +155,7 @@
     back_arrow->SetX(dialog_insets.left());
     back_arrow->SetY(dialog_insets.top());
     back_arrow_ = back_arrow.get();
-    back_arrow_button_ =
-        image_with_overlays->AddChildView(std::move(back_arrow));
+    back_arrow_button_ = header_view->AddChildView(std::move(back_arrow));
   }
   if (!base::FeatureList::IsEnabled(
           device::kWebAuthnNewDiscoverableCredentialsUi) &&
@@ -155,11 +165,11 @@
     close->SetAccessibleName(
         l10n_util::GetStringUTF16(IDS_NEW_TAB_VOICE_CLOSE_TOOLTIP));
     close->SizeToPreferredSize();
-    close->SetX(illustration_size.width() - close->GetPreferredSize().width() -
+    close->SetX(dialog_width - close->GetPreferredSize().width() -
                 kActivityIndicatorHeight);
     close->SetY(kActivityIndicatorHeight);
     close_button_ = close.get();
-    image_with_overlays->AddChildView(std::move(close));
+    header_view->AddChildView(std::move(close));
   }
 
   if (GetWidget()) {
@@ -167,7 +177,7 @@
     UpdateIconColors();
   }
 
-  return image_with_overlays;
+  return header_view;
 }
 
 std::unique_ptr<views::View>
diff --git a/chrome/browser/ui/views/webauthn/authenticator_select_account_sheet_view.cc b/chrome/browser/ui/views/webauthn/authenticator_select_account_sheet_view.cc
index 02a62d1..c3c781c8 100644
--- a/chrome/browser/ui/views/webauthn/authenticator_select_account_sheet_view.cc
+++ b/chrome/browser/ui/views/webauthn/authenticator_select_account_sheet_view.cc
@@ -7,7 +7,7 @@
 
 #include "chrome/browser/ui/views/webauthn/authenticator_select_account_sheet_view.h"
 #include "chrome/browser/ui/views/webauthn/hover_list_view.h"
-#include "chrome/browser/ui/views/webauthn/passkey_pill_view.h"
+#include "chrome/browser/ui/views/webauthn/passkey_detail_view.h"
 #include "device/fido/discoverable_credential_metadata.h"
 
 AuthenticatorSelectAccountSheetView::AuthenticatorSelectAccountSheetView(
@@ -28,7 +28,7 @@
                             AutoFocus::kYes);
     case AuthenticatorSelectAccountSheetModel::kSingleAccount:
       return std::make_pair(
-          std::make_unique<PasskeyPillView>(model()->SingleCredential().user),
+          std::make_unique<PasskeyDetailView>(model()->SingleCredential().user),
           AutoFocus::kNo);
   }
 }
diff --git a/chrome/browser/ui/views/webauthn/passkey_pill_view.cc b/chrome/browser/ui/views/webauthn/passkey_detail_view.cc
similarity index 85%
rename from chrome/browser/ui/views/webauthn/passkey_pill_view.cc
rename to chrome/browser/ui/views/webauthn/passkey_detail_view.cc
index 816c5d7..0d8e8a0 100644
--- a/chrome/browser/ui/views/webauthn/passkey_pill_view.cc
+++ b/chrome/browser/ui/views/webauthn/passkey_detail_view.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/views/webauthn/passkey_pill_view.h"
+#include "chrome/browser/ui/views/webauthn/passkey_detail_view.h"
 
 #include "chrome/grit/generated_resources.h"
 #include "components/vector_icons/vector_icons.h"
@@ -27,16 +27,15 @@
 }
 }  // namespace
 
-PasskeyPillView::PasskeyPillView(
+PasskeyDetailView::PasskeyDetailView(
     const device::PublicKeyCredentialUserEntity& user) {
-  constexpr size_t kVerticalMargin = 14, kHorizontalMargin = 24,
-                   kPillHeight = 63;
+  constexpr size_t kVerticalMargin = 14, kHorizontalMargin = 24, kHeight = 63;
 
   auto* layout = SetLayoutManager(std::make_unique<views::FlexLayout>());
   layout->SetOrientation(views::LayoutOrientation::kHorizontal);
   layout->SetMainAxisAlignment(views::LayoutAlignment::kStart);
   layout->SetCrossAxisAlignment(views::LayoutAlignment::kCenter);
-  layout->SetMinimumCrossAxisSize(kPillHeight);
+  layout->SetMinimumCrossAxisSize(kHeight);
 
   // Force 16px margin between icon and label.
   layout->SetDefault(views::kMarginsKey, gfx::Insets::VH(0, 16));
@@ -57,10 +56,7 @@
       views::kFlexBehaviorKey,
       views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero));
   label->SetElideBehavior(gfx::ELIDE_EMAIL);
-
-  SetBorder(views::CreateThemedRoundedRectBorder(
-      /*thickness=*/1, /*corner_radius=*/16, ui::kColorSeparator));
 }
 
-BEGIN_METADATA(PasskeyPillView, views::View)
+BEGIN_METADATA(PasskeyDetailView, views::View)
 END_METADATA
diff --git a/chrome/browser/ui/views/webauthn/passkey_detail_view.h b/chrome/browser/ui/views/webauthn/passkey_detail_view.h
new file mode 100644
index 0000000..d8f2c65
--- /dev/null
+++ b/chrome/browser/ui/views/webauthn/passkey_detail_view.h
@@ -0,0 +1,20 @@
+// Copyright 2022 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_WEBAUTHN_PASSKEY_DETAIL_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_WEBAUTHN_PASSKEY_DETAIL_VIEW_H_
+
+#include "device/fido/discoverable_credential_metadata.h"
+#include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/views/view.h"
+
+// A view displaying user information for a passkey.
+class PasskeyDetailView : public views::View {
+ public:
+  METADATA_HEADER(PasskeyDetailView);
+
+  explicit PasskeyDetailView(const device::PublicKeyCredentialUserEntity& user);
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_WEBAUTHN_PASSKEY_DETAIL_VIEW_H_
diff --git a/chrome/browser/ui/views/webauthn/passkey_pill_view.h b/chrome/browser/ui/views/webauthn/passkey_pill_view.h
deleted file mode 100644
index bcf97d3a..0000000
--- a/chrome/browser/ui/views/webauthn/passkey_pill_view.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2022 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_WEBAUTHN_PASSKEY_PILL_VIEW_H_
-#define CHROME_BROWSER_UI_VIEWS_WEBAUTHN_PASSKEY_PILL_VIEW_H_
-
-#include "device/fido/discoverable_credential_metadata.h"
-#include "ui/base/metadata/metadata_impl_macros.h"
-#include "ui/views/view.h"
-
-// A rounded rectangle visualizing user information for a passkey.
-class PasskeyPillView : public views::View {
- public:
-  METADATA_HEADER(PasskeyPillView);
-
-  explicit PasskeyPillView(const device::PublicKeyCredentialUserEntity& user);
-};
-
-#endif  // CHROME_BROWSER_UI_VIEWS_WEBAUTHN_PASSKEY_PILL_VIEW_H_
diff --git a/chrome/browser/ui/views/webauthn/sheet_view_factory.cc b/chrome/browser/ui/views/webauthn/sheet_view_factory.cc
index 1ee543f..678e14f 100644
--- a/chrome/browser/ui/views/webauthn/sheet_view_factory.cc
+++ b/chrome/browser/ui/views/webauthn/sheet_view_factory.cc
@@ -17,7 +17,7 @@
 #include "chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.h"
 #include "chrome/browser/ui/views/webauthn/authenticator_select_account_sheet_view.h"
 #include "chrome/browser/ui/views/webauthn/hover_list_view.h"
-#include "chrome/browser/ui/views/webauthn/passkey_pill_view.h"
+#include "chrome/browser/ui/views/webauthn/passkey_detail_view.h"
 #include "chrome/browser/ui/webauthn/sheet_models.h"
 #include "chrome/browser/ui/webauthn/transport_hover_list_model.h"
 #include "chrome/browser/webauthn/authenticator_request_dialog_model.h"
@@ -89,7 +89,7 @@
             AuthenticatorRequestSheetView::AutoFocus>
   BuildStepSpecificContent() override {
     return std::make_pair(
-        std::make_unique<PasskeyPillView>(
+        std::make_unique<PasskeyDetailView>(
             static_cast<AuthenticatorCreatePasskeySheetModel*>(model())
                 ->dialog_model()
                 ->user_entity()),
diff --git a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
index 4a7e716..412398d 100644
--- a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
+++ b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
@@ -140,6 +140,9 @@
           /*contact_phone_callback=*/base::DoNothing(), "fido://qrcode");
       model_->SetCurrentStepForTesting(
           AuthenticatorRequestDialogModel::Step::kCableV2QRCode);
+    } else if (name == "phone_aoa") {
+      model_->SetCurrentStepForTesting(
+          AuthenticatorRequestDialogModel::Step::kAndroidAccessory);
     } else if (name == "set_pin") {
       model_->CollectPIN(device::pin::PINEntryReason::kSet,
                          device::pin::PINEntryError::kNoError, 6, 0,
@@ -315,14 +318,14 @@
           AuthenticatorRequestDialogModel::Step::kCreatePasskey);
     }
 #if BUILDFLAG(IS_MAC)
-    else if (name == "ble_permission_mac") {
+    else if (name == "ble_permission_mac") {  // NOLINT
       model_->SetCurrentStepForTesting(
           AuthenticatorRequestDialogModel::Step::kBlePermissionMac);
     }
 #endif
 
 #define EXP_SHEET(x)                                                    \
-  else if (name == "server_link_sheet_" #x) {                           \
+  else if (name == "server_link_sheet_" #x) { /* NOLINT */              \
     model_->set_cable_transport_info(                                   \
         /*extension_is_v2=*/true, /*paired_phones=*/{},                 \
         /*contact_phone_callback=*/base::DoNothing(), "fido://qrcode"); \
@@ -428,6 +431,10 @@
   ShowAndVerifyUi();
 }
 
+IN_PROC_BROWSER_TEST_P(AuthenticatorDialogTest, InvokeUi_phone_aoa) {
+  ShowAndVerifyUi();
+}
+
 IN_PROC_BROWSER_TEST_P(AuthenticatorDialogTest, InvokeUi_set_pin) {
   ShowAndVerifyUi();
 }
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc
index 60ee098..77b247e 100644
--- a/chrome/browser/ui/webauthn/sheet_models.cc
+++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -157,6 +157,11 @@
 const gfx::VectorIcon&
 AuthenticatorMechanismSelectorSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyHeaderDarkIcon
+                                                   : kPasskeyHeaderIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnWelcomeDarkIcon
                                                  : kWebauthnWelcomeIcon;
 }
@@ -235,6 +240,11 @@
 const gfx::VectorIcon&
 AuthenticatorInsertAndActivateUsbSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyUsbDarkIcon
+                                                   : kPasskeyUsbIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnUsbDarkIcon
                                                  : kWebauthnUsbIcon;
 }
@@ -272,6 +282,11 @@
 
 const gfx::VectorIcon& AuthenticatorTimeoutErrorModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyErrorDarkIcon
+                                                   : kPasskeyErrorIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnErrorDarkIcon
                                                  : kWebauthnErrorIcon;
 }
@@ -298,6 +313,11 @@
 const gfx::VectorIcon&
 AuthenticatorNoAvailableTransportsErrorModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyErrorDarkIcon
+                                                   : kPasskeyErrorIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnErrorDarkIcon
                                                  : kWebauthnErrorIcon;
 }
@@ -340,6 +360,11 @@
 const gfx::VectorIcon&
 AuthenticatorNotRegisteredErrorModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyErrorDarkIcon
+                                                   : kPasskeyErrorIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnErrorDarkIcon
                                                  : kWebauthnErrorIcon;
 }
@@ -428,6 +453,11 @@
 const gfx::VectorIcon&
 AuthenticatorInternalUnrecognizedErrorSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyErrorDarkIcon
+                                                   : kPasskeyErrorIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnErrorDarkIcon
                                                  : kWebauthnErrorIcon;
 }
@@ -459,6 +489,12 @@
 const gfx::VectorIcon&
 AuthenticatorBlePowerOnManualSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark
+               ? kPasskeyErrorBluetoothDarkIcon
+               : kPasskeyErrorBluetoothIcon;
+  }
   return color_scheme == ImageColorScheme::kDark
              ? kWebauthnErrorBluetoothDarkIcon
              : kWebauthnErrorBluetoothIcon;
@@ -513,6 +549,12 @@
 const gfx::VectorIcon&
 AuthenticatorBlePowerOnAutomaticSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark
+               ? kPasskeyErrorBluetoothDarkIcon
+               : kPasskeyErrorBluetoothIcon;
+  }
   return color_scheme == ImageColorScheme::kDark
              ? kWebauthnErrorBluetoothDarkIcon
              : kWebauthnErrorBluetoothIcon;
@@ -566,6 +608,12 @@
 const gfx::VectorIcon&
 AuthenticatorBlePermissionMacSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark
+               ? kPasskeyErrorBluetoothDarkIcon
+               : kPasskeyErrorBluetoothIcon;
+  }
   return color_scheme == ImageColorScheme::kDark
              ? kWebauthnErrorBluetoothDarkIcon
              : kWebauthnErrorBluetoothIcon;
@@ -620,6 +668,13 @@
 const gfx::VectorIcon&
 AuthenticatorOffTheRecordInterstitialSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    // TODO(1358719): Add more specific illustration once available. The "error"
+    // graphic is a large question mark, so it looks visually very similar.
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyErrorDarkIcon
+                                                   : kPasskeyErrorIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnPermissionDarkIcon
                                                  : kWebauthnPermissionIcon;
 }
@@ -730,6 +785,11 @@
 
 const gfx::VectorIcon& AuthenticatorPaaskSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyPhoneDarkIcon
+                                                   : kPasskeyPhoneIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnPhoneDarkIcon
                                                  : kWebauthnPhoneIcon;
 }
@@ -827,6 +887,11 @@
 const gfx::VectorIcon&
 AuthenticatorAndroidAccessorySheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyAoaDarkIcon
+                                                   : kPasskeyAoaIcon;
+  }
   return kWebauthnAoaIcon;
 }
 
@@ -901,6 +966,11 @@
 const gfx::VectorIcon&
 AuthenticatorClientPinEntrySheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyUsbDarkIcon
+                                                   : kPasskeyUsbIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnUsbDarkIcon
                                                  : kWebauthnUsbIcon;
 }
@@ -969,6 +1039,11 @@
 const gfx::VectorIcon&
 AuthenticatorClientPinTapAgainSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyUsbDarkIcon
+                                                   : kPasskeyUsbIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnUsbDarkIcon
                                                  : kWebauthnUsbIcon;
 }
@@ -1004,6 +1079,12 @@
 const gfx::VectorIcon&
 AuthenticatorBioEnrollmentSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    // No illustration since the content already has a large animated
+    // fingerprint icon.
+    return gfx::kNoneIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnFingerprintDarkIcon
                                                  : kWebauthnFingerprintIcon;
 }
@@ -1068,6 +1149,11 @@
 
 const gfx::VectorIcon& AuthenticatorRetryUvSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyFingerprintDarkIcon
+                                                   : kPasskeyFingerprintIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnFingerprintDarkIcon
                                                  : kWebauthnFingerprintIcon;
 }
@@ -1174,6 +1260,11 @@
 
 const gfx::VectorIcon& AuthenticatorGenericErrorSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyErrorDarkIcon
+                                                   : kPasskeyErrorIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnErrorDarkIcon
                                                  : kWebauthnErrorIcon;
 }
@@ -1203,6 +1294,13 @@
 const gfx::VectorIcon&
 AuthenticatorResidentCredentialConfirmationSheetView::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    // TODO(1358719): Add more specific illustration once available. The "error"
+    // graphic is a large question mark, so it looks visually very similar.
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyErrorDarkIcon
+                                                   : kPasskeyErrorIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnPermissionDarkIcon
                                                  : kWebauthnPermissionIcon;
 }
@@ -1295,6 +1393,11 @@
 const gfx::VectorIcon&
 AuthenticatorSelectAccountSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyHeaderDarkIcon
+                                                   : kPasskeyHeaderIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnWelcomeDarkIcon
                                                  : kWebauthnWelcomeIcon;
 }
@@ -1373,6 +1476,12 @@
 const gfx::VectorIcon&
 AttestationPermissionRequestSheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    // TODO(1358719): Add more specific illustration once available.
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyUsbDarkIcon
+                                                   : kPasskeyUsbIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnPermissionDarkIcon
                                                  : kWebauthnPermissionIcon;
 }
@@ -1448,6 +1557,7 @@
     ImageColorScheme color_scheme) const {
   if (base::FeatureList::IsEnabled(
           device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    // No illustration since there already is the QR code.
     return gfx::kNoneIcon;
   }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnPhoneDarkIcon
@@ -1500,6 +1610,11 @@
 const gfx::VectorIcon&
 AuthenticatorCreatePasskeySheetModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyHeaderDarkIcon
+                                                   : kPasskeyHeaderIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnWelcomeDarkIcon
                                                  : kWebauthnWelcomeIcon;
 }
diff --git a/chrome/browser/ui/webui/settings/ash/apps_section.cc b/chrome/browser/ui/webui/settings/ash/apps_section.cc
index a8d76e3..1076734 100644
--- a/chrome/browser/ui/webui/settings/ash/apps_section.cc
+++ b/chrome/browser/ui/webui/settings/ash/apps_section.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/ui/webui/settings/ash/apps_section.h"
 
-#include "ash/components/arc/arc_features.h"
 #include "ash/components/arc/arc_prefs.h"
 #include "ash/components/arc/arc_util.h"
 #include "ash/constants/ash_features.h"
@@ -416,10 +415,7 @@
       "showOsSettingsAppNotificationsRow",
       base::FeatureList::IsEnabled(
           chromeos::features::kOsSettingsAppNotificationsPage));
-  html_source->AddBoolean(
-      "showArcvmManageUsb",
-      arc::IsArcVmEnabled() &&
-          base::FeatureList::IsEnabled(arc::kUsbDeviceDefaultAttachToArcVm));
+  html_source->AddBoolean("showArcvmManageUsb", arc::IsArcVmEnabled());
 
   html_source->AddBoolean(
       "isAccessibilityOSSettingsVisibilityEnabled",
@@ -437,8 +433,7 @@
   web_ui->AddMessageHandler(
       std::make_unique<chromeos::settings::AndroidAppsHandler>(
           profile(), app_service_proxy_));
-  if (arc::IsArcVmEnabled() &&
-      base::FeatureList::IsEnabled(arc::kUsbDeviceDefaultAttachToArcVm))
+  if (arc::IsArcVmEnabled())
     web_ui->AddMessageHandler(std::make_unique<GuestOsHandler>(profile()));
 
   if (ShowPluginVm(profile(), *pref_service_)) {
diff --git a/chrome/browser/ui/webui/settings/settings_security_key_handler.cc b/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
index 67bbcca7..3752438 100644
--- a/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
@@ -1111,6 +1111,11 @@
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
 
 PasskeysHandler::PasskeysHandler() = default;
+
+PasskeysHandler::PasskeysHandler(
+    std::unique_ptr<LocalCredentialManagement> local_cred_man)
+    : local_cred_man_(std::move(local_cred_man)) {}
+
 PasskeysHandler::~PasskeysHandler() = default;
 
 void PasskeysHandler::OnJavascriptAllowed() {}
@@ -1128,6 +1133,14 @@
   web_ui()->RegisterMessageCallback(
       "passkeysDelete", base::BindRepeating(&PasskeysHandler::HandleDelete,
                                             base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "passkeysEdit", base::BindRepeating(&PasskeysHandler::HandleEdit,
+                                          base::Unretained(this)));
+  if (!local_cred_man_) {
+    local_cred_man_ =
+        LocalCredentialManagement::Create(Profile::FromBrowserContext(
+            web_ui()->GetWebContents()->GetBrowserContext()));
+  }
 }
 
 void PasskeysHandler::HandleHasPasskeys(const base::Value::List& args) {
@@ -1135,18 +1148,13 @@
   DCHECK_EQ(1u, args.size());
 
   AllowJavascript();
-  std::unique_ptr<LocalCredentialManagement> local_cred_man =
-      LocalCredentialManagement::Create(Profile::FromBrowserContext(
-          web_ui()->GetWebContents()->GetBrowserContext()));
-  local_cred_man->HasCredentials(base::BindOnce(
-      &PasskeysHandler::OnHasPasskeysComplete, weak_factory_.GetWeakPtr(),
-      args[0].GetString(), std::move(local_cred_man)));
+  local_cred_man_->HasCredentials(
+      base::BindOnce(&PasskeysHandler::OnHasPasskeysComplete,
+                     weak_factory_.GetWeakPtr(), args[0].GetString()));
 }
 
-void PasskeysHandler::OnHasPasskeysComplete(
-    std::string callback_id,
-    std::unique_ptr<LocalCredentialManagement> local_cred_man,
-    bool has_passkeys) {
+void PasskeysHandler::OnHasPasskeysComplete(std::string callback_id,
+                                            bool has_passkeys) {
   ResolveJavascriptCallback(base::Value(std::move(callback_id)),
                             base::Value(has_passkeys));
 }
@@ -1160,17 +1168,13 @@
 }
 
 void PasskeysHandler::DoEnumerate(std::string callback_id) {
-  std::unique_ptr<LocalCredentialManagement> local_cred_man =
-      LocalCredentialManagement::Create(Profile::FromBrowserContext(
-          web_ui()->GetWebContents()->GetBrowserContext()));
-  local_cred_man->Enumerate(base::BindOnce(
-      &PasskeysHandler::OnEnumerateComplete, weak_factory_.GetWeakPtr(),
-      std::move(callback_id), std::move(local_cred_man)));
+  local_cred_man_->Enumerate(
+      base::BindOnce(&PasskeysHandler::OnEnumerateComplete,
+                     weak_factory_.GetWeakPtr(), std::move(callback_id)));
 }
 
 void PasskeysHandler::OnEnumerateComplete(
     std::string callback_id,
-    std::unique_ptr<LocalCredentialManagement> local_cred_man,
     absl::optional<std::vector<device::DiscoverableCredentialMetadata>>
         credentials) {
   base::Value result;
@@ -1207,24 +1211,17 @@
   const bool ok = base::HexStringToBytes(args[1].GetString(), &credential_id);
   DCHECK(ok);
 
-  std::unique_ptr<LocalCredentialManagement> local_cred_man =
-      LocalCredentialManagement::Create(Profile::FromBrowserContext(
-          web_ui()->GetWebContents()->GetBrowserContext()));
-  local_cred_man->Delete(
+  local_cred_man_->Delete(
       credential_id,
       base::BindOnce(&PasskeysHandler::OnDeleteComplete,
-                     weak_factory_.GetWeakPtr(), args[0].GetString(),
-                     std::move(local_cred_man)));
+                     weak_factory_.GetWeakPtr(), args[0].GetString()));
 }
 
-void PasskeysHandler::OnDeleteComplete(
-    std::string callback_id,
-    std::unique_ptr<LocalCredentialManagement> local_cred_man,
-    bool ok) {
+void PasskeysHandler::OnDeleteComplete(std::string callback_id, bool ok) {
   if (!ok) {
-    // Windows failed to delete the passkey. This can happen if API support is
-    // missing but no passkeys will be shown at all in that case so that should
-    // be impossible. It can also happen if the user attempts to delete a
+    // Windows/Mac failed to delete the passkey. This can happen if API support
+    // is missing but no passkeys will be shown at all in that case so that
+    // should be impossible. It can also happen if the user attempts to delete a
     // system-created credential. In this case the Javascript will notice that
     // the credential didn't disappear and will show an error message.
   }
@@ -1232,6 +1229,27 @@
   DoEnumerate(std::move(callback_id));
 }
 
+void PasskeysHandler::HandleEdit(const base::Value::List& args) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK_EQ(3u, args.size());
+
+  std::vector<uint8_t> credential_id;
+  const bool ok = base::HexStringToBytes(args[1].GetString(), &credential_id);
+  DCHECK(ok);
+
+  std::string new_username = args[2].GetString();
+  local_cred_man_->Edit(
+      credential_id, std::move(new_username),
+      base::BindOnce(&PasskeysHandler::OnEditComplete,
+                     weak_factory_.GetWeakPtr(), args[0].GetString()));
+}
+
+void PasskeysHandler::OnEditComplete(std::string callback_id, bool ok) {
+  if (!ok) {
+    // Windows/Mac failed to edit the passkey.
+  }
+  DoEnumerate(std::move(callback_id));
+}
 #endif
 
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/settings_security_key_handler.h b/chrome/browser/ui/webui/settings/settings_security_key_handler.h
index 8fde16d..cde9fdd 100644
--- a/chrome/browser/ui/webui/settings/settings_security_key_handler.h
+++ b/chrome/browser/ui/webui/settings/settings_security_key_handler.h
@@ -274,6 +274,8 @@
 class PasskeysHandler : public SettingsPageUIHandler {
  public:
   PasskeysHandler();
+  explicit PasskeysHandler(
+      std::unique_ptr<LocalCredentialManagement> local_cred_man);
   ~PasskeysHandler() override;
 
  protected:
@@ -281,26 +283,24 @@
   void OnJavascriptAllowed() override;
   void OnJavascriptDisallowed() override;
 
+  void HandleEdit(const base::Value::List& args);
+  void OnEditComplete(std::string callback_id, bool edit_ok);
+
  private:
   void HandleHasPasskeys(const base::Value::List& args);
-  void OnHasPasskeysComplete(
-      std::string callback_id,
-      std::unique_ptr<LocalCredentialManagement> local_cred_man,
-      bool has_passkeys);
+  void OnHasPasskeysComplete(std::string callback_id, bool has_passkeys);
 
   void HandleEnumerate(const base::Value::List& args);
   void DoEnumerate(std::string callback_id);
   void OnEnumerateComplete(
       std::string callback_id,
-      std::unique_ptr<LocalCredentialManagement> local_cred_man,
       absl::optional<std::vector<device::DiscoverableCredentialMetadata>>
           credentials);
 
   void HandleDelete(const base::Value::List& args);
-  void OnDeleteComplete(
-      std::string callback_id,
-      std::unique_ptr<LocalCredentialManagement> local_cred_man,
-      bool delete_ok);
+  void OnDeleteComplete(std::string callback_id, bool delete_ok);
+
+  std::unique_ptr<LocalCredentialManagement> local_cred_man_{nullptr};
 
   base::WeakPtrFactory<PasskeysHandler> weak_factory_{this};
 };
diff --git a/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc b/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc
index 275cfd2..6e7c629 100644
--- a/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/settings_security_key_handler_unittest.cc
@@ -6,7 +6,9 @@
 
 #include <memory>
 
+#include "base/test/gmock_callback_support.h"
 #include "base/values.h"
+#include "chrome/browser/webauthn/local_credential_management.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "content/public/test/test_web_ui.h"
@@ -16,7 +18,9 @@
 #include "device/fido/fido_types.h"
 #include "device/fido/public_key_credential_rp_entity.h"
 #include "device/fido/public_key_credential_user_entity.h"
+#include "device/fido/test_callback_receiver.h"
 #include "device/fido/virtual_fido_device_factory.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -325,4 +329,111 @@
 
 }  // namespace
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
+class MockLocalCredentialManagement : public LocalCredentialManagement {
+ public:
+  ~MockLocalCredentialManagement() override = default;
+
+  MOCK_METHOD(void, HasCredentials, (base::OnceCallback<void(bool)> callback));
+  MOCK_METHOD(
+      void,
+      Enumerate,
+      (base::OnceCallback<void(
+           absl::optional<std::vector<device::DiscoverableCredentialMetadata>>)>
+           callback));
+  MOCK_METHOD(void,
+              Delete,
+              (base::span<const uint8_t> credential_id,
+               base::OnceCallback<void(bool)> callback));
+  MOCK_METHOD(void,
+              Edit,
+              (base::span<uint8_t> credential_id,
+               std::string new_username,
+               base::OnceCallback<void(bool)> callback));
+};
+
+class TestPasskeysHandler : public PasskeysHandler {
+ public:
+  TestPasskeysHandler(content::TestWebUI* web_ui,
+                      std::unique_ptr<LocalCredentialManagement> lcm)
+      : PasskeysHandler(std::move(lcm)) {
+    set_web_ui(web_ui);
+    AllowJavascriptForTesting();
+  }
+
+  using PasskeysHandler::HandleEdit;
+
+  std::string SimulateEdit(std::string credential_id,
+                           std::string new_username,
+                           base::OnceCallback<void(bool)> callback) {
+    constexpr char kCallbackId[] = "passkeysEdit";
+    base::Value::List args;
+    args.Append(kCallbackId);
+    args.Append(credential_id);
+    args.Append(new_username);
+    HandleEdit(args);
+    base::RunLoop().RunUntilIdle();
+    return kCallbackId;
+  }
+};
+
+class PasskeysHandlerTest : public ChromeRenderViewHostTestHarness {
+ protected:
+  void SetUp() override {
+    ChromeRenderViewHostTestHarness::SetUp();
+    web_ui_ = std::make_unique<content::TestWebUI>();
+    web_ui_->set_web_contents(web_contents());
+    local_cred_man_ = std::make_unique<MockLocalCredentialManagement>();
+    weak_local_cred_man_ = local_cred_man_.get();
+    handler_ = std::make_unique<TestPasskeysHandler>(
+        web_ui_.get(), std::move(local_cred_man_));
+    web_ui_->ClearTrackedCalls();
+  }
+
+  std::unique_ptr<TestPasskeysHandler> handler_;
+  std::unique_ptr<content::TestWebUI> web_ui_;
+  std::unique_ptr<MockLocalCredentialManagement> local_cred_man_;
+  raw_ptr<MockLocalCredentialManagement> weak_local_cred_man_;
+};
+
+TEST_F(PasskeysHandlerTest, TestHandleEdit) {
+  device::test::TestCallbackReceiver<bool> callback;
+  std::vector<uint8_t> credential_id =
+      device::fido_parsing_utils::Materialize(kCredentialID);
+  std::string credential_id_hex = base::HexEncode(credential_id);
+  EXPECT_CALL(
+      *weak_local_cred_man_,
+      Edit(testing::ElementsAreArray(kCredentialID),
+           testing::Eq("new-username"), base::test::IsNotNullCallback()))
+      .Times(testing::AtLeast(1))
+      .WillOnce([](base::span<uint8_t> credential_id, std::string new_username,
+                   base::OnceCallback<void(bool)> callback) {
+        std::move(callback).Run(true);
+        base::RunLoop().RunUntilIdle();
+      });
+  EXPECT_CALL(*weak_local_cred_man_, Enumerate)
+      .WillOnce([](base::OnceCallback<
+                    void(absl::optional<
+                         std::vector<device::DiscoverableCredentialMetadata>>)>
+                       callback) {
+        std::vector<device::DiscoverableCredentialMetadata> credential_metadata{
+            device::DiscoverableCredentialMetadata{
+                "a.com",
+                {0},
+                device::PublicKeyCredentialUserEntity(
+                    {0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa,
+                     0xa, 0xa, 0xa, 0xa},
+                    "new-username", "new-username")}};
+        std::move(callback).Run(std::move(credential_metadata));
+        base::RunLoop().RunUntilIdle();
+      });
+  handler_->SimulateEdit(credential_id_hex, "new-username",
+                         callback.callback());
+  EXPECT_EQ(web_ui_->call_data()[0]->arg1()->GetString(), "passkeysEdit");
+  EXPECT_EQ(web_ui_->call_data()[0]->arg2()->GetBool(), true);
+  EXPECT_EQ(*web_ui_->call_data()[0]->arg3()->GetList()[0].GetDict().FindString(
+                "userName"),
+            "new-username");
+}
+#endif
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index ea3753c..68d7077 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -16,6 +16,7 @@
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
+#include "chrome/browser/commerce/shopping_service_factory.h"
 #include "chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.h"
@@ -71,6 +72,7 @@
 #include "chrome/grit/settings_resources_map.h"
 #include "components/account_manager_core/account_manager_facade.h"
 #include "components/commerce/core/commerce_feature_list.h"
+#include "components/commerce/core/shopping_service.h"
 #include "components/favicon_base/favicon_url_parser.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/performance_manager/public/features.h"
@@ -311,6 +313,8 @@
   html_source->AddBoolean(
       "changePriceEmailNotificationsEnabled",
       base::FeatureList::IsEnabled(commerce::kShoppingList));
+  commerce::ShoppingServiceFactory::GetForBrowserContext(profile)
+      ->FetchPriceEmailPref();
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   html_source->AddResourcePath("images/google_assistant.svg",
diff --git a/chrome/browser/webauthn/android/conditional_ui_delegate_android.cc b/chrome/browser/webauthn/android/conditional_ui_delegate_android.cc
index 267d189..3776c83 100644
--- a/chrome/browser/webauthn/android/conditional_ui_delegate_android.cc
+++ b/chrome/browser/webauthn/android/conditional_ui_delegate_android.cc
@@ -9,6 +9,7 @@
 #include "base/callback.h"
 #include "chrome/browser/password_manager/chrome_webauthn_credentials_delegate.h"
 #include "chrome/browser/password_manager/chrome_webauthn_credentials_delegate_factory.h"
+#include "chrome/browser/webauthn/webauthn_metrics_util.h"
 #include "content/public/browser/web_contents.h"
 #include "device/fido/discoverable_credential_metadata.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
@@ -41,6 +42,8 @@
     base::OnceCallback<void(const std::vector<uint8_t>& id)> callback) {
   webauthn_account_selection_callback_ = std::move(callback);
 
+  ReportConditionalUiPasskeyCount(credentials.size());
+
   ChromeWebAuthnCredentialsDelegateFactory::GetFactory(
       content::WebContents::FromRenderFrameHost(frame_host))
       ->GetDelegateForFrame(frame_host)
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
index 017cc36..5089d5b 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -23,6 +23,7 @@
 #include "chrome/browser/password_manager/chrome_webauthn_credentials_delegate.h"
 #include "chrome/browser/password_manager/chrome_webauthn_credentials_delegate_factory.h"
 #include "chrome/browser/ui/webauthn/authenticator_request_dialog.h"
+#include "chrome/browser/webauthn/webauthn_metrics_util.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/vector_icons/vector_icons.h"
 #include "content/public/browser/global_routing_id.h"
@@ -1021,6 +1022,7 @@
   auto* render_frame_host = content::RenderFrameHost::FromID(frame_host_id_);
   auto* web_contents = GetWebContents();
   if (web_contents && render_frame_host) {
+    ReportConditionalUiPasskeyCount(ephemeral_state_.creds_.size());
     ChromeWebAuthnCredentialsDelegateFactory::GetFactory(web_contents)
         ->GetDelegateForFrame(render_frame_host)
         ->OnCredentialsReceived(ephemeral_state_.creds_);
diff --git a/chrome/browser/webauthn/local_credential_management.h b/chrome/browser/webauthn/local_credential_management.h
index c8e3555..0318c90 100644
--- a/chrome/browser/webauthn/local_credential_management.h
+++ b/chrome/browser/webauthn/local_credential_management.h
@@ -69,6 +69,12 @@
   // the value `true` if the deletion was successful.
   virtual void Delete(base::span<const uint8_t> credential_id,
                       base::OnceCallback<void(bool)> callback) = 0;
+
+  // Edit credential metadata's username field. The callback returns false if
+  // the credential was not updated to |new_username| in the mac keychain.
+  virtual void Edit(base::span<uint8_t> credential_id,
+                    std::string new_username,
+                    base::OnceCallback<void(bool)> callback) = 0;
 };
 
 #endif  // CHROME_BROWSER_WEBAUTHN_LOCAL_CREDENTIAL_MANAGEMENT_H_
diff --git a/chrome/browser/webauthn/local_credential_management_mac.cc b/chrome/browser/webauthn/local_credential_management_mac.cc
index 87bf0ed3..fba2f186 100644
--- a/chrome/browser/webauthn/local_credential_management_mac.cc
+++ b/chrome/browser/webauthn/local_credential_management_mac.cc
@@ -65,3 +65,12 @@
   device::fido::mac::TouchIdCredentialStore credential_store(config_);
   std::move(callback).Run(credential_store.DeleteCredentialById(credential_id));
 }
+
+void LocalCredentialManagementMac::Edit(
+    base::span<uint8_t> credential_id,
+    std::string new_username,
+    base::OnceCallback<void(bool)> callback) {
+  device::fido::mac::TouchIdCredentialStore credential_store(config_);
+  std::move(callback).Run(
+      credential_store.UpdateCredential(credential_id, new_username));
+}
\ No newline at end of file
diff --git a/chrome/browser/webauthn/local_credential_management_mac.h b/chrome/browser/webauthn/local_credential_management_mac.h
index a4f89c2c..ece0b952 100644
--- a/chrome/browser/webauthn/local_credential_management_mac.h
+++ b/chrome/browser/webauthn/local_credential_management_mac.h
@@ -27,6 +27,9 @@
           callback) override;
   void Delete(base::span<const uint8_t> credential_id,
               base::OnceCallback<void(bool)> callback) override;
+  void Edit(base::span<uint8_t> credential_id,
+            std::string new_username,
+            base::OnceCallback<void(bool)> callback) override;
 
  private:
   device::fido::mac::AuthenticatorConfig config_;
diff --git a/chrome/browser/webauthn/local_credential_management_mac_unittest.mm b/chrome/browser/webauthn/local_credential_management_mac_unittest.mm
index a1bc9ee6..28d7bd9 100644
--- a/chrome/browser/webauthn/local_credential_management_mac_unittest.mm
+++ b/chrome/browser/webauthn/local_credential_management_mac_unittest.mm
@@ -118,4 +118,65 @@
   EXPECT_FALSE(std::get<0>(callback.TakeResult()));
 }
 
+TEST_F(LocalCredentialManagementTest, EditCredential) {
+  device::test::TestCallbackReceiver<bool> callback;
+  auto credential = store_.CreateCredential(
+      kRpId, kUser, device::fido::mac::TouchIdCredentialStore::kDiscoverable);
+  ASSERT_TRUE(credential);
+  auto credentials =
+      device::fido::mac::TouchIdCredentialStore::FindCredentialsForTesting(
+          config_, kRpId);
+  EXPECT_EQ(credentials.size(), 1u);
+  local_cred_man_.Edit(credential->first.credential_id, "new-username",
+                       callback.callback());
+  callback.WaitForCallback();
+  EXPECT_TRUE(std::get<0>(callback.TakeResult()));
+
+  credentials =
+      device::fido::mac::TouchIdCredentialStore::FindCredentialsForTesting(
+          config_, kRpId);
+  EXPECT_EQ(credentials.size(), 1u);
+  EXPECT_EQ(credentials.front().metadata.user_name, "new-username");
+}
+
+TEST_F(LocalCredentialManagementTest, EditLongCredential) {
+  device::test::TestCallbackReceiver<bool> callback;
+  auto credential = store_.CreateCredential(
+      kRpId, kUser, device::fido::mac::TouchIdCredentialStore::kDiscoverable);
+  ASSERT_TRUE(credential);
+  auto credentials =
+      device::fido::mac::TouchIdCredentialStore::FindCredentialsForTesting(
+          config_, kRpId);
+  EXPECT_EQ(credentials.size(), 1u);
+  local_cred_man_.Edit(
+      credential->first.credential_id,
+      "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
+      callback.callback());
+  callback.WaitForCallback();
+  EXPECT_TRUE(std::get<0>(callback.TakeResult()));
+
+  credentials =
+      device::fido::mac::TouchIdCredentialStore::FindCredentialsForTesting(
+          config_, kRpId);
+  EXPECT_EQ(credentials.size(), 1u);
+  EXPECT_EQ(
+      credentials.front().metadata.user_name,
+      "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA…");
+}
+
+TEST_F(LocalCredentialManagementTest, EditUnknownCredential) {
+  device::test::TestCallbackReceiver<bool> callback;
+  auto credential = store_.CreateCredential(
+      kRpId, kUser, device::fido::mac::TouchIdCredentialStore::kDiscoverable);
+  ASSERT_TRUE(credential);
+  auto credentials =
+      device::fido::mac::TouchIdCredentialStore::FindCredentialsForTesting(
+          config_, kRpId);
+  EXPECT_EQ(credentials.size(), 1u);
+  uint8_t credential_id[] = {0xa};
+  local_cred_man_.Edit(credential_id, "new-username", callback.callback());
+  callback.WaitForCallback();
+  EXPECT_FALSE(std::get<0>(callback.TakeResult()));
+}
+
 }  // namespace
diff --git a/chrome/browser/webauthn/local_credential_management_win.cc b/chrome/browser/webauthn/local_credential_management_win.cc
index ff1ac6a..65dcccf 100644
--- a/chrome/browser/webauthn/local_credential_management_win.cc
+++ b/chrome/browser/webauthn/local_credential_management_win.cc
@@ -3,10 +3,10 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/webauthn/local_credential_management_win.h"
-#include "chrome/browser/webauthn/local_credential_management.h"
 
 #include "base/bind.h"
 #include "base/feature_list.h"
+#include "base/notreached.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
@@ -165,3 +165,11 @@
   device::WinWebAuthnApiAuthenticator::DeletePlatformCredential(
       api_, credential_id, std::move(callback));
 }
+
+void LocalCredentialManagementWin::Edit(
+    base::span<uint8_t> credential_id,
+    std::string new_username,
+    base::OnceCallback<void(bool)> callback) {
+  // Editing passkeys should not be an option in Windows.
+  NOTREACHED();
+}
diff --git a/chrome/browser/webauthn/local_credential_management_win.h b/chrome/browser/webauthn/local_credential_management_win.h
index e24ac8c0..8f88c60 100644
--- a/chrome/browser/webauthn/local_credential_management_win.h
+++ b/chrome/browser/webauthn/local_credential_management_win.h
@@ -41,6 +41,9 @@
           callback) override;
   void Delete(base::span<const uint8_t> credential_id,
               base::OnceCallback<void(bool)> callback) override;
+  void Edit(base::span<uint8_t> credential_id,
+            std::string new_username,
+            base::OnceCallback<void(bool)> callback) override;
 
  private:
   device::WinWebAuthnApi* const api_;
diff --git a/chrome/browser/webauthn/webauthn_metrics_util.cc b/chrome/browser/webauthn/webauthn_metrics_util.cc
new file mode 100644
index 0000000..55d149e
--- /dev/null
+++ b/chrome/browser/webauthn/webauthn_metrics_util.cc
@@ -0,0 +1,20 @@
+// Copyright 2022 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/webauthn/webauthn_metrics_util.h"
+
+#include "base/metrics/histogram_functions.h"
+
+namespace {
+
+// Maximum bucket for reporting number of passkeys present for a given
+// Conditional UI request.
+constexpr int kPasskeyCountMax = 10;
+
+}  // namespace
+
+void ReportConditionalUiPasskeyCount(int passkey_count) {
+  base::UmaHistogramExactLinear("WebAuthentication.ConditionalUiPasskeyCount",
+                                passkey_count, kPasskeyCountMax);
+}
diff --git a/chrome/browser/webauthn/webauthn_metrics_util.h b/chrome/browser/webauthn/webauthn_metrics_util.h
new file mode 100644
index 0000000..f3ac613
--- /dev/null
+++ b/chrome/browser/webauthn/webauthn_metrics_util.h
@@ -0,0 +1,10 @@
+// Copyright 2022 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_WEBAUTHN_WEBAUTHN_METRICS_UTIL_H_
+#define CHROME_BROWSER_WEBAUTHN_WEBAUTHN_METRICS_UTIL_H_
+
+void ReportConditionalUiPasskeyCount(int passkey_count);
+
+#endif  // CHROME_BROWSER_WEBAUTHN_WEBAUTHN_METRICS_UTIL_H_
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index c5724c2..dfd0bf68 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1663761539-961694930d329b2931eb3e0cb72c389c562bde19.profdata
+chrome-linux-main-1663783183-9c32cabf46fa8298a487a7c85d3008e28b574125.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index a4a796e..38c3e8f 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1663761539-0d091209a48fdb1f00ea107ed3870b59a8d6f255.profdata
+chrome-win32-main-1663772376-707d803d4d37bd1d5c53983e8e7d87a0e765b5ab.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index b853ff3..61398e7e 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1663761539-762ca22ce3fd3bb5d6b19e865b356e539850929b.profdata
+chrome-win64-main-1663783183-2f667e488af4f8c4511571636864bb4c2addf119.profdata
diff --git a/chrome/common/safe_browsing/download_type_util.cc b/chrome/common/safe_browsing/download_type_util.cc
index 46bb9f4..ae665b2a 100644
--- a/chrome/common/safe_browsing/download_type_util.cc
+++ b/chrome/common/safe_browsing/download_type_util.cc
@@ -17,13 +17,15 @@
 
 ClientDownloadRequest::DownloadType GetDownloadType(
     const base::FilePath& file) {
+  base::FilePath::StringType ext = file.Extension();
+
   // TODO(nparker): Put all of this logic into the FileTypePolicies
   // protobuf.
-  if (file.MatchesExtension(FILE_PATH_LITERAL(".apk")))
+  if (base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".apk")))
     return ClientDownloadRequest::ANDROID_APK;
-  else if (file.MatchesExtension(FILE_PATH_LITERAL(".crx")))
+  else if (base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".crx")))
     return ClientDownloadRequest::CHROME_EXTENSION;
-  else if (file.MatchesExtension(FILE_PATH_LITERAL(".zip")))
+  else if (base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".zip")))
     // DownloadProtectionService doesn't send a ClientDownloadRequest for ZIP
     // files unless they contain either executables or archives. The resulting
     // DownloadType is either ZIPPED_EXECUTABLE or ZIPPED_ARCHIVE respectively.
@@ -31,64 +33,69 @@
     // placeholder. The correct DownloadType will be determined based on the
     // result of analyzing the ZIP file.
     return ClientDownloadRequest::ZIPPED_EXECUTABLE;
-  else if (file.MatchesExtension(FILE_PATH_LITERAL(".rar")))
+  else if (base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".rar")))
     // See the comment for .zip files.
     return ClientDownloadRequest::RAR_COMPRESSED_EXECUTABLE;
-  else if (file.MatchesExtension(FILE_PATH_LITERAL(".dmg")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".img")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".iso")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".pkg")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".mpkg")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".smi")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".app")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".cdr")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".dmgpart")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".dvdr")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".dart")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".dc42")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".diskcopy42")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".imgpart")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".ndif")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".udif")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".toast")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".sparsebundle")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".sparseimage")))
+  else if (base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".dmg")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".img")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".iso")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".pkg")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".mpkg")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".smi")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".app")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".cdr")) ||
+           base::EqualsCaseInsensitiveASCII(ext,
+                                            FILE_PATH_LITERAL(".dmgpart")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".dvdr")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".dart")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".dc42")) ||
+           base::EqualsCaseInsensitiveASCII(ext,
+                                            FILE_PATH_LITERAL(".diskcopy42")) ||
+           base::EqualsCaseInsensitiveASCII(ext,
+                                            FILE_PATH_LITERAL(".imgpart")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".ndif")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".udif")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".toast")) ||
+           base::EqualsCaseInsensitiveASCII(
+               ext, FILE_PATH_LITERAL(".sparsebundle")) ||
+           base::EqualsCaseInsensitiveASCII(ext,
+                                            FILE_PATH_LITERAL(".sparseimage")))
     return ClientDownloadRequest::MAC_EXECUTABLE;
   else if (FileTypePolicies::GetInstance()->IsArchiveFile(file))
     return ClientDownloadRequest::ARCHIVE;
-  else if (file.MatchesExtension(FILE_PATH_LITERAL(".pdf")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".doc")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".docx")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".docm")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".docb")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".dot")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".dotm")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".dotx")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xls")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xlsb")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xlt")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xlm")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xlsx")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xldm")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xltx")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xltm")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xla")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xlam")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xll")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".xlw")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".ppt")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".pot")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".pps")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".pptx")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".pptm")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".potx")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".potm")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".ppam")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".ppsx")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".ppsm")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".sldx")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".rtf")) ||
-           file.MatchesExtension(FILE_PATH_LITERAL(".wll")))
+  else if (base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".pdf")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".doc")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".docx")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".docm")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".docb")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".dot")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".dotm")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".dotx")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xls")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xlsb")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xlt")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xlm")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xlsx")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xldm")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xltx")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xltm")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xla")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xlam")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xll")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".xlw")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".ppt")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".pot")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".pps")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".pptx")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".pptm")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".potx")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".potm")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".ppam")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".ppsx")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".ppsm")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".sldx")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".rtf")) ||
+           base::EqualsCaseInsensitiveASCII(ext, FILE_PATH_LITERAL(".wll")))
     return ClientDownloadRequest::DOCUMENT;
   else if (file.MatchesExtension(FILE_PATH_LITERAL(".7z")))
     return ClientDownloadRequest::SEVEN_ZIP_COMPRESSED_EXECUTABLE;
diff --git a/chrome/renderer/media/chrome_key_systems.cc b/chrome/renderer/media/chrome_key_systems.cc
index e1a0676..275e52d 100644
--- a/chrome/renderer/media/chrome_key_systems.cc
+++ b/chrome/renderer/media/chrome_key_systems.cc
@@ -164,8 +164,7 @@
 }
 #endif  // BUILDFLAG(ENABLE_PLATFORM_DOLBY_VISION)
 
-SupportedCodecs GetSupportedCodecs(const media::CdmCapability& capability,
-                                   bool requires_clear_lead_support = true) {
+SupportedCodecs GetSupportedCodecs(const media::CdmCapability& capability) {
   SupportedCodecs supported_codecs = media::EME_CODEC_NONE;
 
   for (const auto& codec : capability.audio_codecs) {
@@ -199,8 +198,6 @@
   // For compatibility with older CDMs different profiles are only used
   // with some video codecs.
   for (const auto& [codec, video_codec_info] : capability.video_codecs) {
-    if (requires_clear_lead_support && !video_codec_info.supports_clear_lead)
-      continue;
     switch (codec) {
       case media::VideoCodec::kVP8:
         supported_codecs |= media::EME_CODEC_VP8;
@@ -288,10 +285,6 @@
   // Codecs and encryption schemes.
   SupportedCodecs codecs = media::EME_CODEC_NONE;
   SupportedCodecs hw_secure_codecs = media::EME_CODEC_NONE;
-#if BUILDFLAG(IS_WIN)
-  SupportedCodecs hw_secure_codecs_clear_lead_support_not_required =
-      media::EME_CODEC_NONE;
-#endif
   base::flat_set<::media::EncryptionScheme> encryption_schemes;
   base::flat_set<::media::EncryptionScheme> hw_secure_encryption_schemes;
   base::flat_set<CdmSessionType> session_types;
@@ -312,13 +305,6 @@
   if (capability->hw_secure_capability) {
     hw_secure_codecs =
         GetSupportedCodecs(capability->hw_secure_capability.value());
-#if BUILDFLAG(IS_WIN)
-    // In Chrome, for the experimental key system, we do not have to filter the
-    // hardware secure codecs by whether they support clear lead or not.
-    hw_secure_codecs_clear_lead_support_not_required =
-        GetSupportedCodecs(capability->hw_secure_capability.value(),
-                           /*requires_clear_lead_support=*/false);
-#endif
     hw_secure_encryption_schemes =
         capability->hw_secure_capability->encryption_schemes;
     hw_secure_session_types = UpdatePersistentLicenseSupport(
@@ -354,32 +340,12 @@
   distinctive_identifier_support = EmeFeatureSupport::REQUESTABLE;
 #endif
 
-  key_systems->emplace_back(std::make_unique<cdm::WidevineKeySystemInfo>(
-      codecs, encryption_schemes, session_types, hw_secure_codecs,
-      hw_secure_encryption_schemes, hw_secure_session_types,
-      max_audio_robustness, max_video_robustness, persistent_state_support,
+  key_systems->emplace_back(new cdm::WidevineKeySystemInfo(
+      codecs, std::move(encryption_schemes), std::move(session_types),
+      hw_secure_codecs, std::move(hw_secure_encryption_schemes),
+      std::move(hw_secure_session_types), max_audio_robustness,
+      max_video_robustness, persistent_state_support,
       distinctive_identifier_support));
-
-#if BUILDFLAG(IS_WIN)
-  // Register another WidevineKeySystemInfo on Windows only for
-  // `kWideVineExperimentKeySystem`. The default WidevineKeySystemInfo
-  // above requires clear lead to be supported. This is not required for
-  // the experimental key system because content providers using the
-  // experimental key system would not serve clear lead content.
-  if (base::FeatureList::IsEnabled(
-          media::kHardwareSecureDecryptionExperiment)) {
-    auto experimental_key_system_info =
-        std::make_unique<cdm::WidevineKeySystemInfo>(
-            codecs, encryption_schemes, session_types,
-            hw_secure_codecs_clear_lead_support_not_required,
-            hw_secure_encryption_schemes, hw_secure_session_types,
-            max_audio_robustness, max_video_robustness,
-            persistent_state_support, distinctive_identifier_support);
-    experimental_key_system_info->set_experimental();
-
-    key_systems->emplace_back(std::move(experimental_key_system_info));
-  }
-#endif
   return true;
 }
 #endif  // BUILDFLAG(ENABLE_WIDEVINE)
diff --git a/chrome/services/file_util/public/mojom/file_util_service.mojom b/chrome/services/file_util/public/mojom/file_util_service.mojom
index 25cfded..35812ff 100644
--- a/chrome/services/file_util/public/mojom/file_util_service.mojom
+++ b/chrome/services/file_util/public/mojom/file_util_service.mojom
@@ -17,7 +17,7 @@
 
 // The main interface to the file utility service. Binds any of various
 // specific utility receivers.
-[ServiceSandbox=sandbox.mojom.Sandbox.kUtility]
+[ServiceSandbox=sandbox.mojom.Sandbox.kService]
 interface FileUtilService {
   // Binds an instance of the ZipFileCreator interface.
   [EnableIf=is_chromeos_ash]
diff --git a/chrome/services/qrcode_generator/BUILD.gn b/chrome/services/qrcode_generator/BUILD.gn
index 34a8863b..362de20 100644
--- a/chrome/services/qrcode_generator/BUILD.gn
+++ b/chrome/services/qrcode_generator/BUILD.gn
@@ -14,6 +14,7 @@
     "//base",
     "//chrome:strings",
     "//components/qr_code_generator",
+    "//components/vector_icons",
     "//mojo/public/cpp/bindings",
     "//net",
     "//ui/gfx",
diff --git a/chrome/services/qrcode_generator/DEPS b/chrome/services/qrcode_generator/DEPS
index b4a1baf1..1afd44f 100644
--- a/chrome/services/qrcode_generator/DEPS
+++ b/chrome/services/qrcode_generator/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
   "+components/qr_code_generator",
+  "+components/vector_icons",
 ]
diff --git a/chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom b/chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom
index e1c0f89..d133d30 100644
--- a/chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom
+++ b/chrome/services/qrcode_generator/public/mojom/qrcode_generator.mojom
@@ -32,6 +32,13 @@
   ROUNDED,
 };
 
+// The center image to superimpose over the QR code.
+enum CenterImage {
+  DEFAULT_NONE,
+  CHROME_DINO,
+  PASSKEY_ICON,
+};
+
 // Structure for requesting QR Code data or image.
 struct GenerateQRCodeRequest {
   // Data to generate the QR code.
@@ -40,14 +47,14 @@
   // Whether to render the QR code. If false, provides data back to the caller.
   bool should_render;
 
-  // Whether to superimpose a Chrome dino over the center of the image.
-  bool render_dino;
-
   // Style for the individual modules. Does not apply to locators.
   ModuleStyle render_module_style;
 
   // Whether the renderer should include rounded corners.
   LocatorStyle render_locator_style;
+
+  // The image, if any, to superimpose over the center of the QR code.
+  CenterImage center_image;
 };
 
 // Structure for returning QR Code image data.
diff --git a/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc b/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc
index 4157628..d401677 100644
--- a/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc
+++ b/chrome/services/qrcode_generator/qrcode_generator_service_impl.cc
@@ -11,9 +11,13 @@
 #include "base/strings/string_util.h"
 #include "components/qr_code_generator/dino_image.h"
 #include "components/qr_code_generator/qr_code_generator.h"
+#include "components/vector_icons/vector_icons.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/skia_conversions.h"
+#include "ui/gfx/image/image_skia.h"
+#include "ui/gfx/image/image_skia_rep_default.h"
+#include "ui/gfx/paint_vector_icon.h"
 
 namespace qrcode_generator {
 
@@ -73,6 +77,19 @@
                    dino_image::kDinoHeadHeight);
 }
 
+void QRCodeGeneratorServiceImpl::DrawPasskeyIcon(
+    SkCanvas* canvas,
+    const SkRect& canvas_bounds,
+    const SkPaint& paint_foreground,
+    const SkPaint& paint_background) {
+  constexpr int kSizePx = 100;
+  constexpr int kBorderPx = 0;  // Unlike the dino, the icon is already padded.
+  auto icon = gfx::CreateVectorIcon(gfx::IconDescription(
+      vector_icons::kPasskeyIcon, kSizePx, paint_foreground.getColor()));
+  PaintCenterImage(canvas, canvas_bounds, kSizePx, kSizePx, kBorderPx,
+                   paint_background, icon.GetRepresentation(1.0f).GetBitmap());
+}
+
 void QRCodeGeneratorServiceImpl::DrawDino(SkCanvas* canvas,
                                           const SkRect& canvas_bounds,
                                           const int pixels_per_dino_tile,
@@ -81,43 +98,52 @@
                                           const SkPaint& paint_background) {
   int dino_width_px = pixels_per_dino_tile * dino_image::kDinoWidth;
   int dino_height_px = pixels_per_dino_tile * dino_image::kDinoHeight;
+  PaintCenterImage(canvas, canvas_bounds, dino_width_px, dino_height_px,
+                   dino_border_px, paint_background, dino_bitmap_);
+}
 
-  // If we request too big a dino, we'll clip. In practice the dino size
+void QRCodeGeneratorServiceImpl::PaintCenterImage(
+    SkCanvas* canvas,
+    const SkRect& canvas_bounds,
+    const int width_px,
+    const int height_px,
+    const int border_px,
+    const SkPaint& paint_background,
+    const SkBitmap& image) {
+  // If we request too big an image, we'll clip. In practice the image size
   // should be significantly smaller than the canvas to leave room for the
   // data payload and locators, so alert if we take over 25% of the area.
-  DCHECK_GE(canvas_bounds.height() / 2,
-            dino_image::kDinoHeight * pixels_per_dino_tile + dino_border_px);
-  DCHECK_GE(canvas_bounds.width() / 2,
-            dino_image::kDinoWidth * pixels_per_dino_tile + dino_border_px);
+  DCHECK_GE(canvas_bounds.width() / 2, width_px + border_px);
+  DCHECK_GE(canvas_bounds.height() / 2, height_px + border_px);
 
   // Assemble the target rect for the dino image data.
-  SkRect dest_rect = SkRect::MakeWH(dino_width_px, dino_height_px);
+  SkRect dest_rect = SkRect::MakeWH(width_px, height_px);
   dest_rect.offset((canvas_bounds.width() - dest_rect.width()) / 2,
                    (canvas_bounds.height() - dest_rect.height()) / 2);
 
   // Clear out a little room for a border, snapped to some number of modules.
   SkRect background = SkRect::MakeLTRB(
-      std::floor((dest_rect.left() - dino_border_px) / kModuleSizePixels) *
+      std::floor((dest_rect.left() - border_px) / kModuleSizePixels) *
           kModuleSizePixels,
-      std::floor((dest_rect.top() - dino_border_px) / kModuleSizePixels) *
+      std::floor((dest_rect.top() - border_px) / kModuleSizePixels) *
           kModuleSizePixels,
-      std::floor((dest_rect.right() + dino_border_px + kModuleSizePixels - 1) /
+      std::floor((dest_rect.right() + border_px + kModuleSizePixels - 1) /
                  kModuleSizePixels) *
           kModuleSizePixels,
-      std::floor((dest_rect.bottom() + dino_border_px + kModuleSizePixels - 1) /
+      std::floor((dest_rect.bottom() + border_px + kModuleSizePixels - 1) /
                  kModuleSizePixels) *
           kModuleSizePixels);
   canvas->drawRect(background, paint_background);
 
-  // Center the dino within the cleared space, and draw it.
+  // Center the image within the cleared space, and draw it.
   SkScalar delta_x =
       SkScalarRoundToScalar(background.centerX() - dest_rect.centerX());
   SkScalar delta_y =
       SkScalarRoundToScalar(background.centerY() - dest_rect.centerY());
   dest_rect.offset(delta_x, delta_y);
-  SkRect dino_bounds;
-  dino_bitmap_.getBounds(&dino_bounds);
-  canvas->drawImageRect(dino_bitmap_.asImage(), dino_bounds, dest_rect,
+  SkRect image_bounds;
+  image.getBounds(&image_bounds);
+  canvas->drawImageRect(image.asImage(), image_bounds, dest_rect,
                         SkSamplingOptions(), nullptr,
                         SkCanvas::kStrict_SrcRectConstraint);
 }
@@ -221,11 +247,19 @@
   DrawLocators(&canvas, data_size, paint_black, paint_white,
                request->render_locator_style);
 
-  if (request->render_dino) {
-    SkRect bitmap_bounds;
-    bitmap.getBounds(&bitmap_bounds);
-    DrawDino(&canvas, bitmap_bounds, kDinoTileSizePixels, 2, paint_black,
-             paint_white);
+  SkRect bitmap_bounds;
+  bitmap.getBounds(&bitmap_bounds);
+
+  switch (request->center_image) {
+    case mojom::CenterImage::DEFAULT_NONE:
+      break;
+    case mojom::CenterImage::CHROME_DINO:
+      DrawDino(&canvas, bitmap_bounds, kDinoTileSizePixels, 2, paint_black,
+               paint_white);
+      break;
+    case mojom::CenterImage::PASSKEY_ICON:
+      DrawPasskeyIcon(&canvas, bitmap_bounds, paint_black, paint_white);
+      break;
   }
 
   (*response)->bitmap = bitmap;
diff --git a/chrome/services/qrcode_generator/qrcode_generator_service_impl.h b/chrome/services/qrcode_generator/qrcode_generator_service_impl.h
index fc885ae..d63ff1a 100644
--- a/chrome/services/qrcode_generator/qrcode_generator_service_impl.h
+++ b/chrome/services/qrcode_generator/qrcode_generator_service_impl.h
@@ -49,6 +49,22 @@
                 const SkPaint& paint_foreground,
                 const SkPaint& paint_background);
 
+  // Draws a passkey icon at the center of |canvas|.
+  void DrawPasskeyIcon(SkCanvas* canvas,
+                       const SkRect& canvas_bounds,
+                       const SkPaint& paint_foreground,
+                       const SkPaint& paint_background);
+
+  // Draws |image| at the center of |canvas| with a border of at least
+  // |border_px|, snapped to a whole module.
+  void PaintCenterImage(SkCanvas* canvas,
+                        const SkRect& canvas_bounds,
+                        const int width_px,
+                        const int height_px,
+                        const int border_px,
+                        const SkPaint& paint_background,
+                        const SkBitmap& image);
+
   // Renders the QR code with pixel information in |data| and render parameters
   // in |request|. Result is stored into |response|.
   // |data| is input data, one element per module, row-major.
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 0fb2fed..3044f42 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3419,6 +3419,7 @@
         "../browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc",
         "../browser/ui/views/tabs/tab_group_editor_bubble_view_browsertest.cc",
         "../browser/ui/views/tabs/tab_hover_card_bubble_view_browsertest.cc",
+        "../browser/ui/views/toolbar/browser_app_menu_browsertest.cc",
         "../browser/ui/views/translate/translate_bubble_test_utils_views.cc",
         "../browser/ui/views/translate/translate_bubble_view_browsertest.cc",
         "../browser/ui/views/user_education/help_bubble_factory_views_browsertest.cc",
@@ -3946,6 +3947,7 @@
         "../browser/renderer_context_menu/quick_answers_menu_observer_browsertest.cc",
         "../browser/sessions/session_restore_browsertest_chromeos.cc",
         "../browser/signin/chromeos_mirror_account_consistency_browsertest.cc",
+        "../browser/speech/extension_api/tts_extension_api_ash_browsertest.cc",
         "../browser/speech/network_speech_recognizer_browsertest.cc",
         "../browser/speech/on_device_speech_recognizer_browsertest.cc",
         "../browser/support_tool/ash/ui_hierarchy_data_collector_browsertest.cc",
diff --git a/chrome/test/base/chromeos/ash_browser_test_starter.cc b/chrome/test/base/chromeos/ash_browser_test_starter.cc
index b426e092..f126b42 100644
--- a/chrome/test/base/chromeos/ash_browser_test_starter.cc
+++ b/chrome/test/base/chromeos/ash_browser_test_starter.cc
@@ -46,6 +46,8 @@
       {});
   command_line->AppendSwitch("enable-wayland-server");
   command_line->AppendSwitch("no-startup-window");
+  command_line->AppendSwitchASCII("lacros-chrome-additional-args",
+                                  "--no-first-run");
   return true;
 }
 
diff --git a/chrome/test/data/extensions/api_test/tts_engine/lacros_tts_support/register_ash_engine/manifest.json b/chrome/test/data/extensions/api_test/tts_engine/lacros_tts_support/register_ash_engine/manifest.json
new file mode 100644
index 0000000..235c720
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/tts_engine/lacros_tts_support/register_ash_engine/manifest.json
@@ -0,0 +1,31 @@
+{
+  "name": "chrome.ttsEngine",
+  "version": "0.1",
+  "manifest_version": 2,
+  "description": "browser test for chrome.ttsEngine API",
+  "background": {
+    "page": "test.html"
+  },
+  "tts_engine": {
+    "voices": [
+      {
+        "voice_name": "Amy",
+        "lang": "en-US",
+        "gender": "female",
+        "event_types": [ "end" ]
+      },
+      {
+        "voice_name": "Alex",
+        "lang": "en-US",
+        "event_types": [ "end" ]
+      },
+      {
+        "voice_name": "Amanda",
+        "lang": "en-US",
+        "gender": "feline",
+        "event_types": [ "end" ]
+      }
+    ]
+  },
+  "permissions": ["tts", "ttsEngine"]
+}
diff --git a/chrome/test/data/extensions/api_test/tts_engine/lacros_tts_support/register_ash_engine/test.html b/chrome/test/data/extensions/api_test/tts_engine/lacros_tts_support/register_ash_engine/test.html
new file mode 100644
index 0000000..5a5ee3d
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/tts_engine/lacros_tts_support/register_ash_engine/test.html
@@ -0,0 +1,6 @@
+<!--
+ * Copyright 2022 The Chromium Authors. All rights reserved.  Use of this
+ * source code is governed by a BSD-style license that can be found in the
+ * LICENSE file.
+-->
+<script src="test.js"></script>
diff --git a/chrome/test/data/extensions/api_test/tts_engine/lacros_tts_support/register_ash_engine/test.js b/chrome/test/data/extensions/api_test/tts_engine/lacros_tts_support/register_ash_engine/test.js
new file mode 100644
index 0000000..333db28e
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/tts_engine/lacros_tts_support/register_ash_engine/test.js
@@ -0,0 +1,19 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// TTS api test running from ash with lacros..
+// browser_tests --lacros-chrome-path={your_build_path}/lacros_clang_x64
+//     --gtest_filter="AshTtsApiTest.*"
+
+chrome.test.runTests([
+  function testGetVoices() {
+    // We have to register listeners, or the voices provided
+    // by this extension won't be returned.
+    var speakListener = function (utterance, options, sendTtsEvent) {};
+    var stopListener = function () {};
+    chrome.ttsEngine.onSpeak.addListener(speakListener);
+    chrome.ttsEngine.onStop.addListener(stopListener);
+    chrome.test.succeed();
+  }
+]);
diff --git a/chrome/test/data/pdf/zoom_manager_test.ts b/chrome/test/data/pdf/zoom_manager_test.ts
index c6cc6c99..f031ce6e 100644
--- a/chrome/test/data/pdf/zoom_manager_test.ts
+++ b/chrome/test/data/pdf/zoom_manager_test.ts
@@ -4,7 +4,7 @@
 
 import {ZoomBehavior, ZoomManager} from 'chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/pdf_viewer_wrapper.js';
 import {EventTracker} from 'chrome://resources/js/event_tracker.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 chrome.test.runTests(function() {
   'use strict';
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 5eaa67b..75116d8 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -569,7 +569,8 @@
       "mac",
       "chromeos_ash",
       "chromeos_lacros",
-      "fuchsia"
+      "fuchsia",
+      "android"
     ],
     "policy_pref_mapping_tests": [
       {
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 85eff71..5b638086 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -346,7 +346,7 @@
 }
 
 js_library("test_browser_proxy") {
-  deps = [ "//ui/webui/resources/js:promise_resolver.m" ]
+  deps = [ "//ui/webui/resources/js:promise_resolver" ]
 }
 
 js_library("test_plural_string_proxy") {
diff --git a/chrome/test/data/webui/bluetooth_internals/bluetooth_internals_test.js b/chrome/test/data/webui/bluetooth_internals/bluetooth_internals_test.js
index 2462f25..37a2a98 100644
--- a/chrome/test/data/webui/bluetooth_internals/bluetooth_internals_test.js
+++ b/chrome/test/data/webui/bluetooth_internals/bluetooth_internals_test.js
@@ -11,7 +11,7 @@
 import {UUID} from 'chrome://bluetooth-internals/uuid.mojom-webui.js';
 import {ValueControl, ValueDataType} from 'chrome://bluetooth-internals/value_control.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {$} from 'chrome://resources/js/util.m.js';
 
 import {fakeAdapterInfo, fakeCharacteristicInfo1, fakeDeviceInfo1, fakeDeviceInfo2, fakeDeviceInfo3, fakeServiceInfo1, fakeServiceInfo2, TestAdapter, TestBluetoothInternalsHandler, TestDevice} from './test_utils.js';
diff --git a/chrome/test/data/webui/chromeos/BUILD.gn b/chrome/test/data/webui/chromeos/BUILD.gn
index bcbde34..014f3f1 100644
--- a/chrome/test/data/webui/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/BUILD.gn
@@ -21,7 +21,7 @@
   deps = [
     "//ui/webui/resources/cr_components/chromeos/network:onc_mojo",
     "//ui/webui/resources/js:assert.m",
-    "//ui/webui/resources/js:promise_resolver.m",
+    "//ui/webui/resources/js:promise_resolver",
   ]
 }
 
diff --git a/chrome/test/data/webui/chromeos/ash_common/fake_observables_test.js b/chrome/test/data/webui/chromeos/ash_common/fake_observables_test.js
index 8d60e2d7..2dc08a20 100644
--- a/chrome/test/data/webui/chromeos/ash_common/fake_observables_test.js
+++ b/chrome/test/data/webui/chromeos/ash_common/fake_observables_test.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {FakeObservables} from 'chrome://resources/ash/common/fake_observables.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {assertEquals} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/chromeos/diagnostics/fake_network_health_provider_test.js b/chrome/test/data/webui/chromeos/diagnostics/fake_network_health_provider_test.js
index cdd6260..14878af7 100644
--- a/chrome/test/data/webui/chromeos/diagnostics/fake_network_health_provider_test.js
+++ b/chrome/test/data/webui/chromeos/diagnostics/fake_network_health_provider_test.js
@@ -5,7 +5,7 @@
 import {fakeCellularNetwork, fakeEthernetNetwork, fakeNetworkGuidInfoList, fakeWifiNetwork} from 'chrome://diagnostics/fake_data.js';
 import {FakeNetworkHealthProvider} from 'chrome://diagnostics/fake_network_health_provider.js';
 import {NetworkListObserverRemote, NetworkStateObserverRemote} from 'chrome://diagnostics/network_health_provider.mojom-webui.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {assertDeepEquals, assertEquals, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/chromeos/diagnostics/fake_system_data_provider_test.js b/chrome/test/data/webui/chromeos/diagnostics/fake_system_data_provider_test.js
index 0f7d053..fd65942 100644
--- a/chrome/test/data/webui/chromeos/diagnostics/fake_system_data_provider_test.js
+++ b/chrome/test/data/webui/chromeos/diagnostics/fake_system_data_provider_test.js
@@ -5,7 +5,7 @@
 import {fakeBatteryChargeStatus, fakeBatteryHealth, fakeBatteryInfo, fakeBatteryInfo2, fakeCpuUsage, fakeMemoryUsage} from 'chrome://diagnostics/fake_data.js';
 import {FakeSystemDataProvider} from 'chrome://diagnostics/fake_system_data_provider.js';
 import {BatteryChargeStatusObserverRemote, BatteryHealthObserverRemote, CpuUsageObserverRemote, DeviceCapabilities, MemoryUsageObserverRemote, SystemInfo, VersionInfo} from 'chrome://diagnostics/system_data_provider.mojom-webui.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/chromeos/diagnostics/fake_system_routine_controller_test.js b/chrome/test/data/webui/chromeos/diagnostics/fake_system_routine_controller_test.js
index e43eb10..c20dd458 100644
--- a/chrome/test/data/webui/chromeos/diagnostics/fake_system_routine_controller_test.js
+++ b/chrome/test/data/webui/chromeos/diagnostics/fake_system_routine_controller_test.js
@@ -4,7 +4,7 @@
 
 import {FakeSystemRoutineController} from 'chrome://diagnostics/fake_system_routine_controller.js';
 import {RoutineRunnerRemote, RoutineType, StandardRoutineResult} from 'chrome://diagnostics/system_routine_controller.mojom-webui.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
index d62ac4f..c20ec72 100644
--- a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
+++ b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
@@ -8,7 +8,7 @@
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {AlwaysOnVpnMode, AlwaysOnVpnProperties, CellularSimState, ConfigProperties, CrosNetworkConfigObserverRemote, DeviceStateProperties, FilterType, GlobalPolicy, InhibitReason, ManagedProperties, NetworkCertificate, NetworkFilter, NetworkStateProperties, NO_LIMIT, StartConnectResult, UInt32Value, VpnProvider} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js
index 1d515ad0..84e5bad 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js
@@ -7,7 +7,7 @@
 import {FeedbackFlowState} from 'chrome://os-feedback/feedback_flow.js';
 import {FeedbackAppPostSubmitAction, SendReportStatus} from 'chrome://os-feedback/feedback_types.js';
 import {setFeedbackServiceProviderForTesting} from 'chrome://os-feedback/mojo_interface_provider.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {eventToPromise, flushTasks, isVisible} from '../../test_util.js';
diff --git a/chrome/test/data/webui/chromeos/print_management/print_management_test.ts b/chrome/test/data/webui/chromeos/print_management/print_management_test.ts
index 9d312b3..e5ad036 100644
--- a/chrome/test/data/webui/chromeos/print_management/print_management_test.ts
+++ b/chrome/test/data/webui/chromeos/print_management/print_management_test.ts
@@ -10,7 +10,7 @@
 import {PrintJobEntryElement} from 'chrome://print-management/print_job_entry.js';
 import {PrintManagementElement} from 'chrome://print-management/print_management.js';
 import {ActivePrintJobInfo, ActivePrintJobState, CompletedPrintJobInfo, PrinterErrorCode, PrintingMetadataProviderInterface, PrintJobCompletionStatus, PrintJobInfo, PrintJobsObserverRemote} from 'chrome://print-management/printing_manager.mojom-webui.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
diff --git a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
index ecf4eca..f651935 100644
--- a/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
+++ b/chrome/test/data/webui/chromeos/scanning/scanning_app_test.js
@@ -6,7 +6,7 @@
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {setScanServiceForTesting} from 'chrome://scanning/mojo_interface_provider.js';
 import {MAX_NUM_SAVED_SCANNERS, ScannerArr, ScannerSetting, ScanSettings, StartMultiPageScanResponse} from 'chrome://scanning/scanning_app_types.js';
 import {getColorModeString, getPageSizeString, tokenToString} from 'chrome://scanning/scanning_app_util.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn b/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn
index 8997ae78..f84acac 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn
@@ -118,7 +118,7 @@
     "//ash/webui/shimless_rma/resources:mojo_interface_provider",
     "//ash/webui/shimless_rma/resources:onboarding_choose_destination_page",
     "//ui/webui/resources/js:assert.m",
-    "//ui/webui/resources/js:promise_resolver.m",
+    "//ui/webui/resources/js:promise_resolver",
   ]
   externs_list = [ "$externs_path/mocha-2.5.js" ]
 }
@@ -172,7 +172,7 @@
     "//ash/webui/shimless_rma/resources:repair_component_chip",
     "//ash/webui/shimless_rma/resources:shimless_rma",
     "//ui/webui/resources/js:assert.m",
-    "//ui/webui/resources/js:promise_resolver.m",
+    "//ui/webui/resources/js:promise_resolver",
   ]
   externs_list = [ "$externs_path/mocha-2.5.js" ]
 }
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/critical_error_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/critical_error_page_test.js
index 93ca62e..d1f7a62 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/critical_error_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/critical_error_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {CriticalErrorPage} from 'chrome://shimless-rma/critical_error_page.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/hardware_error_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/hardware_error_page_test.js
index 0e3f00c..73dc6e6 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/hardware_error_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/hardware_error_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {HardwareErrorPage} from 'chrome://shimless-rma/hardware_error_page.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_destination_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_destination_page_test.js
index d9305b9..d2875e3 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_destination_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_destination_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {OnboardingChooseDestinationPageElement} from 'chrome://shimless-rma/onboarding_choose_destination_page.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_wipe_device_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_wipe_device_page_test.js
index 4821e48..fbeecc6 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_wipe_device_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_wipe_device_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {OnboardingChooseWipeDevicePage} from 'chrome://shimless-rma/onboarding_choose_wipe_device_page.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_wp_disable_method_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_wp_disable_method_page_test.js
index a7664a88..4b0adf6f 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_wp_disable_method_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_choose_wp_disable_method_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {OnboardingChooseWpDisableMethodPage} from 'chrome://shimless-rma/onboarding_choose_wp_disable_method_page.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_enter_rsu_wp_disable_code_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_enter_rsu_wp_disable_code_page_test.js
index 8120cd2..a429fae 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_enter_rsu_wp_disable_code_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_enter_rsu_wp_disable_code_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {fakeRsuChallengeQrCode} from 'chrome://shimless-rma/fake_data.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_landing_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_landing_page_test.js
index 2170d2d..b3a353d 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_landing_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_landing_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {fakeStates} from 'chrome://shimless-rma/fake_data.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_select_components_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_select_components_page_test.js
index 3d66041..2535292 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_select_components_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_select_components_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {fakeComponentsForRepairStateTest} from 'chrome://shimless-rma/fake_data.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_update_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_update_page_test.js
index b902551..2224e4c1 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_update_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_update_page_test.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {OnboardingUpdatePageElement} from 'chrome://shimless-rma/onboarding_update_page.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_wait_for_manual_wp_disable_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_wait_for_manual_wp_disable_page_test.js
index 96db8f9..ec38524 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_wait_for_manual_wp_disable_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_wait_for_manual_wp_disable_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {fakeRsuChallengeQrCode} from 'chrome://shimless-rma/fake_data.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_wp_disable_complete_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_wp_disable_complete_page_test.js
index 9c5a222..68977fbd 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_wp_disable_complete_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_wp_disable_complete_page_test.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {OnboardingWpDisableCompletePage} from 'chrome://shimless-rma/onboarding_wp_disable_complete_page.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/reboot_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/reboot_page_test.js
index 5499df93..766da443 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/reboot_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/reboot_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {RebootPage} from 'chrome://shimless-rma/reboot_page.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_failed_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_failed_page_test.js
index e398bc5..f3a0492 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_failed_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_failed_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {fakeCalibrationComponentsWithFails, fakeCalibrationComponentsWithoutFails} from 'chrome://shimless-rma/fake_data.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_run_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_run_page_test.js
index f795dac..117546c 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_run_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_run_page_test.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {ReimagingCalibrationRunPage} from 'chrome://shimless-rma/reimaging_calibration_run_page.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_setup_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_setup_page_test.js
index 77081b2..f5a2376 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_setup_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_calibration_setup_page_test.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {ReimagingCalibrationSetupPage} from 'chrome://shimless-rma/reimaging_calibration_setup_page.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_device_information_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_device_information_page_test.js
index da28e3c..810f8ff 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_device_information_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_device_information_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {fakeDeviceRegions, fakeDeviceSkus, fakeDeviceWhiteLabels} from 'chrome://shimless-rma/fake_data.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_firmware_update_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_firmware_update_page_test.js
index 7561234f..dd5301e0 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_firmware_update_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_firmware_update_page_test.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {UpdateRoFirmwarePage} from 'chrome://shimless-rma/reimaging_firmware_update_page.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_provisioning_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_provisioning_page_test.js
index 4730a58..4db27a1 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/reimaging_provisioning_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/reimaging_provisioning_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {ReimagingProvisioningPage} from 'chrome://shimless-rma/reimaging_provisioning_page.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js
index 0b4f6ba2..5823453 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {fakeCalibrationComponentsWithFails, fakeChromeVersion, fakeStates} from 'chrome://shimless-rma/fake_data.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_finalize_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_finalize_page_test.js
index 4e7e25c..871638e 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_finalize_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_finalize_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {ShimlessRma} from 'chrome://shimless-rma/shimless_rma.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js
index 4e1a3c7..7a63fdc 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {ShimlessRma} from 'chrome://shimless-rma/shimless_rma.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_restock_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_restock_page_test.js
index 3ede95d..c3ea2398 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_restock_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_restock_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {ShimlessRma} from 'chrome://shimless-rma/shimless_rma.js';
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_wait_for_manual_wp_enable_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_wait_for_manual_wp_enable_page_test.js
index 8490b455..33c1a44 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_wait_for_manual_wp_enable_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_wait_for_manual_wp_enable_page_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
 import {ShimlessRma} from 'chrome://shimless-rma/shimless_rma.js';
diff --git a/chrome/test/data/webui/cr_elements/find_shortcut_behavior_test.ts b/chrome/test/data/webui/cr_elements/find_shortcut_behavior_test.ts
index a9cb811..5e92d7fda 100644
--- a/chrome/test/data/webui/cr_elements/find_shortcut_behavior_test.ts
+++ b/chrome/test/data/webui/cr_elements/find_shortcut_behavior_test.ts
@@ -8,7 +8,7 @@
 import {FindShortcutBehavior, FindShortcutManager} from 'chrome://resources/cr_elements/find_shortcut_behavior.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {isMac} from 'chrome://resources/js/cr.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {pressAndReleaseKeyOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertThrows, assertTrue} from 'chrome://webui-test/chai_assert.js';
diff --git a/chrome/test/data/webui/cr_elements/find_shortcut_mixin_test.ts b/chrome/test/data/webui/cr_elements/find_shortcut_mixin_test.ts
index 22913f8..ee926a4 100644
--- a/chrome/test/data/webui/cr_elements/find_shortcut_mixin_test.ts
+++ b/chrome/test/data/webui/cr_elements/find_shortcut_mixin_test.ts
@@ -8,7 +8,7 @@
 import {FindShortcutManager, FindShortcutMixin} from 'chrome://resources/cr_elements/find_shortcut_mixin.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {isMac} from 'chrome://resources/js/cr.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {pressAndReleaseKeyOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertThrows, assertTrue} from 'chrome://webui-test/chai_assert.js';
diff --git a/chrome/test/data/webui/extensions/error_page_test.ts b/chrome/test/data/webui/extensions/error_page_test.ts
index b89f4250..b53e9b2 100644
--- a/chrome/test/data/webui/extensions/error_page_test.ts
+++ b/chrome/test/data/webui/extensions/error_page_test.ts
@@ -7,7 +7,7 @@
 
 import {ErrorPageDelegate, ExtensionsErrorPageElement} from 'chrome://extensions/extensions.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
diff --git a/chrome/test/data/webui/extensions/pack_dialog_test.ts b/chrome/test/data/webui/extensions/pack_dialog_test.ts
index b5c7b28..2bafa3ec 100644
--- a/chrome/test/data/webui/extensions/pack_dialog_test.ts
+++ b/chrome/test/data/webui/extensions/pack_dialog_test.ts
@@ -8,7 +8,7 @@
 
 import {ExtensionsPackDialogAlertElement, ExtensionsPackDialogElement, PackDialogDelegate} from 'chrome://extensions/extensions.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {eventToPromise, flushTasks} from 'chrome://webui-test/test_util.js';
diff --git a/chrome/test/data/webui/history/test_browser_service.ts b/chrome/test/data/webui/history/test_browser_service.ts
index 9f54938..331d555 100644
--- a/chrome/test/data/webui/history/test_browser_service.ts
+++ b/chrome/test/data/webui/history/test_browser_service.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {BrowserService, ForeignSession, QueryResult, RemoveVisitsRequest} from 'chrome://history/history.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
diff --git a/chrome/test/data/webui/js/cr_test.ts b/chrome/test/data/webui/js/cr_test.ts
index 7f42d83..e210382 100644
--- a/chrome/test/data/webui/js/cr_test.ts
+++ b/chrome/test/data/webui/js/cr_test.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {addSingletonGetter, addWebUIListener, removeWebUIListener, sendWithPromise, WebUIListener, webUIListenerCallback, webUIResponse} from 'chrome://resources/js/cr.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {assertEquals, assertFalse, assertNotEquals, assertNotReached, assertTrue} from 'chrome://webui-test/chai_assert.js';
 
 /** Name of the chrome.send() message to be used in tests. */
diff --git a/chrome/test/data/webui/js/promise_resolver_test.ts b/chrome/test/data/webui/js/promise_resolver_test.ts
index e7f7966..ebe56ad 100644
--- a/chrome/test/data/webui/js/promise_resolver_test.ts
+++ b/chrome/test/data/webui/js/promise_resolver_test.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {assertFalse, assertThrows, assertTrue} from 'chrome://webui-test/chai_assert.js';
 
 suite('PromiseResolverModuleTest', function() {
diff --git a/chrome/test/data/webui/media_router/cast_feedback_ui_test.ts b/chrome/test/data/webui/media_router/cast_feedback_ui_test.ts
index 7498fde..6edbe2bd 100644
--- a/chrome/test/data/webui/media_router/cast_feedback_ui_test.ts
+++ b/chrome/test/data/webui/media_router/cast_feedback_ui_test.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {FeedbackEvent, FeedbackUiBrowserProxy, FeedbackUiBrowserProxyImpl, FeedbackUiElement} from 'chrome://cast-feedback/cast_feedback_ui.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
diff --git a/chrome/test/data/webui/net_internals/task_queue.js b/chrome/test/data/webui/net_internals/task_queue.js
index 8ebcc97..e5fd104e 100644
--- a/chrome/test/data/webui/net_internals/task_queue.js
+++ b/chrome/test/data/webui/net_internals/task_queue.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {assertEquals, assertFalse, assertNotReached, assertTrue} from '../chai_assert.js';
 
diff --git a/chrome/test/data/webui/new_tab_page/app_test.ts b/chrome/test/data/webui/new_tab_page/app_test.ts
index 5e97115..8531b62 100644
--- a/chrome/test/data/webui/new_tab_page/app_test.ts
+++ b/chrome/test/data/webui/new_tab_page/app_test.ts
@@ -10,7 +10,7 @@
 import {Command, CommandHandlerRemote} from 'chrome://resources/js/browser_command/browser_command.mojom-webui.js';
 import {isMac} from 'chrome://resources/js/cr.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 import {eventToPromise, flushTasks} from 'chrome://webui-test/test_util.js';
diff --git a/chrome/test/data/webui/new_tab_page/logo_test.ts b/chrome/test/data/webui/new_tab_page/logo_test.ts
index 052c31d..6b4bd50 100644
--- a/chrome/test/data/webui/new_tab_page/logo_test.ts
+++ b/chrome/test/data/webui/new_tab_page/logo_test.ts
@@ -7,7 +7,7 @@
 import {$$, IframeElement, LogoElement, NewTabPageProxy, WindowProxy} from 'chrome://new-tab-page/new_tab_page.js';
 import {Doodle, DoodleImageType, DoodleShareChannel, PageCallbackRouter, PageHandlerRemote} from 'chrome://new-tab-page/new_tab_page.mojom-webui.js';
 import {hexColorToSkColor, skColorToRgba} from 'chrome://resources/js/color_utils.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertGE, assertLE, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 import {eventToPromise, flushTasks} from 'chrome://webui-test/test_util.js';
diff --git a/chrome/test/data/webui/new_tab_page/modules/module_registry_test.ts b/chrome/test/data/webui/new_tab_page/modules/module_registry_test.ts
index 119a699..19eb326 100644
--- a/chrome/test/data/webui/new_tab_page/modules/module_registry_test.ts
+++ b/chrome/test/data/webui/new_tab_page/modules/module_registry_test.ts
@@ -8,7 +8,7 @@
 import {NewTabPageProxy, WindowProxy} from 'chrome://new-tab-page/new_tab_page.js';
 import {PageCallbackRouter, PageHandlerRemote, PageRemote} from 'chrome://new-tab-page/new_tab_page.mojom-webui.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {assertDeepEquals, assertEquals} from 'chrome://webui-test/chai_assert.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
diff --git a/chrome/test/data/webui/print_preview/native_layer_cros_stub.ts b/chrome/test/data/webui/print_preview/native_layer_cros_stub.ts
index 6b90cbbe..2aae98b 100644
--- a/chrome/test/data/webui/print_preview/native_layer_cros_stub.ts
+++ b/chrome/test/data/webui/print_preview/native_layer_cros_stub.ts
@@ -4,7 +4,7 @@
 
 import {NativeLayerCros, NativeLayerCrosImpl, PrinterSetupResponse, PrinterStatus, PrinterStatusReason, PrinterStatusSeverity, PrintServersConfig} from 'chrome://print/print_preview.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
 export function setNativeLayerCrosInstance(): NativeLayerCrosStub {
diff --git a/chrome/test/data/webui/print_preview/native_layer_stub.ts b/chrome/test/data/webui/print_preview/native_layer_stub.ts
index 9386f81..e4f9ea8 100644
--- a/chrome/test/data/webui/print_preview/native_layer_stub.ts
+++ b/chrome/test/data/webui/print_preview/native_layer_stub.ts
@@ -5,7 +5,7 @@
 import {CapabilitiesResponse, ExtensionDestinationInfo, GooglePromotedDestinationId, LocalDestinationInfo, NativeInitialSettings, NativeLayer, PageLayoutInfo, PrinterType} from 'chrome://print/print_preview.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
 import {getCddTemplate, getPdfPrinter} from './print_preview_test_utils.js';
diff --git a/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js
index 1f1f951..944c809 100644
--- a/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js
@@ -4,7 +4,7 @@
 
 import {createBoolPermission, getBoolPermissionValue, isBoolValue, setAppNotificationProviderForTesting} from 'chrome://os-settings/chromeos/os_settings.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/apps_page_test.js b/chrome/test/data/webui/settings/chromeos/apps_page_test.js
index ce4949e..949f7bf0 100644
--- a/chrome/test/data/webui/settings/chromeos/apps_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/apps_page_test.js
@@ -6,7 +6,7 @@
 
 import {AndroidAppsBrowserProxyImpl, createBoolPermission, Router, routes, routesMojomWebui, setAppNotificationProviderForTesting} from 'chrome://os-settings/chromeos/os_settings.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
diff --git a/chrome/test/data/webui/settings/chromeos/fake_system_display.js b/chrome/test/data/webui/settings/chromeos/fake_system_display.js
index cb6f194..9f2b686 100644
--- a/chrome/test/data/webui/settings/chromeos/fake_system_display.js
+++ b/chrome/test/data/webui/settings/chromeos/fake_system_display.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {FakeChromeEvent} from '../../fake_chrome_event.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
index 38cdf1f..00cf244 100644
--- a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
@@ -5,7 +5,7 @@
 import {CrPolicyIndicatorType} from '//resources/cr_elements/policy/cr_policy_indicator_behavior.js';
 import {AboutPageBrowserProxyImpl, BrowserChannel, DeviceNameBrowserProxyImpl, DeviceNameState, LifetimeBrowserProxyImpl, Router, routes, SetDeviceNameResult, UpdateStatus} from 'chrome://os-settings/chromeos/os_settings.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
diff --git a/chrome/test/data/webui/settings/clear_browsing_data_test.ts b/chrome/test/data/webui/settings/clear_browsing_data_test.ts
index 41807ec..eceabf8a 100644
--- a/chrome/test/data/webui/settings/clear_browsing_data_test.ts
+++ b/chrome/test/data/webui/settings/clear_browsing_data_test.ts
@@ -4,7 +4,7 @@
 
 // clang-format off
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import { ClearBrowsingDataBrowserProxyImpl, ClearBrowsingDataResult,InstalledApp, SettingsCheckboxElement, SettingsClearBrowsingDataDialogElement, SettingsHistoryDeletionDialogElement, SettingsPasswordsDeletionDialogElement} from 'chrome://settings/lazy_load.js';
 import {CrButtonElement, loadTimeData, StatusAction, SyncBrowserProxyImpl} from 'chrome://settings/settings.js';
diff --git a/chrome/test/data/webui/settings/languages_page_tests.ts b/chrome/test/data/webui/settings/languages_page_tests.ts
index 7b34890..a3ab7f90 100644
--- a/chrome/test/data/webui/settings/languages_page_tests.ts
+++ b/chrome/test/data/webui/settings/languages_page_tests.ts
@@ -4,7 +4,7 @@
 
 // clang-format off
 import {isChromeOS, isWindows} from 'chrome://resources/js/cr.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {keyDownOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {CrCheckboxElement, kMenuCloseDelay, LanguageHelper, LanguagesBrowserProxyImpl, SettingsAddLanguagesDialogElement, SettingsLanguagesPageElement} from 'chrome://settings/lazy_load.js';
diff --git a/chrome/test/data/webui/settings/security_keys_subpage_test.ts b/chrome/test/data/webui/settings/security_keys_subpage_test.ts
index e87d25895..7d6d5fc 100644
--- a/chrome/test/data/webui/settings/security_keys_subpage_test.ts
+++ b/chrome/test/data/webui/settings/security_keys_subpage_test.ts
@@ -5,7 +5,7 @@
 // clang-format off
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {BioEnrollDialogPage, CredentialManagementDialogPage, CrIconButtonElement, CrInputElement, Ctap2Status, ResetDialogPage, SampleStatus, SecurityKeysBioEnrollProxy, SecurityKeysBioEnrollProxyImpl, SecurityKeysCredentialBrowserProxy, SecurityKeysCredentialBrowserProxyImpl, SecurityKeysPINBrowserProxy, SecurityKeysPINBrowserProxyImpl, SecurityKeysResetBrowserProxy, SecurityKeysResetBrowserProxyImpl, SetPINDialogPage, SettingsSecurityKeysBioEnrollDialogElement, SettingsSecurityKeysCredentialManagementDialogElement, SettingsSecurityKeysResetDialogElement, SettingsSecurityKeysSetPinDialogElement} from 'chrome://settings/lazy_load.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
diff --git a/chrome/test/data/webui/settings/translate_page_tests.ts b/chrome/test/data/webui/settings/translate_page_tests.ts
index eff31c6..0daa7ff 100644
--- a/chrome/test/data/webui/settings/translate_page_tests.ts
+++ b/chrome/test/data/webui/settings/translate_page_tests.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 // clang-format off
-import { PromiseResolver } from 'chrome://resources/js/promise_resolver.m.js';
+import { PromiseResolver } from 'chrome://resources/js/promise_resolver.js';
 import { flush } from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import { LanguageHelper, LanguagesBrowserProxyImpl, SettingsAddLanguagesDialogElement, SettingsTranslatePageElement } from 'chrome://settings/lazy_load.js';
 import { CrSettingsPrefs, loadTimeData } from 'chrome://settings/settings.js';
diff --git a/chrome/test/data/webui/side_panel/read_anything/read_anything_app_test.ts b/chrome/test/data/webui/side_panel/read_anything/read_anything_app_test.ts
index bc1ef05..93c9f3e 100644
--- a/chrome/test/data/webui/side_panel/read_anything/read_anything_app_test.ts
+++ b/chrome/test/data/webui/side_panel/read_anything/read_anything_app_test.ts
@@ -63,8 +63,8 @@
   });
 
   test('updateTheme fontSize', () => {
-    chrome.readAnything.setThemeForTesting('Standard font', 27.0, 0, 0, 0);
-    assertFontSize('27px');
+    chrome.readAnything.setThemeForTesting('Standard font', 1.0, 0, 0, 0);
+    assertFontSize('16px');  // 1em = 16px
   });
 
   test('updateTheme foregroundColor', () => {
@@ -87,7 +87,8 @@
   test('updateTheme letterSpacing', () => {
     chrome.readAnything.setThemeForTesting('f', 1, 0, 0, 3);
     const container = readAnythingApp.shadowRoot!.getElementById('container');
-    assertEquals('0.1px', getComputedStyle(container!).letterSpacing);
+    // very loose letter letter spacing = 0.1em, font size = 1em = 16px
+    assertEquals('1.6px', getComputedStyle(container!).letterSpacing);
   });
 
   test('updateContent paragraph', () => {
diff --git a/chrome/test/data/webui/signin/profile_switch_test.ts b/chrome/test/data/webui/signin/profile_switch_test.ts
index 1e15ec9..78fdeed 100644
--- a/chrome/test/data/webui/signin/profile_switch_test.ts
+++ b/chrome/test/data/webui/signin/profile_switch_test.ts
@@ -7,7 +7,7 @@
 import {ProfileSwitchElement} from 'chrome://profile-picker/lazy_load.js';
 
 import {ManageProfilesBrowserProxyImpl, ProfileState} from 'chrome://profile-picker/profile_picker.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {waitBeforeNextRender} from 'chrome://webui-test/test_util.js';
diff --git a/chrome/test/data/webui/sys_internals/page_drawer_test.js b/chrome/test/data/webui/sys_internals/page_drawer_test.js
index a5db6ff..f5e2445 100644
--- a/chrome/test/data/webui/sys_internals/page_drawer_test.js
+++ b/chrome/test/data/webui/sys_internals/page_drawer_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {$} from 'chrome://resources/js/util.m.js';
 import {closeDrawer, initialize, openDrawer, promiseResolvers} from 'chrome://sys-internals/index.js';
 
diff --git a/chrome/test/data/webui/sys_internals/page_switch_test.js b/chrome/test/data/webui/sys_internals/page_switch_test.js
index 1aa703b..2ef7dc2 100644
--- a/chrome/test/data/webui/sys_internals/page_switch_test.js
+++ b/chrome/test/data/webui/sys_internals/page_switch_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {$} from 'chrome://resources/js/util.m.js';
 import {PAGE_HASH} from 'chrome://sys-internals/constants.js';
 import {handleUpdateData, initialize, isInfoPage, lineChart, promiseResolvers} from 'chrome://sys-internals/index.js';
diff --git a/chrome/test/data/webui/test_browser_proxy.js b/chrome/test/data/webui/test_browser_proxy.js
index 4138a29..9bbe52f 100644
--- a/chrome/test/data/webui/test_browser_proxy.js
+++ b/chrome/test/data/webui/test_browser_proxy.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 /**
  * @typedef {{resolver: !PromiseResolver,
diff --git a/chrome/test/data/webui/test_store.js b/chrome/test/data/webui/test_store.js
index 46f4974..5ccc8cc 100644
--- a/chrome/test/data/webui/test_store.js
+++ b/chrome/test/data/webui/test_store.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {Action, Store} from 'chrome://resources/js/cr/ui/store.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 
 /**
  * This is a generic test store, designed to replace a real Store instance
diff --git a/chrome/test/data/webui/test_store_ts.ts b/chrome/test/data/webui/test_store_ts.ts
index 0915cc5..6c15514 100644
--- a/chrome/test/data/webui/test_store_ts.ts
+++ b/chrome/test/data/webui/test_store_ts.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {Action, Store} from 'chrome://resources/js/cr/ui/store_ts.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {assertTrue} from 'chrome://webui-test/chai_assert.js';
 
 /**
diff --git a/chrome/test/data/webui/usb_internals_test.js b/chrome/test/data/webui/usb_internals_test.js
index 7c29fc00..fa409cb 100644
--- a/chrome/test/data/webui/usb_internals_test.js
+++ b/chrome/test/data/webui/usb_internals_test.js
@@ -4,7 +4,7 @@
 
 import 'chrome://webui-test/mojo_webui_test_support.js';
 
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js';
 import {setSetupFn} from 'chrome://usb-internals/app.js';
 import {UsbControlTransferParams, UsbControlTransferRecipient, UsbControlTransferType, UsbDeviceCallbackRouter, UsbDeviceRemote, UsbOpenDeviceError, UsbTransferStatus} from 'chrome://usb-internals/usb_device.mojom-webui.js';
diff --git a/chrome/test/enterprise/OWNERS b/chrome/test/enterprise/OWNERS
index d59cbef..c24ae1f 100644
--- a/chrome/test/enterprise/OWNERS
+++ b/chrome/test/enterprise/OWNERS
@@ -1,3 +1,4 @@
 # When making changes, also update TestOwners in the GwsQ config:
 # http://google3/chrome/enterprise/gwsq/enterprise-policy-review.gwsq
 jxiang@google.com
+wuwang@chromium.org
diff --git a/chrome/test/enterprise/e2e/.vpython3 b/chrome/test/enterprise/e2e/.vpython3
index d07330f..3e8a5cb 100644
--- a/chrome/test/enterprise/e2e/.vpython3
+++ b/chrome/test/enterprise/e2e/.vpython3
@@ -23,8 +23,8 @@
 
 wheel: <
   name: "infra/celab/celab/windows-amd64"
-  # Source: https://ci.chromium.org/ui/p/celab/builders/ci/Windows/b8812542790914655777
-  version: "WRbKQgmTylFDU2eOdn2p2O3EO1Wm-nDcNFy4b6wjalYC"
+  # Source: https://ci.chromium.org/ui/p/celab/builders/ci/Windows/b8802565225411928929
+  version: "cCgd-5Z3S4B448lws5gGriMXRvCKBvXhzxOlDSn6VlEC"
 >
 
 # googleapiclient
diff --git a/chrome/test/enterprise/e2e/OWNERS b/chrome/test/enterprise/e2e/OWNERS
index d59cbef..fa62b34 100644
--- a/chrome/test/enterprise/e2e/OWNERS
+++ b/chrome/test/enterprise/e2e/OWNERS
@@ -1,3 +1,4 @@
 # When making changes, also update TestOwners in the GwsQ config:
 # http://google3/chrome/enterprise/gwsq/enterprise-policy-review.gwsq
 jxiang@google.com
+wuwang@chromium.org
\ No newline at end of file
diff --git a/chromecast/browser/cast_web_contents_browsertest.cc b/chromecast/browser/cast_web_contents_browsertest.cc
index ef29160a..158ca26 100644
--- a/chromecast/browser/cast_web_contents_browsertest.cc
+++ b/chromecast/browser/cast_web_contents_browsertest.cc
@@ -5,7 +5,6 @@
 #ifndef CHROMECAST_BROWSER_CAST_WEB_CONTENTS_BROWSERTEST_H_
 #define CHROMECAST_BROWSER_CAST_WEB_CONTENTS_BROWSERTEST_H_
 
-#include <algorithm>
 #include <memory>
 #include <string>
 
@@ -15,6 +14,7 @@
 #include "base/containers/flat_set.h"
 #include "base/files/file_util.h"
 #include "base/path_service.h"
+#include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_piece.h"
@@ -473,11 +473,9 @@
   ASSERT_TRUE(ExecJs(web_contents_.get(), script));
 
   ASSERT_EQ(2, (int)render_frames_.size());
-  auto it = std::find_if(render_frames_.begin(), render_frames_.end(),
-                         [this](content::RenderFrameHost* frame) {
-                           return frame->GetParent() ==
-                                  web_contents_->GetPrimaryMainFrame();
-                         });
+  auto it =
+      base::ranges::find(render_frames_, web_contents_->GetPrimaryMainFrame(),
+                         &content::RenderFrameHost::GetParent);
   ASSERT_NE(render_frames_.end(), it);
   content::RenderFrameHost* sub_frame = *it;
   ASSERT_NE(nullptr, sub_frame);
diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc
index d7d9a4f..d2b5c1c 100644
--- a/chromecast/browser/cast_web_contents_impl.cc
+++ b/chromecast/browser/cast_web_contents_impl.cc
@@ -10,6 +10,7 @@
 #include "base/callback_helpers.h"
 #include "base/logging.h"
 #include "base/no_destructor.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
@@ -63,8 +64,7 @@
 // Remove the given CastWebContents pointer from the global instance vector.
 void RemoveCastWebContents(CastWebContents* instance) {
   auto& all_cast_web_contents = CastWebContents::GetAll();
-  auto it = std::find(all_cast_web_contents.begin(),
-                      all_cast_web_contents.end(), instance);
+  auto it = base::ranges::find(all_cast_web_contents, instance);
   if (it != all_cast_web_contents.end()) {
     all_cast_web_contents.erase(it);
   }
@@ -93,11 +93,8 @@
 CastWebContents* CastWebContents::FromWebContents(
     content::WebContents* web_contents) {
   auto& all_cast_web_contents = CastWebContents::GetAll();
-  auto it =
-      std::find_if(all_cast_web_contents.begin(), all_cast_web_contents.end(),
-                   [&web_contents](const auto* cast_web_contents) {
-                     return cast_web_contents->web_contents() == web_contents;
-                   });
+  auto it = base::ranges::find(all_cast_web_contents, web_contents,
+                               &CastWebContents::web_contents);
   if (it == all_cast_web_contents.end()) {
     return nullptr;
   }
diff --git a/chromecast/browser/cast_web_view_default.cc b/chromecast/browser/cast_web_view_default.cc
index 1cf3de0..21d759c 100644
--- a/chromecast/browser/cast_web_view_default.cc
+++ b/chromecast/browser/cast_web_view_default.cc
@@ -8,6 +8,7 @@
 
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -219,11 +220,8 @@
     const blink::MediaStreamDevices& devices,
     const std::string& requested_device_id) {
   if (!requested_device_id.empty()) {
-    auto it = std::find_if(
-        devices.begin(), devices.end(),
-        [requested_device_id](const blink::MediaStreamDevice& device) {
-          return device.id == requested_device_id;
-        });
+    auto it = base::ranges::find(devices, requested_device_id,
+                                 &blink::MediaStreamDevice::id);
     return it != devices.end() ? &(*it) : nullptr;
   }
 
diff --git a/chromecast/cast_core/runtime/browser/streaming_receiver_session_client.cc b/chromecast/cast_core/runtime/browser/streaming_receiver_session_client.cc
index d0c3dce..53adbe27 100644
--- a/chromecast/cast_core/runtime/browser/streaming_receiver_session_client.cc
+++ b/chromecast/cast_core/runtime/browser/streaming_receiver_session_client.cc
@@ -6,7 +6,9 @@
 
 #include <utility>
 
+#include "base/containers/contains.h"
 #include "base/logging.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
 #include "base/task/sequenced_task_runner.h"
 #include "chromecast/cast_core/runtime/browser/streaming_controller_base.h"
@@ -111,8 +113,7 @@
         continue;
       }
 
-      if (std::find(audio_codecs.begin(), audio_codecs.end(),
-                    converted_codec) == audio_codecs.end()) {
+      if (!base::Contains(audio_codecs, converted_codec)) {
         audio_codecs.push_back(converted_codec);
 
         audio_limits.emplace_back();
@@ -123,12 +124,9 @@
         continue;
       }
 
-      auto it = std::find_if(
-          audio_limits.begin(), audio_limits.end(),
-          [converted_codec](
-              const openscreen::cast::ReceiverSession::AudioLimits& limit) {
-            return limit.codec == converted_codec;
-          });
+      auto it = base::ranges::find(
+          audio_limits, converted_codec,
+          &openscreen::cast::ReceiverSession::AudioLimits::codec);
       DCHECK(it != audio_limits.end());
       it->max_sample_rate =
           std::max(it->max_sample_rate, info.max_samples_per_second);
@@ -157,8 +155,7 @@
     for (auto& info : *video_codec_infos) {
       const auto converted_codec = ToOpenscreenCodec(info.codec);
       if (converted_codec != openscreen::cast::VideoCodec::kNotSpecified &&
-          std::find(video_codecs.begin(), video_codecs.end(),
-                    converted_codec) == video_codecs.end()) {
+          !base::Contains(video_codecs, converted_codec)) {
         video_codecs.push_back(converted_codec);
       }
     }
diff --git a/chromeos/ash/components/dbus/audio/fake_cras_audio_client.cc b/chromeos/ash/components/dbus/audio/fake_cras_audio_client.cc
index 9212457..1e24a63 100644
--- a/chromeos/ash/components/dbus/audio/fake_cras_audio_client.cc
+++ b/chromeos/ash/components/dbus/audio/fake_cras_audio_client.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/logging.h"
+#include "base/ranges/algorithm.h"
 
 namespace ash {
 
@@ -376,9 +377,7 @@
 }
 
 AudioNodeList::iterator FakeCrasAudioClient::FindNode(uint64_t node_id) {
-  return std::find_if(
-      node_list_.begin(), node_list_.end(),
-      [node_id](const AudioNode& node) { return node_id == node.id; });
+  return base::ranges::find(node_list_, node_id, &AudioNode::id);
 }
 
 }  // namespace ash
diff --git a/chromeos/ash/components/drivefs/fake_drivefs.cc b/chromeos/ash/components/drivefs/fake_drivefs.cc
index e3273b9..63a15d0 100644
--- a/chromeos/ash/components/drivefs/fake_drivefs.cc
+++ b/chromeos/ash/components/drivefs/fake_drivefs.cc
@@ -4,7 +4,6 @@
 
 #include "chromeos/ash/components/drivefs/fake_drivefs.h"
 
-#include <algorithm>
 #include <tuple>
 #include <utility>
 #include <vector>
@@ -17,6 +16,7 @@
 #include "base/files/file_util.h"
 #include "base/no_destructor.h"
 #include "base/numerics/safe_conversions.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
 #include "base/task/thread_pool.h"
@@ -200,12 +200,11 @@
           if (content_mime_type.empty()) {
             return true;
           }
-          const auto find_mime_type_iter = std::find_if(
-              mime_types.begin(), mime_types.end(),
-              [content_mime_type](const std::string& mime_type) {
-                return net::MatchesMimeType(mime_type, content_mime_type);
-              });
-          if (find_mime_type_iter == mime_types.end()) {
+          if (base::ranges::none_of(
+                  mime_types,
+                  [content_mime_type](const std::string& mime_type) {
+                    return net::MatchesMimeType(mime_type, content_mime_type);
+                  })) {
             return true;
           }
         }
@@ -557,8 +556,7 @@
     syncing_paths_.push_back(path);
   } else {
     // status == drivefs::mojom::MirrorPathStatus::kStop.
-    auto element =
-        std::find(syncing_paths_.begin(), syncing_paths_.end(), path);
+    auto element = base::ranges::find(syncing_paths_, path);
     syncing_paths_.erase(element);
   }
   std::move(callback).Run(drive::FileError::FILE_ERROR_OK);
diff --git a/chromeos/ash/components/geolocation/simple_geolocation_provider.cc b/chromeos/ash/components/geolocation/simple_geolocation_provider.cc
index f8c5382..5001fff 100644
--- a/chromeos/ash/components/geolocation/simple_geolocation_provider.cc
+++ b/chromeos/ash/components/geolocation/simple_geolocation_provider.cc
@@ -4,12 +4,12 @@
 
 #include "chromeos/ash/components/geolocation/simple_geolocation_provider.h"
 
-#include <algorithm>
 #include <iterator>
 #include <memory>
 
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
+#include "base/ranges/algorithm.h"
 #include "chromeos/ash/components/geolocation/geoposition.h"
 #include "chromeos/ash/components/network/geolocation_handler.h"
 #include "chromeos/ash/components/network/network_handler.h"
@@ -89,11 +89,8 @@
   std::move(callback).Run(geoposition, server_error, elapsed);
 
   std::vector<std::unique_ptr<SimpleGeolocationRequest>>::iterator position =
-      std::find_if(
-          requests_.begin(), requests_.end(),
-          [request](const std::unique_ptr<SimpleGeolocationRequest>& req) {
-            return req.get() == request;
-          });
+      base::ranges::find(requests_, request,
+                         &std::unique_ptr<SimpleGeolocationRequest>::get);
   DCHECK(position != requests_.end());
   if (position != requests_.end()) {
     std::swap(*position, *requests_.rbegin());
diff --git a/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc b/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc
index d32d3b42..d2f8217 100644
--- a/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc
+++ b/chromeos/ash/components/network/cellular_esim_profile_handler_impl.cc
@@ -10,6 +10,7 @@
 #include "ash/constants/ash_pref_names.h"
 #include "base/callback_helpers.h"
 #include "base/containers/contains.h"
+#include "base/ranges/algorithm.h"
 #include "base/values.h"
 #include "chromeos/ash/components/dbus/hermes/hermes_euicc_client.h"
 #include "chromeos/ash/components/network/cellular_utils.h"
@@ -31,15 +32,6 @@
   return paths;
 }
 
-bool ContainsProfileWithoutIccid(
-    const std::vector<CellularESimProfile>& profiles) {
-  auto iter = std::find_if(profiles.begin(), profiles.end(),
-                           [](const CellularESimProfile& profile) {
-                             return profile.iccid().empty();
-                           });
-  return iter != profiles.end();
-}
-
 }  // namespace
 
 // static
@@ -257,7 +249,8 @@
   // yet. This is required because property updates to eSIM profile objects
   // occur after the profile list has been updated. This state is temporary.
   // This method will be triggered again when ICCID properties are updated.
-  if (ContainsProfileWithoutIccid(profiles_from_hermes)) {
+  if (base::ranges::any_of(profiles_from_hermes, &std::string::empty,
+                           &CellularESimProfile::iccid)) {
     return;
   }
 
diff --git a/chromeos/ash/components/network/client_cert_resolver.cc b/chromeos/ash/components/network/client_cert_resolver.cc
index 5fedb9bd..c13f5156 100644
--- a/chromeos/ash/components/network/client_cert_resolver.cc
+++ b/chromeos/ash/components/network/client_cert_resolver.cc
@@ -8,7 +8,6 @@
 #include <certt.h>  // for (SECCertUsageEnum) certUsageAnyCA
 #include <pk11pub.h>
 
-#include <algorithm>
 #include <memory>
 #include <utility>
 
@@ -18,6 +17,7 @@
 #include "base/containers/flat_set.h"
 #include "base/location.h"
 #include "base/logging.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/thread_pool.h"
@@ -397,8 +397,8 @@
                 ::onc::ONC_SOURCE_DEVICE_POLICY
             ? &device_wide_client_cert_and_issuers
             : &all_client_cert_and_issuers;
-    auto cert_it = std::find_if(
-        client_certs->begin(), client_certs->end(),
+    auto cert_it = base::ranges::find_if(
+        *client_certs,
         MatchCertWithCertConfig(network_and_cert_config.cert_config));
     if (cert_it == client_certs->end()) {
       VLOG(1) << "Couldn't find a matching client cert for network "
@@ -506,9 +506,8 @@
 
   // Search for a certificate matching the pattern, reference or
   // ProvisioningProfileId.
-  std::vector<CertAndIssuer>::iterator cert_it = std::find_if(
-      client_cert_and_issuers.begin(), client_cert_and_issuers.end(),
-      MatchCertWithCertConfig(client_cert_config));
+  std::vector<CertAndIssuer>::iterator cert_it = base::ranges::find_if(
+      client_cert_and_issuers, MatchCertWithCertConfig(client_cert_config));
 
   if (cert_it == client_cert_and_issuers.end()) {
     VLOG(1) << "Couldn't find a matching client cert";
diff --git a/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc b/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc
index b0929d7..3e3c8fb7 100644
--- a/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc
+++ b/chromeos/ash/components/network/fake_stub_cellular_networks_provider.cc
@@ -4,10 +4,9 @@
 
 #include "chromeos/ash/components/network/fake_stub_cellular_networks_provider.h"
 
-#include <algorithm>
-
 #include "base/containers/contains.h"
 #include "base/guid.h"
+#include "base/ranges/algorithm.h"
 #include "chromeos/ash/components/network/cellular_utils.h"
 
 namespace ash {
@@ -61,26 +60,21 @@
     }
 
     std::string iccid = network->iccid();
-    const auto stub_it = std::find_if(
-        stub_iccid_and_eid_pairs_.begin(), stub_iccid_and_eid_pairs_.end(),
-        [&iccid](const IccidEidPair& pair) { return pair.first == iccid; });
 
     // Stub network which corresponds to a removed stub ICCID; remove.
-    if (stub_it == stub_iccid_and_eid_pairs_.end()) {
+    if (!base::Contains(stub_iccid_and_eid_pairs_, iccid,
+                        &IccidEidPair::first)) {
       changed = true;
       network_list_it = network_list.erase(network_list_it);
       continue;
     }
 
-    const auto shill_state_it =
-        std::find_if(network_list.begin(), network_list.end(),
-                     [&iccid](const std::unique_ptr<ManagedState>& state) {
-                       const NetworkState* network = state->AsNetworkState();
-                       return !network->IsNonShillCellularNetwork() &&
-                              network->iccid() == iccid;
-                     });
-
-    if (shill_state_it == network_list.end()) {
+    if (base::ranges::none_of(
+            network_list, [&iccid](const std::unique_ptr<ManagedState>& state) {
+              const NetworkState* network = state->AsNetworkState();
+              return !network->IsNonShillCellularNetwork() &&
+                     network->iccid() == iccid;
+            })) {
       ++network_list_it;
       continue;
     }
@@ -98,10 +92,7 @@
     const DeviceState* cellular_device,
     std::string* service_path_out,
     std::string* guid_out) {
-  const auto it = std::find_if(
-      stub_iccid_and_eid_pairs_.begin(), stub_iccid_and_eid_pairs_.end(),
-      [&iccid](const IccidEidPair& pair) { return pair.first == iccid; });
-  if (it == stub_iccid_and_eid_pairs_.end())
+  if (!base::Contains(stub_iccid_and_eid_pairs_, iccid, &IccidEidPair::first))
     return false;
 
   *service_path_out = GenerateStubCellularServicePath(iccid);
@@ -126,16 +117,14 @@
   std::vector<IccidEidPair> not_backed_by_shill;
 
   for (const IccidEidPair& pair : stub_iccid_and_eid_pairs_) {
-    const auto shill_state_it =
-        std::find_if(network_list.begin(), network_list.end(),
-                     [&pair](const std::unique_ptr<ManagedState>& state) {
-                       return state->AsNetworkState()->iccid() == pair.first;
-                     });
-
     // Only need to add a stub network if the stub ICCID does not match the
     // ICCID of a Shill-backed network.
-    if (shill_state_it == network_list.end())
+    if (!base::Contains(network_list, pair.first,
+                        [](const std::unique_ptr<ManagedState>& state) {
+                          return state->AsNetworkState()->iccid();
+                        })) {
       not_backed_by_shill.push_back(pair);
+    }
   }
 
   return not_backed_by_shill;
diff --git a/chromeos/ash/components/network/network_connection_handler_impl.cc b/chromeos/ash/components/network/network_connection_handler_impl.cc
index 460d39c..5d44d405 100644
--- a/chromeos/ash/components/network/network_connection_handler_impl.cc
+++ b/chromeos/ash/components/network/network_connection_handler_impl.cc
@@ -13,6 +13,7 @@
 #include "base/json/json_reader.h"
 #include "base/location.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -561,15 +562,14 @@
 }
 
 bool NetworkConnectionHandlerImpl::HasPendingCellularRequest() const {
-  auto iter = std::find_if(
-      pending_requests_.begin(), pending_requests_.end(),
+  return base::ranges::any_of(
+      pending_requests_,
       [&](const std::pair<const std::string, std::unique_ptr<ConnectRequest>>&
               pair) {
         const NetworkState* network =
             network_state_handler_->GetNetworkState(pair.first);
         return network && network->Matches(NetworkTypePattern::Cellular());
       });
-  return iter != pending_requests_.end();
 }
 
 void NetworkConnectionHandlerImpl::OnPrepareCellularNetworkForConnectionFailure(
diff --git a/chromeos/ash/components/network/network_profile_handler.cc b/chromeos/ash/components/network/network_profile_handler.cc
index ab02690..0bcf128a 100644
--- a/chromeos/ash/components/network/network_profile_handler.cc
+++ b/chromeos/ash/components/network/network_profile_handler.cc
@@ -6,12 +6,12 @@
 
 #include <stddef.h>
 
-#include <algorithm>
-
 #include "base/bind.h"
 #include "base/callback_helpers.h"
+#include "base/containers/contains.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
 #include "base/values.h"
 #include "chromeos/ash/components/dbus/shill/shill_manager_client.h"
@@ -53,20 +53,6 @@
              << " dbus-error-msg=" << dbus_error_message;
 }
 
-class ProfilePathEquals {
- public:
-  explicit ProfilePathEquals(const std::string& path)
-      : path_(path) {
-  }
-
-  bool operator()(const NetworkProfile& profile) {
-    return profile.path == path_;
-  }
-
- private:
-  std::string path_;
-};
-
 }  // namespace
 
 // static
@@ -119,9 +105,7 @@
   std::vector<std::string> removed_profile_paths;
   for (ProfileList::const_iterator it = profiles_.begin();
        it != profiles_.end(); ++it) {
-    if (std::find(new_profile_paths.begin(),
-                  new_profile_paths.end(),
-                  it->path) == new_profile_paths.end()) {
+    if (!base::Contains(new_profile_paths, it->path)) {
       removed_profile_paths.push_back(it->path);
     }
   }
@@ -174,8 +158,8 @@
 
 void NetworkProfileHandler::RemoveProfile(const std::string& profile_path) {
   VLOG(2) << "Removing profile for path " << profile_path << ".";
-  ProfileList::iterator found = std::find_if(profiles_.begin(), profiles_.end(),
-                                             ProfilePathEquals(profile_path));
+  ProfileList::iterator found =
+      base::ranges::find(profiles_, profile_path, &NetworkProfile::path);
   if (found == profiles_.end())
     return;
   NetworkProfile profile = *found;
@@ -187,8 +171,7 @@
 const NetworkProfile* NetworkProfileHandler::GetProfileForPath(
     const std::string& profile_path) const {
   ProfileList::const_iterator found =
-      std::find_if(profiles_.begin(), profiles_.end(),
-                   ProfilePathEquals(profile_path));
+      base::ranges::find(profiles_, profile_path, &NetworkProfile::path);
 
   if (found == profiles_.end())
     return NULL;
diff --git a/chromeos/ash/components/network/network_state_handler_unittest.cc b/chromeos/ash/components/network/network_state_handler_unittest.cc
index dd00960..2f825b0 100644
--- a/chromeos/ash/components/network/network_state_handler_unittest.cc
+++ b/chromeos/ash/components/network/network_state_handler_unittest.cc
@@ -6,7 +6,6 @@
 
 #include <stddef.h>
 
-#include <algorithm>
 #include <map>
 #include <memory>
 #include <set>
@@ -16,6 +15,7 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/command_line.h"
+#include "base/containers/contains.h"
 #include "base/logging.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
@@ -89,14 +89,6 @@
   return result;
 }
 
-bool NetworkListContainsPath(const NetworkStateHandler::NetworkStateList& list,
-                             const std::string& path) {
-  return std::find_if(list.begin(), list.end(),
-                      [path](const NetworkState* network) {
-                        return network->path() == path;
-                      }) != list.end();
-}
-
 // Creates a list of cellular SIM slots with a single primary slot whose eid is
 // |eid|.
 base::Value GenerateSimSlotInfosWithEid(const std::string& eid) {
@@ -2687,8 +2679,8 @@
   NetworkStateHandler::NetworkStateList active_networks;
   network_state_handler_->GetActiveNetworkListByType(
       NetworkTypePattern::Default(), &active_networks);
-  EXPECT_FALSE(
-      NetworkListContainsPath(active_networks, kShillManagerClientStubWifi2));
+  EXPECT_FALSE(base::Contains(active_networks, kShillManagerClientStubWifi2,
+                              &NetworkState::path));
 
   // Set |connect_requested_| for wifi2 and verify that it is connecting and
   // in the active list.
@@ -2698,8 +2690,8 @@
   EXPECT_TRUE(wifi2->IsConnectingState());
   network_state_handler_->GetActiveNetworkListByType(
       NetworkTypePattern::Default(), &active_networks);
-  EXPECT_TRUE(
-      NetworkListContainsPath(active_networks, kShillManagerClientStubWifi2));
+  EXPECT_TRUE(base::Contains(active_networks, kShillManagerClientStubWifi2,
+                             &NetworkState::path));
 
   // Clear |connect_requested_| for wifi2 and verify that it is not connecting
   // or in the active list.
@@ -2709,8 +2701,8 @@
   EXPECT_FALSE(wifi2->IsConnectingState());
   network_state_handler_->GetActiveNetworkListByType(
       NetworkTypePattern::Default(), &active_networks);
-  EXPECT_FALSE(
-      NetworkListContainsPath(active_networks, kShillManagerClientStubWifi2));
+  EXPECT_FALSE(base::Contains(active_networks, kShillManagerClientStubWifi2,
+                              &NetworkState::path));
 }
 
 TEST_F(NetworkStateHandlerTest, Hostname) {
diff --git a/chromeos/ash/components/sync_wifi/wifi_configuration_bridge_unittest.cc b/chromeos/ash/components/sync_wifi/wifi_configuration_bridge_unittest.cc
index 36d70ea..df0b47a 100644
--- a/chromeos/ash/components/sync_wifi/wifi_configuration_bridge_unittest.cc
+++ b/chromeos/ash/components/sync_wifi/wifi_configuration_bridge_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/callback_helpers.h"
 #include "base/containers/contains.h"
 #include "base/containers/flat_map.h"
+#include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
@@ -76,15 +77,14 @@
 bool VectorContainsProto(
     const std::vector<sync_pb::WifiConfigurationSpecifics>& protos,
     const sync_pb::WifiConfigurationSpecifics& proto) {
-  return std::find_if(
-             protos.begin(), protos.end(),
-             [&proto](const sync_pb::WifiConfigurationSpecifics& specifics) {
-               return NetworkIdentifier::FromProto(specifics) ==
-                          NetworkIdentifier::FromProto(proto) &&
-                      specifics.last_connected_timestamp() ==
-                          proto.last_connected_timestamp() &&
-                      specifics.passphrase() == proto.passphrase();
-             }) != protos.end();
+  return base::ranges::any_of(
+      protos, [&proto](const sync_pb::WifiConfigurationSpecifics& specifics) {
+        return NetworkIdentifier::FromProto(specifics) ==
+                   NetworkIdentifier::FromProto(proto) &&
+               specifics.last_connected_timestamp() ==
+                   proto.last_connected_timestamp() &&
+               specifics.passphrase() == proto.passphrase();
+      });
 }
 
 void ExtractProtosFromDataBatch(
diff --git a/chromeos/ash/services/bluetooth_config/device_cache_impl_unittest.cc b/chromeos/ash/services/bluetooth_config/device_cache_impl_unittest.cc
index 7d5f5909..51b3c62 100644
--- a/chromeos/ash/services/bluetooth_config/device_cache_impl_unittest.cc
+++ b/chromeos/ash/services/bluetooth_config/device_cache_impl_unittest.cc
@@ -4,10 +4,10 @@
 
 #include "chromeos/ash/services/bluetooth_config/device_cache_impl.h"
 
-#include <algorithm>
 #include <memory>
 #include <vector>
 
+#include "base/ranges/algorithm.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/test/task_environment.h"
@@ -231,10 +231,9 @@
 
   std::vector<NiceMockDevice>::iterator FindDevice(
       const std::string& device_id) {
-    return std::find_if(mock_devices_.begin(), mock_devices_.end(),
-                        [&device_id](const NiceMockDevice& device) {
-                          return device_id == device->GetIdentifier();
-                        });
+    return base::ranges::find(
+        mock_devices_, device_id,
+        &testing::NiceMock<device::MockBluetoothDevice>::GetIdentifier);
   }
 
   base::test::TaskEnvironment task_environment_;
diff --git a/chromeos/ash/services/bluetooth_config/device_pairing_handler_impl_unittest.cc b/chromeos/ash/services/bluetooth_config/device_pairing_handler_impl_unittest.cc
index 045b648..f0c5b8e 100644
--- a/chromeos/ash/services/bluetooth_config/device_pairing_handler_impl_unittest.cc
+++ b/chromeos/ash/services/bluetooth_config/device_pairing_handler_impl_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/ash/services/bluetooth_config/device_pairing_handler_impl.h"
 
+#include "base/ranges/algorithm.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/test/bind.h"
@@ -294,10 +295,9 @@
 
   std::vector<NiceMockDevice>::iterator FindDevice(
       const std::string& device_id) {
-    return std::find_if(mock_devices_.begin(), mock_devices_.end(),
-                        [&device_id](const NiceMockDevice& device) {
-                          return device_id == device->GetIdentifier();
-                        });
+    return base::ranges::find(
+        mock_devices_, device_id,
+        &testing::NiceMock<device::MockBluetoothDevice>::GetIdentifier);
   }
 
   base::test::TaskEnvironment task_environment_;
diff --git a/chromeos/ash/services/bluetooth_config/discovered_devices_provider_impl.cc b/chromeos/ash/services/bluetooth_config/discovered_devices_provider_impl.cc
index 50037a7..bcd0cff 100644
--- a/chromeos/ash/services/bluetooth_config/discovered_devices_provider_impl.cc
+++ b/chromeos/ash/services/bluetooth_config/discovered_devices_provider_impl.cc
@@ -4,7 +4,7 @@
 
 #include "chromeos/ash/services/bluetooth_config/discovered_devices_provider_impl.h"
 
-#include <algorithm>
+#include "base/ranges/algorithm.h"
 
 namespace ash::bluetooth_config {
 
@@ -58,11 +58,8 @@
     unpaired_device_ids.insert(unpaired_device->id);
 
     // Check if |discovered_devices_| contains |unpaired_device_|.
-    const auto it =
-        std::find_if(discovered_devices_.begin(), discovered_devices_.end(),
-                     [&unpaired_device](const auto& discovered_device) {
-                       return discovered_device->id == unpaired_device->id;
-                     });
+    const auto it = base::ranges::find(discovered_devices_, unpaired_device->id,
+                                       &mojom::BluetoothDeviceProperties::id);
     if (it == discovered_devices_.end()) {
       // If it doesn't contain the device, the device was added. Append to end
       // of the list.
diff --git a/chromeos/ash/services/bluetooth_config/discovered_devices_provider_impl_unittest.cc b/chromeos/ash/services/bluetooth_config/discovered_devices_provider_impl_unittest.cc
index 8778181..15c7fb9 100644
--- a/chromeos/ash/services/bluetooth_config/discovered_devices_provider_impl_unittest.cc
+++ b/chromeos/ash/services/bluetooth_config/discovered_devices_provider_impl_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/ash/services/bluetooth_config/discovered_devices_provider_impl.h"
 
+#include "base/ranges/algorithm.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/test/task_environment.h"
@@ -140,10 +141,9 @@
  private:
   std::vector<NiceMockDevice>::iterator FindDevice(
       const std::string& device_id) {
-    return std::find_if(mock_devices_.begin(), mock_devices_.end(),
-                        [&device_id](const NiceMockDevice& device) {
-                          return device_id == device->GetIdentifier();
-                        });
+    return base::ranges::find(
+        mock_devices_, device_id,
+        &testing::NiceMock<device::MockBluetoothDevice>::GetIdentifier);
   }
 
   // Copies the list of devices in |mock_devices_| to device's caches unpaired
diff --git a/chromeos/printing/epson_driver_matching.cc b/chromeos/printing/epson_driver_matching.cc
index 51ac094..07635c9 100644
--- a/chromeos/printing/epson_driver_matching.cc
+++ b/chromeos/printing/epson_driver_matching.cc
@@ -4,8 +4,7 @@
 
 #include "chromeos/printing/epson_driver_matching.h"
 
-#include <algorithm>
-
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
 #include "chromeos/printing/ppd_provider.h"
 
@@ -24,11 +23,9 @@
 
   // Fail if this isn't an Epson printer.
   // Note: Assumes make and model strings are already lowercase.
-  auto it = std::find_if(sd.make_and_model.begin(), sd.make_and_model.end(),
-                         [](base::StringPiece emm) {
-                           return emm.find("epson") != base::StringPiece::npos;
-                         });
-  if (it == sd.make_and_model.end()) {
+  if (base::ranges::none_of(sd.make_and_model, [](base::StringPiece emm) {
+        return emm.find("epson") != base::StringPiece::npos;
+      })) {
     return false;
   }
 
diff --git a/chromeos/printing/uri_impl.cc b/chromeos/printing/uri_impl.cc
index 48025c8..48c9d108 100644
--- a/chromeos/printing/uri_impl.cc
+++ b/chromeos/printing/uri_impl.cc
@@ -72,24 +72,10 @@
   return true;
 }
 
-// Helper struct for the function below.
-class Comparator {
- public:
-  // The string given as a parameter must be valid for the whole lifetime
-  // of this object.
-  explicit Comparator(const std::string& chars) : chars_(chars) {}
-  bool operator()(std::string::value_type element) const {
-    return (chars_.find(element) != std::string::npos);
-  }
-
- private:
-  const std::string& chars_;
-};
-
 // Returns iterator to the first occurrence of any character from |chars|
 // in |begin|-|end|. Returns |end| if none of the characters were found.
 Iter FindFirstOf(Iter begin, Iter end, const std::string& chars) {
-  return std::find_if(begin, end, Comparator(chars));
+  return std::find_first_of(begin, end, chars.begin(), chars.end());
 }
 
 }  // namespace
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc
index c3d2fa3..e77e78c 100644
--- a/chromeos/services/network_config/cros_network_config.cc
+++ b/chromeos/services/network_config/cros_network_config.cc
@@ -12,6 +12,7 @@
 #include "base/containers/flat_map.h"
 #include "base/guid.h"
 #include "base/i18n/time_formatting.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -485,11 +486,8 @@
   NetworkStateHandler::NetworkStateList cellular_networks;
   network_state_handler->GetVisibleNetworkListByType(
       NetworkTypePattern::Cellular(), &cellular_networks);
-  auto iter = std::find_if(cellular_networks.begin(), cellular_networks.end(),
-                           [](const NetworkState* network_state) {
-                             return network_state->IsConnectingState();
-                           });
-  return iter != cellular_networks.end();
+  return base::ranges::any_of(cellular_networks,
+                              &NetworkState::IsConnectingState);
 }
 
 mojom::InhibitReason GetInhibitReason(
diff --git a/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc
index 898aa25..25f1e0ef 100644
--- a/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc
+++ b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc
@@ -127,7 +127,8 @@
       case views::CAPTION_BUTTON_ICON_MINIMIZE:
         return frame_->widget_delegate()->CanMinimize();
       case views::CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE:
-        return frame_->widget_delegate()->CanMaximize();
+        return !chromeos::TabletState::Get()->InTabletMode() &&
+               frame_->widget_delegate()->CanMaximize();
       // Resizable widget can be snapped.
       case views::CAPTION_BUTTON_ICON_LEFT_TOP_SNAPPED:
       case views::CAPTION_BUTTON_ICON_RIGHT_BOTTOM_SNAPPED:
@@ -186,16 +187,6 @@
   if (custom_button)
     custom_button_ = AddChildView(std::move(custom_button));
 
-  if (chromeos::wm::features::IsFloatWindowEnabled()) {
-    float_button_ = AddChildView(std::make_unique<views::FrameCaptionButton>(
-        base::BindRepeating(
-            &FrameCaptionButtonContainerView::FloatButtonPressed,
-            base::Unretained(this)),
-        views::CAPTION_BUTTON_ICON_FLOAT, HTMENU));
-    float_button_->SetTooltipText(
-        l10n_util::GetStringUTF16(IDS_APP_ACCNAME_FLOAT));
-  }
-
   menu_button_ = new views::FrameCaptionButton(
       base::BindRepeating(&FrameCaptionButtonContainerView::MenuButtonPressed,
                           base::Unretained(this)),
@@ -212,6 +203,16 @@
       l10n_util::GetStringUTF16(IDS_APP_ACCNAME_MINIMIZE));
   AddChildView(minimize_button_.get());
 
+  if (chromeos::wm::features::IsFloatWindowEnabled()) {
+    float_button_ = AddChildView(std::make_unique<views::FrameCaptionButton>(
+        base::BindRepeating(
+            &FrameCaptionButtonContainerView::FloatButtonPressed,
+            base::Unretained(this)),
+        views::CAPTION_BUTTON_ICON_FLOAT, HTMENU));
+    float_button_->SetTooltipText(
+        l10n_util::GetStringUTF16(IDS_APP_ACCNAME_FLOAT));
+  }
+
   size_button_ = new FrameSizeButton(
       base::BindRepeating(&FrameCaptionButtonContainerView::SizeButtonPressed,
                           base::Unretained(this)),
diff --git a/chromeos/ui/frame/caption_buttons/frame_size_button.cc b/chromeos/ui/frame/caption_buttons/frame_size_button.cc
index 02548e6..dac807f4 100644
--- a/chromeos/ui/frame/caption_buttons/frame_size_button.cc
+++ b/chromeos/ui/frame/caption_buttons/frame_size_button.cc
@@ -229,6 +229,7 @@
   // Show Multitask Menu if float is enabled. Note here float flag is also used
   // to represent other relatable UI/UX changes.
   if (chromeos::wm::features::IsFloatWindowEnabled()) {
+    DCHECK(!chromeos::TabletState::Get()->InTabletMode());
     // Owned by the bubble which contains this view. If there is an existing
     // bubble, it will be deactivated and then close and destroy itself.
     auto* multitask_menu = new MultitaskMenu(/*anchor=*/this, GetWidget());
@@ -392,6 +393,7 @@
 
 void FrameSizeButton::SetButtonsToSnapMode(
     FrameSizeButtonDelegate::Animate animate) {
+  DCHECK(!chromeos::TabletState::Get()->InTabletMode());
   in_snap_mode_ = true;
 
   // When using a right-to-left layout the close button is left of the size
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index a4ac209a..0d34f03c 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -439,6 +439,8 @@
     "webdata/autofill_webdata_service.cc",
     "webdata/autofill_webdata_service.h",
     "webdata/autofill_webdata_service_observer.h",
+    "webdata/contact_info_sync_bridge.cc",
+    "webdata/contact_info_sync_bridge.h",
     "webdata/system_encryptor.cc",
     "webdata/system_encryptor.h",
   ]
diff --git a/components/autofill/core/browser/address_profile_save_manager.cc b/components/autofill/core/browser/address_profile_save_manager.cc
index b696d48..7c5de604 100644
--- a/components/autofill/core/browser/address_profile_save_manager.cc
+++ b/components/autofill/core/browser/address_profile_save_manager.cc
@@ -162,7 +162,8 @@
     client_->GetFormDataImporter()->ClearMultiStepImportCandidates();
   }
 
-  import_process->CollectMetrics();
+  import_process->CollectMetrics(client_->GetUkmRecorder(),
+                                 client_->GetUkmSourceId());
   ClearPendingImport(std::move(import_process));
 }
 
diff --git a/components/autofill/core/browser/address_profile_save_manager_unittest.cc b/components/autofill/core/browser/address_profile_save_manager_unittest.cc
index fe4d286..5b8cff9 100644
--- a/components/autofill/core/browser/address_profile_save_manager_unittest.cc
+++ b/components/autofill/core/browser/address_profile_save_manager_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
+#include "components/autofill/core/browser/autofill_profile_import_process.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/data_model/autofill_structured_address_test_utils.h"
 #include "components/autofill/core/browser/metrics/autofill_metrics.h"
@@ -17,6 +18,7 @@
 #include "components/autofill/core/browser/test_utils/test_profiles.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_features.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -24,6 +26,9 @@
 
 namespace {
 
+using UkmAddressProfileImportType =
+    ukm::builders::Autofill_AddressProfileImport;
+
 using UserDecision = AutofillClient::SaveAddressProfileOfferUserDecision;
 
 using structured_address::VerificationStatus;
@@ -177,7 +182,7 @@
 
 class AddressProfileSaveManagerTest
     : public testing::Test,
-      public testing::WithParamInterface<std::tuple<bool, bool, bool>> {
+      public testing::WithParamInterface<std::tuple<bool, bool, bool, bool>> {
  public:
   void SetUp() override {
     // These parameters would typically be set by `FormDataImporter` when
@@ -185,10 +190,13 @@
     // precedes the saving logic tested here. They expand the
     // `ImportScenarioTestCase`, but are part of the fixture, so they can be
     // tested in a parameterized way.
-    import_metadata_ = {
-        .did_complement_country = std::get<0>(GetParam()),
-        .did_ignore_invalid_country = std::get<1>(GetParam()),
-        .did_remove_invalid_phone_number = std::get<2>(GetParam())};
+    import_metadata_ = {.did_complement_country = std::get<0>(GetParam()),
+                        .did_ignore_invalid_country = std::get<1>(GetParam()),
+                        .phone_import_status = std::get<2>(GetParam())
+                                                   ? PhoneImportStatus::kInvalid
+                                                   : PhoneImportStatus::kValid,
+                        .did_import_from_unrecognized_autocomplete_field =
+                            std::get<3>(GetParam())};
     // Enable both explicit save prompts and structured names.
     // The latter is needed to test the concept of silent updates.
     scoped_feature_list_.InitAndEnableFeature(
@@ -204,6 +212,10 @@
   // Tests the |test_scenario|.
   void TestImportScenario(ImportScenarioTestCase& test_scenario);
 
+  // Verifies the logged ukm data.
+  void VerifyUkmForAddressImport(const ukm::TestUkmRecorder* ukm_recorder,
+                                 ImportScenarioTestCase& test_scenario);
+
   const ProfileImportMetadata& import_metadata() const {
     return import_metadata_;
   }
@@ -341,7 +353,7 @@
           : kProfileImportTypeHistogram,
       test_scenario.expected_import_type, 1);
   if (test_scenario.allow_only_silent_updates &&
-      import_metadata().did_remove_invalid_phone_number) {
+      import_metadata().phone_import_status == PhoneImportStatus::kInvalid) {
     histogram_tester.ExpectUniqueSample(
         kSilentUpdatesWithRemovedPhoneNumberProfileImportTypeHistogram,
         test_scenario.expected_import_type, 1);
@@ -459,7 +471,7 @@
     // Metrics related to removing invalid phone numbers.
     TestFeatureSpecificNewOrUpdateProfileMetrics(
         histogram_tester, test_scenario,
-        import_metadata().did_remove_invalid_phone_number,
+        import_metadata().phone_import_status == PhoneImportStatus::kInvalid,
         kNewProfileWithRemovedPhoneNumberDecisionHistogram,
         kProfileUpdateWithRemovedPhoneNumberDecisionHistogram);
 
@@ -542,6 +554,55 @@
     EXPECT_EQ(1, mock_personal_data_manager_.GetProfileUpdateStrikeDatabase()
                      ->GetStrikes(test_scenario.merge_candidate->guid()));
   }
+
+  VerifyUkmForAddressImport(autofill_client_.GetTestUkmRecorder(),
+                            test_scenario);
+}
+
+void AddressProfileSaveManagerTest::VerifyUkmForAddressImport(
+    const ukm::TestUkmRecorder* ukm_recorder,
+    ImportScenarioTestCase& test_scenario) {
+  ASSERT_TRUE(test_scenario.expected_import_type !=
+              AutofillProfileImportType::kImportTypeUnspecified);
+
+  // Verify logged UKM metrics in all scenarios except:
+  // 1. Duplicates
+  // 2. Blocked Domain or blocked profile if it is not a silent update.
+  bool is_ukm_logged =
+      test_scenario.expected_import_type !=
+          AutofillProfileImportType::kDuplicateImport &&
+      test_scenario.expected_import_type !=
+          AutofillProfileImportType::kSuppressedNewProfile &&
+      test_scenario.expected_import_type !=
+          AutofillProfileImportType::kSuppressedConfirmableMerge &&
+      test_scenario.expected_import_type !=
+          AutofillProfileImportType::kUnusableIncompleteProfile &&
+      test_scenario.expected_import_type !=
+          AutofillProfileImportType::kSuppressedConfirmableMergeAndSilentUpdate;
+
+  auto entries =
+      ukm_recorder->GetEntriesByName(UkmAddressProfileImportType::kEntryName);
+  ASSERT_EQ(entries.size(), is_ukm_logged ? 1u : 0u);
+
+  if (is_ukm_logged) {
+    ASSERT_EQ(5u, entries[0]->metrics.size());
+    ukm_recorder->ExpectEntryMetric(
+        entries[0],
+        UkmAddressProfileImportType::kAutocompleteUnrecognizedImportName,
+        import_metadata().did_import_from_unrecognized_autocomplete_field);
+    ukm_recorder->ExpectEntryMetric(
+        entries[0], UkmAddressProfileImportType::kImportTypeName,
+        static_cast<int64_t>(test_scenario.expected_import_type));
+    ukm_recorder->ExpectEntryMetric(
+        entries[0], UkmAddressProfileImportType::kNumberOfEditedFieldsName,
+        test_scenario.expected_edited_types_for_metrics.size());
+    ukm_recorder->ExpectEntryMetric(
+        entries[0], UkmAddressProfileImportType::kPhoneNumberStatusName,
+        static_cast<int64_t>(import_metadata().phone_import_status));
+    ukm_recorder->ExpectEntryMetric(
+        entries[0], UkmAddressProfileImportType::kUserDecisionName,
+        static_cast<int64_t>(test_scenario.user_decision));
+  }
 }
 
 // Test that a profile is correctly imported when no other profile is stored
@@ -747,6 +808,7 @@
       .existing_profiles = {updateable_profile},
       .observed_profile = observed_profile,
       .is_prompt_expected = false,
+      .user_decision = UserDecision::kUserNotAsked,
       .expected_import_type = AutofillProfileImportType::kSilentUpdate,
       .is_profile_change_expected = true,
       .merge_candidate = absl::nullopt,
@@ -768,6 +830,7 @@
       .existing_profiles = {updateable_profile},
       .observed_profile = observed_profile,
       .is_prompt_expected = false,
+      .user_decision = UserDecision::kUserNotAsked,
       .expected_import_type = AutofillProfileImportType::kSilentUpdate,
       .is_profile_change_expected = true,
       .merge_candidate = absl::nullopt,
@@ -794,6 +857,7 @@
       .existing_profiles = {updateable_profile},
       .observed_profile = observed_profile,
       .is_prompt_expected = false,
+      .user_decision = UserDecision::kUserNotAsked,
       .expected_import_type = AutofillProfileImportType::kSilentUpdate,
       .is_profile_change_expected = true,
       .merge_candidate = absl::nullopt,
@@ -1216,6 +1280,7 @@
       .existing_profiles = {updateable_profile},
       .observed_profile = observed_profile,
       .is_prompt_expected = false,
+      .user_decision = UserDecision::kUserNotAsked,
       .expected_import_type =
           AutofillProfileImportType::kSilentUpdateForIncompleteProfile,
       .is_profile_change_expected = true,
@@ -1264,6 +1329,7 @@
       .existing_profiles = {updateable_profile},
       .observed_profile = observed_profile,
       .is_prompt_expected = false,
+      .user_decision = UserDecision::kUserNotAsked,
       .expected_import_type =
           AutofillProfileImportType::kSilentUpdateForIncompleteProfile,
       .is_profile_change_expected = true,
@@ -1319,6 +1385,7 @@
       .existing_profiles = {updateable_profile},
       .observed_profile = observed_profile,
       .is_prompt_expected = false,
+      .user_decision = UserDecision::kUserNotAsked,
       .expected_import_type =
           AutofillProfileImportType::kSilentUpdateForIncompleteProfile,
       .is_profile_change_expected = true,
@@ -1340,6 +1407,7 @@
       .existing_profiles = {updateable_profile},
       .observed_profile = observed_profile,
       .is_prompt_expected = false,
+      .user_decision = UserDecision::kUserNotAsked,
       .expected_import_type =
           AutofillProfileImportType::kSilentUpdateForIncompleteProfile,
       .is_profile_change_expected = true,
@@ -1370,6 +1438,7 @@
                             updateable_profile},
       .observed_profile = observed_profile,
       .is_prompt_expected = false,
+      .user_decision = UserDecision::kUserNotAsked,
       .expected_import_type =
           AutofillProfileImportType::kSilentUpdateForIncompleteProfile,
       .is_profile_change_expected = true,
@@ -1408,6 +1477,7 @@
                          AddressProfileSaveManagerTest,
                          testing::Combine(testing::Bool(),
                                           testing::Bool(),
+                                          testing::Bool(),
                                           testing::Bool()));
 
 }  // namespace
diff --git a/components/autofill/core/browser/autofill_profile_import_process.cc b/components/autofill/core/browser/autofill_profile_import_process.cc
index fd14254..8512763 100644
--- a/components/autofill/core/browser/autofill_profile_import_process.cc
+++ b/components/autofill/core/browser/autofill_profile_import_process.cc
@@ -339,23 +339,66 @@
   prompt_shown_ = true;
 }
 
-void ProfileImportProcess::CollectMetrics() const {
+void ProfileImportProcess::CollectMetrics(ukm::UkmRecorder* ukm_recorder,
+                                          ukm::SourceId source_id) const {
   // Metrics should only be recorded after a user decision was supplied.
   DCHECK_NE(user_decision_, UserDecision::kUndefined);
 
+  auto LogUkmMetrics = [&](int num_edited_fields = 0) {
+    AutofillMetrics::LogAddressProfileImportUkm(
+        ukm_recorder, source_id, import_type_, user_decision_, import_metadata_,
+        num_edited_fields);
+  };
+
   if (allow_only_silent_updates_) {
     // Record the import type for the silent updates.
     AutofillMetrics::LogSilentUpdatesProfileImportType(import_type_);
-    if (import_metadata_.did_remove_invalid_phone_number) {
+    if (import_metadata_.phone_import_status == PhoneImportStatus::kInvalid) {
       AutofillMetrics::LogSilentUpdatesWithRemovedPhoneNumberProfileImportType(
           import_type_);
     }
+    if (import_type_ == AutofillProfileImportType::kSilentUpdate ||
+        import_type_ ==
+            AutofillProfileImportType::kSilentUpdateForIncompleteProfile)
+      LogUkmMetrics();
     return;
   }
 
   // For any finished import process record the type of the import.
   AutofillMetrics::LogProfileImportType(import_type_);
 
+  // Tracks number of edited fields by the user in the storage prompt.
+  int num_edited_fields = 0;
+
+  // If the profile was edited by the user, record a histogram of edited types.
+  if (user_decision_ == UserDecision::kEditAccepted) {
+    const std::vector<ProfileValueDifference> edit_difference =
+        AutofillProfileComparator::GetSettingsVisibleProfileDifference(
+            import_candidate_.value(), confirmed_import_candidate_.value(),
+            app_locale_);
+    for (const auto& difference : edit_difference) {
+      if (import_type_ == AutofillProfileImportType::kNewProfile) {
+        AutofillMetrics::LogNewProfileEditedType(difference.type);
+        if (import_metadata_.did_complement_country &&
+            difference.type == ServerFieldType::ADDRESS_HOME_COUNTRY) {
+          AutofillMetrics::LogNewProfileEditedComplementedCountry();
+        }
+      } else {
+        AutofillMetrics::LogProfileUpdateEditedType(difference.type);
+        if (import_metadata_.did_complement_country &&
+            difference.type == ServerFieldType::ADDRESS_HOME_COUNTRY) {
+          AutofillMetrics::LogProfileUpdateEditedComplementedCountry();
+        }
+      }
+    }
+    num_edited_fields = edit_difference.size();
+    if (import_type_ == AutofillProfileImportType::kNewProfile) {
+      AutofillMetrics::LogNewProfileNumberOfEditedFields(num_edited_fields);
+    } else {
+      AutofillMetrics::LogUpdateProfileNumberOfEditedFields(num_edited_fields);
+    }
+  }
+
   // For an import process that involves prompting the user, record the
   // decision.
   if (import_type_ == AutofillProfileImportType::kNewProfile) {
@@ -368,15 +411,17 @@
       AutofillMetrics::LogNewProfileWithIgnoredCountryImportDecision(
           user_decision_);
     }
-    if (import_metadata_.did_remove_invalid_phone_number) {
+    if (import_metadata_.phone_import_status == PhoneImportStatus::kInvalid) {
       AutofillMetrics::LogNewProfileWithRemovedPhoneNumberImportDecision(
           user_decision_);
     }
+
+    LogUkmMetrics(num_edited_fields);
   } else if (import_type_ == AutofillProfileImportType::kConfirmableMerge ||
              import_type_ ==
                  AutofillProfileImportType::kConfirmableMergeAndSilentUpdate) {
     AutofillMetrics::LogProfileUpdateImportDecision(user_decision_);
-    if (import_metadata_.did_remove_invalid_phone_number) {
+    if (import_metadata_.phone_import_status == PhoneImportStatus::kInvalid) {
       AutofillMetrics::LogProfileUpdateWithRemovedPhoneNumberImportDecision(
           user_decision_);
     }
@@ -412,36 +457,9 @@
 
     AutofillMetrics::LogUpdateProfileNumberOfAffectedFields(
         merge_difference.size(), user_decision_);
-  }
-
-  // If the profile was edited by the user, record a histogram of edited types.
-  if (user_decision_ == UserDecision::kEditAccepted) {
-    const std::vector<ProfileValueDifference> edit_difference =
-        AutofillProfileComparator::GetSettingsVisibleProfileDifference(
-            import_candidate_.value(), confirmed_import_candidate_.value(),
-            app_locale_);
-    for (const auto& difference : edit_difference) {
-      if (import_type_ == AutofillProfileImportType::kNewProfile) {
-        AutofillMetrics::LogNewProfileEditedType(difference.type);
-        if (import_metadata_.did_complement_country &&
-            difference.type == ServerFieldType::ADDRESS_HOME_COUNTRY) {
-          AutofillMetrics::LogNewProfileEditedComplementedCountry();
-        }
-      } else {
-        AutofillMetrics::LogProfileUpdateEditedType(difference.type);
-        if (import_metadata_.did_complement_country &&
-            difference.type == ServerFieldType::ADDRESS_HOME_COUNTRY) {
-          AutofillMetrics::LogProfileUpdateEditedComplementedCountry();
-        }
-      }
-    }
-    if (import_type_ == AutofillProfileImportType::kNewProfile) {
-      AutofillMetrics::LogNewProfileNumberOfEditedFields(
-          edit_difference.size());
-    } else {
-      AutofillMetrics::LogUpdateProfileNumberOfEditedFields(
-          edit_difference.size());
-    }
+    LogUkmMetrics(num_edited_fields);
+  } else if (import_type_ == AutofillProfileImportType::kSilentUpdate) {
+    LogUkmMetrics();
   }
 }
 
diff --git a/components/autofill/core/browser/autofill_profile_import_process.h b/components/autofill/core/browser/autofill_profile_import_process.h
index 5a410ad..a4cace39 100644
--- a/components/autofill/core/browser/autofill_profile_import_process.h
+++ b/components/autofill/core/browser/autofill_profile_import_process.h
@@ -56,6 +56,17 @@
   kMaxValue = kUnusableIncompleteProfile
 };
 
+// Specifies the status of the imported phone number.
+enum class PhoneImportStatus {
+  // Phone number is not present. Default.
+  kNone,
+  // User imported the phone number as it was.
+  kValid,
+  // The phone number was removed from the profile import as it was invalid.
+  kInvalid,
+  kMaxValue = kInvalid
+};
+
 // Metadata about the import, which is passed through from FormDataImporter to
 // ProfileImportProcess. This is required to do metric collection, depending on
 // the user's decision to (not) import, based on how we construct the candidate
@@ -71,7 +82,10 @@
   // - Removed due to AutofillRemoveInvalidPhoneNumberOnImport.
   // - The only requirement preventing an import.
   // TODO(crbug.com/1298424): Cleanup when launched.
-  bool did_remove_invalid_phone_number = false;
+  PhoneImportStatus phone_import_status = PhoneImportStatus::kNone;
+  // Whether the profile import from any field that contained an unrecognized
+  // autocomplete attribute.
+  bool did_import_from_unrecognized_autocomplete_field = false;
 };
 
 // This class holds the state associated with the import of an AutofillProfile
@@ -176,9 +190,10 @@
       AutofillClient::SaveAddressProfileOfferUserDecision decision,
       absl::optional<AutofillProfile> edited_profile = absl::nullopt);
 
-  // Records UMA metrics. Should only be called after a user decision was
-  // supplied.
-  void CollectMetrics() const;
+  // Records UMA and UKM metrics. Should only be called after a user decision
+  // was supplied or a silent update happens.
+  void CollectMetrics(ukm::UkmRecorder* ukm_recorder,
+                      ukm::SourceId source_id) const;
 
  private:
   // Determines the import type of |observed_profile_| with respect to
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index 62dd6e7..89f0787 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -1625,6 +1625,7 @@
                         << Tag{"table"} << Tr{} << GetFieldNumber()
                         << std::move(change);
 
+  AnalyzeJavaScriptChangedAutofilledValue(form, field);
   MaybeTriggerRefillForExpirationDate(form, field, old_value);
 }
 
@@ -1686,6 +1687,39 @@
   }
 }
 
+void BrowserAutofillManager::AnalyzeJavaScriptChangedAutofilledValue(
+    const FormData& form,
+    const FormFieldData& field) {
+  // We are interested in reporting the events where JavaScript resets an
+  // autofilled value immediately after filling. For a reset, the value
+  // needs to be empty.
+  if (!field.value.empty())
+    return;
+
+  FormStructure* form_structure = nullptr;
+  AutofillField* autofill_field = nullptr;
+  if (!GetCachedFormAndField(form, field, &form_structure, &autofill_field))
+    return;
+
+  FillingContext* filling_context = GetFillingContext(*form_structure);
+  if (!filling_context)
+    return;
+
+  base::TimeTicks now = AutofillTickClock::NowTicks();
+  base::TimeDelta delta = now - filling_context->original_fill_time;
+
+  // If the filling happened too long ago, maybe this is just an effect of
+  // the user pressing a "reset form" button.
+  if (delta >= kLimitBeforeRefill)
+    return;
+
+  auto* logger = GetEventFormLogger(autofill_field->Type().group());
+  if (logger) {
+    logger->OnAutofilledFieldWasClearedByJavaScriptShortlyAfterFill(
+        *form_structure);
+  }
+}
+
 void BrowserAutofillManager::PropagateAutofillPredictions(
     const std::vector<FormStructure*>& forms) {
   client()->PropagateAutofillPredictions(driver(), forms);
diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h
index 5dcc234..1a32560 100644
--- a/components/autofill/core/browser/browser_autofill_manager.h
+++ b/components/autofill/core/browser/browser_autofill_manager.h
@@ -664,6 +664,14 @@
                                            const FormFieldData& field,
                                            const std::u16string& old_value);
 
+  // Checks whether JavaScript cleared an autofilled value within
+  // kLimitBeforeRefill after the filling and records metrics for this. This
+  // method should be called after we learend that JavaScript modified an
+  // autofilled field. It's responsible for assessing the nature of the
+  // modification.
+  void AnalyzeJavaScriptChangedAutofilledValue(const FormData& form,
+                                               const FormFieldData& field);
+
   // Replaces the contents of |suggestions| with available suggestions for
   // |field|. |context| will contain additional information about the
   // suggestions, such as if they correspond to credit card suggestions and
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
index 59c1ee5..a3e85119 100644
--- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -10167,4 +10167,105 @@
             .triggers_refill = false,
         }));
 
+// Tests that analyze metrics logging in case JavaScript clears a field
+// immediately after it was filled.
+class BrowserAutofillManagerClearFieldTest : public BrowserAutofillManagerTest {
+ public:
+  void SetUp() override {
+    BrowserAutofillManagerTest::SetUp();
+
+    // Set up a CC form.
+    FormData form;
+    form.url = GURL("https://myform.com/form.html");
+    form.action = GURL("https://myform.com/submit.html");
+    FormFieldData field;
+    test::CreateTestFormField("Name on Card", "nameoncard", "", "text", &field);
+    form.fields.push_back(field);
+    test::CreateTestFormField("Card Number", "cardnumber", "", "text", &field);
+    form.fields.push_back(field);
+    test::CreateTestFormField("Expiration date", "exp_date", "", "text",
+                              &field);
+    form.fields.push_back(field);
+
+    // Notify BrowserAutofillManager of the form.
+    FormsSeen({form});
+
+    // Simulate filling and store the data to be filled in `fill_data_`.
+    const char guid[] = "00000000-0000-0000-0000-000000000004";
+    int response_page_id = 0;
+    FillAutofillFormDataAndSaveResults(
+        kDefaultPageID, form, *form.fields.begin(),
+        MakeFrontendId(guid, std::string()), &response_page_id, &fill_data_);
+    ASSERT_EQ(3u, fill_data_.fields.size());
+    ExpectFilledField("Name on Card", "nameoncard", "Elvis Presley", "text",
+                      fill_data_.fields[0]);
+    ExpectFilledField("Card Number", "cardnumber", "4234567890123456", "text",
+                      fill_data_.fields[1]);
+    ExpectFilledField("Expiration date", "exp_date", "04/2999", "text",
+                      fill_data_.fields[2]);
+  }
+
+  void SimulateOverrideFieldByJavaScript(size_t field_index,
+                                         const std::u16string& new_value) {
+    std::u16string old_value = fill_data_.fields[field_index].value;
+    fill_data_.fields[field_index].value = new_value;
+    browser_autofill_manager_->OnJavaScriptChangedAutofilledValue(
+        fill_data_, fill_data_.fields[field_index], old_value);
+  }
+
+  // Content of the form.
+  FormData fill_data_;
+
+  base::HistogramTester histogram_tester_;
+
+  // Shorter alias of the Autofill.FormEvents we are interested in.
+  const FormEvent kEvent =
+      FORM_EVENT_AUTOFILLED_FIELD_CLEARED_BY_JAVASCRIPT_AFTER_FILL_ONCE;
+};
+
+// Ensure that we log the appropriate Autofill.FormEvents event if an autofilled
+// field is cleared by JavaScript immediately after the filling.
+TEST_F(BrowserAutofillManagerClearFieldTest, OneClearedField) {
+  // Simulate that JavaScript clears the first field.
+  SimulateOverrideFieldByJavaScript(0, u"");
+
+  EXPECT_THAT(histogram_tester_.GetAllSamples("Autofill.FormEvents.CreditCard"),
+              base::BucketsInclude(base::Bucket(kEvent, 1)));
+}
+
+// Ensure that we log a single Autofill.FormEvents event even if *two*
+// autofilled fields are cleared by JavaScript immediately after the filling.
+TEST_F(BrowserAutofillManagerClearFieldTest, TwoClearedFields) {
+  // Simulate that JavaScript clears the first two field.
+  SimulateOverrideFieldByJavaScript(0, u"");
+  SimulateOverrideFieldByJavaScript(1, u"");
+
+  EXPECT_THAT(histogram_tester_.GetAllSamples("Autofill.FormEvents.CreditCard"),
+              base::BucketsInclude(base::Bucket(kEvent, 1)));
+}
+
+// Ensure that we do not log an Autofill.FormEvents event for the case that
+// JavaScript modifies an autofilled field but does not clear it.
+TEST_F(BrowserAutofillManagerClearFieldTest, ModifiedButDidNotClearField) {
+  // Simulate that JavaScript modifies the value of the field but does not clear
+  // the field.
+  SimulateOverrideFieldByJavaScript(0, u"Elvis Aaron Presley");
+
+  EXPECT_THAT(histogram_tester_.GetAllSamples("Autofill.FormEvents.CreditCard"),
+              base::BucketsInclude(base::Bucket(kEvent, 0)));
+}
+
+// Ensure that we do not log an appropriate Autofill.FormEvents event if an
+// autofilled field is cleared by JavaScript too long after it was filled.
+TEST_F(BrowserAutofillManagerClearFieldTest, NoLoggingAfterDelay) {
+  TestAutofillTickClock clock(AutofillTickClock::NowTicks());
+  clock.Advance(base::Seconds(5));
+
+  // Simulate that JavaScript clears the first field.
+  SimulateOverrideFieldByJavaScript(0, u"");
+
+  EXPECT_THAT(histogram_tester_.GetAllSamples("Autofill.FormEvents.CreditCard"),
+              base::BucketsInclude(base::Bucket(kEvent, 0)));
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc
index 05f33df..81a3764 100644
--- a/components/autofill/core/browser/form_data_importer.cc
+++ b/components/autofill/core/browser/form_data_importer.cc
@@ -493,9 +493,6 @@
     if (field_type.group() == FieldTypeGroup::kCreditCard)
       continue;
 
-    has_address_related_fields |=
-        FieldTypeGroupToFormType(field_type.group()) == FormType::kAddressForm;
-
     // There can be multiple email fields (e.g. in the case of 'confirm email'
     // fields) but they must all contain the same value, else the profile is
     // invalid.
@@ -577,6 +574,16 @@
         }
       }
     }
+
+    if (FieldTypeGroupToFormType(field_type.group()) ==
+        FormType::kAddressForm) {
+      has_address_related_fields = true;
+      if (field->parsed_autocomplete) {
+        import_metadata.did_import_from_unrecognized_autocomplete_field |=
+            field->parsed_autocomplete->field_type ==
+            HtmlFieldType::kUnrecognized;
+      }
+    }
   }
 
   const std::string variation_country_code =
@@ -585,12 +592,15 @@
       GetPredictedCountryCode(candidate_profile, variation_country_code,
                               app_locale_, import_log_buffer);
 
+  if (!combined_phone.IsEmpty())
+    import_metadata.phone_import_status = PhoneImportStatus::kValid;
+
   if (!SetPhoneNumber(candidate_profile, combined_phone,
                       predicted_country_code)) {
     if (base::FeatureList::IsEnabled(
             features::kAutofillRemoveInvalidPhoneNumberOnImport)) {
       candidate_profile.ClearFields({PHONE_HOME_WHOLE_NUMBER});
-      import_metadata.did_remove_invalid_phone_number = true;
+      import_metadata.phone_import_status = PhoneImportStatus::kInvalid;
       LOG_AF(import_log_buffer)
           << LogMessage::kImportAddressProfileFromFormRemoveInvalidValue
           << "Phone number." << CTag{};
diff --git a/components/autofill/core/browser/form_data_importer_utils.cc b/components/autofill/core/browser/form_data_importer_utils.cc
index 522eb0f..d0a3e8a 100644
--- a/components/autofill/core/browser/form_data_importer_utils.cc
+++ b/components/autofill/core/browser/form_data_importer_utils.cc
@@ -244,8 +244,18 @@
     // was removed from a partial profile, we still want that removal to appear
     // in the metrics, because it would have hindered that partial profile from
     // import and merging.
-    completed_metadata.did_remove_invalid_phone_number |=
-        candidate->import_metadata.did_remove_invalid_phone_number;
+    if (completed_metadata.phone_import_status != PhoneImportStatus::kInvalid &&
+        candidate->import_metadata.phone_import_status !=
+            PhoneImportStatus::kNone) {
+      completed_metadata.phone_import_status =
+          candidate->import_metadata.phone_import_status;
+    }
+
+    // If the partial profile contained an unrecognized autocomplete attribute,
+    // it should appear in the metrics.
+    completed_metadata.did_import_from_unrecognized_autocomplete_field |=
+        candidate->import_metadata
+            .did_import_from_unrecognized_autocomplete_field;
     candidate++;
   }
 
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.cc b/components/autofill/core/browser/metrics/autofill_metrics.cc
index 52e9d25..3d0e792 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics.cc
@@ -2387,6 +2387,26 @@
       .Record(ukm_recorder);
 }
 
+// static
+void AutofillMetrics::LogAddressProfileImportUkm(
+    ukm::UkmRecorder* ukm_recorder,
+    ukm::SourceId source_id,
+    AutofillProfileImportType import_type,
+    AutofillClient::SaveAddressProfileOfferUserDecision user_decision,
+    const ProfileImportMetadata& profile_import_metadata,
+    size_t num_edited_fields) {
+  ukm::builders::Autofill_AddressProfileImport(source_id)
+      .SetAutocompleteUnrecognizedImport(
+          profile_import_metadata
+              .did_import_from_unrecognized_autocomplete_field)
+      .SetImportType(static_cast<int64_t>(import_type))
+      .SetNumberOfEditedFields(num_edited_fields)
+      .SetPhoneNumberStatus(
+          static_cast<int64_t>(profile_import_metadata.phone_import_status))
+      .SetUserDecision(static_cast<int64_t>(user_decision))
+      .Record(ukm_recorder);
+}
+
 AutofillMetrics::FormInteractionsUkmLogger::FormInteractionsUkmLogger(
     ukm::UkmRecorder* ukm_recorder,
     const ukm::SourceId source_id)
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.h b/components/autofill/core/browser/metrics/autofill_metrics.h
index 1927195..dd8cce0 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.h
+++ b/components/autofill/core/browser/metrics/autofill_metrics.h
@@ -1523,6 +1523,19 @@
                                         int developer_engagement_metrics,
                                         FormSignature form_signature);
 
+  // Logs the address profile import UKM after the form submission.
+  // `user_decision` is the user's decision based on the storage prompt, if
+  // presented. `num_edited_fields` is the number of fields that were edited by
+  // the user before acceptance of the storage prompt. `profile_import_metadata`
+  // stores metadata related to the import of the address profiles.
+  static void LogAddressProfileImportUkm(
+      ukm::UkmRecorder* ukm_recorder,
+      ukm::SourceId source_id,
+      AutofillProfileImportType import_type,
+      AutofillClient::SaveAddressProfileOfferUserDecision user_decision,
+      const ProfileImportMetadata& profile_import_metadata,
+      size_t num_edited_fields);
+
   // Log the number of hidden or presentational 'select' fields that were
   // autofilled to support synthetic fields.
   static void LogHiddenOrPresentationalSelectFieldsFilled();
diff --git a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc
index b8f2799..34c965d 100644
--- a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc
+++ b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc
@@ -197,6 +197,15 @@
   has_logged_edited_autofilled_field_ = true;
 }
 
+void FormEventLoggerBase::
+    OnAutofilledFieldWasClearedByJavaScriptShortlyAfterFill(
+        const FormStructure& form) {
+  if (has_logged_autofilled_field_was_cleared_by_javascript_after_fill_)
+    return;
+  Log(FORM_EVENT_AUTOFILLED_FIELD_CLEARED_BY_JAVASCRIPT_AFTER_FILL_ONCE, form);
+  has_logged_autofilled_field_was_cleared_by_javascript_after_fill_ = true;
+}
+
 void FormEventLoggerBase::Log(FormEvent event,
                               const FormStructure& form) const {
   DCHECK_LT(event, NUM_FORM_EVENTS);
diff --git a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h
index 07f2ea3..186eb24f 100644
--- a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h
+++ b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h
@@ -79,6 +79,9 @@
   void SetTimeFromInteractionToSubmission(
       base::TimeDelta time_from_interaction_to_submission);
 
+  void OnAutofilledFieldWasClearedByJavaScriptShortlyAfterFill(
+      const FormStructure& form);
+
   void Log(FormEvent event, const FormStructure& form) const;
 
   autofill_assistant::AutofillAssistantIntent autofill_assistant_intent() const;
@@ -146,6 +149,8 @@
   bool logged_suggestion_filled_was_server_data_ = false;
   bool has_logged_typed_into_non_filled_field_ = false;
   bool has_logged_edited_autofilled_field_ = false;
+  bool has_logged_autofilled_field_was_cleared_by_javascript_after_fill_ =
+      false;
   AblationGroup ablation_group_ = AblationGroup::kDefault;
   AblationGroup conditional_ablation_group_ = AblationGroup::kDefault;
   absl::optional<base::TimeDelta> time_from_interaction_to_submission_;
diff --git a/components/autofill/core/browser/metrics/form_events/form_events.h b/components/autofill/core/browser/metrics/form_events/form_events.h
index 78573455..77b4542 100644
--- a/components/autofill/core/browser/metrics/form_events/form_events.h
+++ b/components/autofill/core/browser/metrics/form_events/form_events.h
@@ -139,6 +139,10 @@
   // suggestion was filled.
   FORM_EVENT_LOCAL_SUGGESTION_FILLED_FOR_AN_EXISTING_SERVER_CARD_ONCE = 56,
 
+  // A field of the form was cleared by Javascript within kLimitBeforeRefill
+  // after being autofilled. Recorded once per form.
+  FORM_EVENT_AUTOFILLED_FIELD_CLEARED_BY_JAVASCRIPT_AFTER_FILL_ONCE = 57,
+
   NUM_FORM_EVENTS,
 };
 
diff --git a/components/autofill/core/browser/webdata/contact_info_sync_bridge.cc b/components/autofill/core/browser/webdata/contact_info_sync_bridge.cc
new file mode 100644
index 0000000..1e18a80
--- /dev/null
+++ b/components/autofill/core/browser/webdata/contact_info_sync_bridge.cc
@@ -0,0 +1,95 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/webdata/contact_info_sync_bridge.h"
+
+#include "base/notreached.h"
+#include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
+#include "components/sync/model/client_tag_based_model_type_processor.h"
+
+namespace autofill {
+
+namespace {
+
+// The address of this variable is used as the user data key.
+static int kContactInfoSyncBridgeUserDataKey = 0;
+
+}  // namespace
+
+ContactInfoSyncBridge::ContactInfoSyncBridge(
+    std::unique_ptr<syncer::ModelTypeChangeProcessor> change_processor,
+    AutofillWebDataBackend* backend)
+    : ModelTypeSyncBridge(std::move(change_processor)),
+      web_data_backend_(backend) {
+  DCHECK(web_data_backend_);
+  scoped_observation_.Observe(web_data_backend_.get());
+}
+
+ContactInfoSyncBridge::~ContactInfoSyncBridge() {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+}
+
+// static
+void ContactInfoSyncBridge::CreateForWebDataServiceAndBackend(
+    AutofillWebDataBackend* web_data_backend,
+    AutofillWebDataService* web_data_service) {
+  web_data_service->GetDBUserData()->SetUserData(
+      &kContactInfoSyncBridgeUserDataKey,
+      std::make_unique<ContactInfoSyncBridge>(
+          std::make_unique<syncer::ClientTagBasedModelTypeProcessor>(
+              syncer::CONTACT_INFO,
+              /*dump_stack=*/base::DoNothing()),
+          web_data_backend));
+}
+
+// static
+syncer::ModelTypeSyncBridge* ContactInfoSyncBridge::FromWebDataService(
+    AutofillWebDataService* web_data_service) {
+  return static_cast<ContactInfoSyncBridge*>(
+      web_data_service->GetDBUserData()->GetUserData(
+          &kContactInfoSyncBridgeUserDataKey));
+}
+
+std::unique_ptr<syncer::MetadataChangeList>
+ContactInfoSyncBridge::CreateMetadataChangeList() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+absl::optional<syncer::ModelError> ContactInfoSyncBridge::MergeSyncData(
+    std::unique_ptr<syncer::MetadataChangeList> metadata_change_list,
+    syncer::EntityChangeList entity_data) {
+  NOTIMPLEMENTED();
+  return absl::nullopt;
+}
+
+absl::optional<syncer::ModelError> ContactInfoSyncBridge::ApplySyncChanges(
+    std::unique_ptr<syncer::MetadataChangeList> metadata_change_list,
+    syncer::EntityChangeList entity_changes) {
+  NOTIMPLEMENTED();
+  return absl::nullopt;
+}
+
+void ContactInfoSyncBridge::GetData(StorageKeyList storage_keys,
+                                    DataCallback callback) {
+  NOTIMPLEMENTED();
+}
+
+void ContactInfoSyncBridge::GetAllDataForDebugging(DataCallback callback) {
+  NOTIMPLEMENTED();
+}
+
+std::string ContactInfoSyncBridge::GetClientTag(
+    const syncer::EntityData& entity_data) {
+  NOTIMPLEMENTED();
+  return "";
+}
+
+std::string ContactInfoSyncBridge::GetStorageKey(
+    const syncer::EntityData& entity_data) {
+  NOTIMPLEMENTED();
+  return "";
+}
+
+}  // namespace autofill
diff --git a/components/autofill/core/browser/webdata/contact_info_sync_bridge.h b/components/autofill/core/browser/webdata/contact_info_sync_bridge.h
new file mode 100644
index 0000000..1861e5e
--- /dev/null
+++ b/components/autofill/core/browser/webdata/contact_info_sync_bridge.h
@@ -0,0 +1,78 @@
+// Copyright 2022 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_CORE_BROWSER_WEBDATA_CONTACT_INFO_SYNC_BRIDGE_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_CONTACT_INFO_SYNC_BRIDGE_H_
+
+#include <memory>
+#include <string>
+
+#include "base/memory/raw_ptr.h"
+#include "base/scoped_observation.h"
+#include "base/supports_user_data.h"
+#include "base/threading/thread_checker.h"
+#include "components/autofill/core/browser/webdata/autofill_webdata_backend.h"
+#include "components/autofill/core/browser/webdata/autofill_webdata_service_observer.h"
+#include "components/sync/model/entity_change.h"
+#include "components/sync/model/metadata_change_list.h"
+#include "components/sync/model/model_error.h"
+#include "components/sync/model/model_type_change_processor.h"
+#include "components/sync/model/model_type_sync_bridge.h"
+#include "components/sync/protocol/entity_data.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace autofill {
+
+class AutofillWebDataService;
+
+class ContactInfoSyncBridge : public AutofillWebDataServiceObserverOnDBSequence,
+                              public base::SupportsUserData::Data,
+                              public syncer::ModelTypeSyncBridge {
+ public:
+  ContactInfoSyncBridge(
+      std::unique_ptr<syncer::ModelTypeChangeProcessor> change_processor,
+      AutofillWebDataBackend* backend);
+  ~ContactInfoSyncBridge() override;
+
+  ContactInfoSyncBridge(const ContactInfoSyncBridge&) = delete;
+  ContactInfoSyncBridge& operator=(const ContactInfoSyncBridge&) = delete;
+
+  static void CreateForWebDataServiceAndBackend(
+      AutofillWebDataBackend* web_data_backend,
+      AutofillWebDataService* web_data_service);
+
+  static syncer::ModelTypeSyncBridge* FromWebDataService(
+      AutofillWebDataService* web_data_service);
+
+  // syncer::ModelTypeSyncBridge implementation.
+  std::unique_ptr<syncer::MetadataChangeList> CreateMetadataChangeList()
+      override;
+  absl::optional<syncer::ModelError> MergeSyncData(
+      std::unique_ptr<syncer::MetadataChangeList> metadata_change_list,
+      syncer::EntityChangeList entity_data) override;
+  absl::optional<syncer::ModelError> ApplySyncChanges(
+      std::unique_ptr<syncer::MetadataChangeList> metadata_change_list,
+      syncer::EntityChangeList entity_changes) override;
+  void GetData(StorageKeyList storage_keys, DataCallback callback) override;
+  void GetAllDataForDebugging(DataCallback callback) override;
+  std::string GetClientTag(const syncer::EntityData& entity_data) override;
+  std::string GetStorageKey(const syncer::EntityData& entity_data) override;
+
+ private:
+  // The bridge should be used on the same sequence where it has been
+  // constructed.
+  THREAD_CHECKER(thread_checker_);
+
+  // ContactInfoSyncBridge is owned by `web_data_backend_` through
+  // SupportsUserData, so it's guaranteed to outlive `this`.
+  const raw_ptr<AutofillWebDataBackend> web_data_backend_;
+
+  base::ScopedObservation<AutofillWebDataBackend,
+                          AutofillWebDataServiceObserverOnDBSequence>
+      scoped_observation_{this};
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_CONTACT_INFO_SYNC_BRIDGE_H_
diff --git a/components/browser_sync/sync_api_component_factory_impl.cc b/components/browser_sync/sync_api_component_factory_impl.cc
index 1e38a5d..808dec56 100644
--- a/components/browser_sync/sync_api_component_factory_impl.cc
+++ b/components/browser_sync/sync_api_component_factory_impl.cc
@@ -22,6 +22,7 @@
 #include "components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_wallet_usage_data_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
+#include "components/autofill/core/browser/webdata/contact_info_sync_bridge.h"
 #include "components/browser_sync/active_devices_provider_impl.h"
 #include "components/browser_sync/browser_sync_client.h"
 #include "components/history/core/browser/sync/history_delete_directives_model_type_controller.h"
@@ -122,6 +123,13 @@
       ->GetControllerDelegate();
 }
 
+base::WeakPtr<syncer::ModelTypeControllerDelegate>
+ContactInfoDelegateFromDataService(autofill::AutofillWebDataService* service) {
+  return autofill::ContactInfoSyncBridge::FromWebDataService(service)
+      ->change_processor()
+      ->GetControllerDelegate();
+}
+
 // Helper function that deals will null (e.g. tests, iOS webview).
 base::WeakPtr<syncer::SyncableService> SyncableServiceForPrefs(
     sync_preferences::PrefServiceSyncable* prefs_service,
@@ -190,7 +198,7 @@
 
   // These features are enabled only if there's a DB thread to post tasks to.
   if (db_thread_) {
-    // Autocomplete sync is enabled by default.  Register unless explicitly
+    // Autocomplete sync is enabled by default. Register unless explicitly
     // disabled.
     if (!disabled_types.Has(syncer::AUTOFILL)) {
       controllers.push_back(std::make_unique<ModelTypeController>(
@@ -201,7 +209,7 @@
                               base::RetainedRef(web_data_service_on_disk_)))));
     }
 
-    // Autofill sync is enabled by default.  Register unless explicitly
+    // Autofill sync is enabled by default. Register unless explicitly
     // disabled.
     if (!disabled_types.Has(syncer::AUTOFILL_PROFILE)) {
       controllers.push_back(std::make_unique<syncer::ModelTypeController>(
@@ -212,6 +220,18 @@
                               base::RetainedRef(web_data_service_on_disk_)))));
     }
 
+    // Contact info sync is enabled by default. Register unless explicitly
+    // disabled.
+    if (base::FeatureList::IsEnabled(syncer::kSyncEnableContactInfoDataType) &&
+        !disabled_types.Has(syncer::CONTACT_INFO)) {
+      controllers.push_back(std::make_unique<syncer::ModelTypeController>(
+          syncer::CONTACT_INFO,
+          std::make_unique<syncer::ProxyModelTypeControllerDelegate>(
+              db_thread_, base::BindRepeating(
+                              &ContactInfoDelegateFromDataService,
+                              base::RetainedRef(web_data_service_on_disk_)))));
+    }
+
     // Wallet data sync is enabled by default. Register unless explicitly
     // disabled.
     if (!disabled_types.Has(syncer::AUTOFILL_WALLET_DATA)) {
diff --git a/components/browser_ui/site_settings/android/BUILD.gn b/components/browser_ui/site_settings/android/BUILD.gn
index 49f8347..eee71fa 100644
--- a/components/browser_ui/site_settings/android/BUILD.gn
+++ b/components/browser_ui/site_settings/android/BUILD.gn
@@ -54,6 +54,7 @@
     "java/src/org/chromium/components/browser_ui/site_settings/ClearWebsiteStorageDialog.java",
     "java/src/org/chromium/components/browser_ui/site_settings/ContentSettingException.java",
     "java/src/org/chromium/components/browser_ui/site_settings/ContentSettingsResources.java",
+    "java/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetrics.java",
     "java/src/org/chromium/components/browser_ui/site_settings/FPSCookieInfo.java",
     "java/src/org/chromium/components/browser_ui/site_settings/FPSCookieSettings.java",
     "java/src/org/chromium/components/browser_ui/site_settings/ForwardingManagedPreferenceDelegate.java",
@@ -140,12 +141,17 @@
 }
 
 robolectric_library("junit") {
-  sources = [ "junit/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreferenceUnitTest.java" ]
+  sources = [
+    "junit/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreferenceUnitTest.java",
+    "junit/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetricsUnitTest.java",
+  ]
 
   deps = [
     ":java",
+    "//base:base_java",
     "//base:base_java_test_support",
     "//base:base_junit_test_support",
+    "//components/content_settings/android:content_settings_enums_java",
     "//third_party/junit",
     "//third_party/mockito:mockito_java",
   ]
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetrics.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetrics.java
new file mode 100644
index 0000000..02986c6e
--- /dev/null
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetrics.java
@@ -0,0 +1,63 @@
+// Copyright 2022 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.components.browser_ui.site_settings;
+
+import static org.chromium.components.browser_ui.site_settings.WebsiteAddress.ANY_SUBDOMAIN_PATTERN;
+
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.components.content_settings.ContentSettingValues;
+
+/**
+ * Metrics recording functions for {@link SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE}.
+ */
+public final class DesktopSiteMetrics {
+    /**
+     * Records when a user manually adds a domain or subdomain level Request Desktop Setting from
+     * the Add site dialog in Site settings.
+     * @param type The {@link SiteSettingsCategory.Type} of the current Site settings category.
+     * @param setting The {@link ContentSettingValues} of the newly added setting.
+     * @param hostname The hostname of the newly added setting.
+     */
+    public static void recordDesktopSiteSettingsManuallyAdded(@SiteSettingsCategory.Type int type,
+            @ContentSettingValues int setting, String hostname) {
+        if (type != SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE) {
+            return;
+        }
+
+        boolean isDesktopSite = setting == ContentSettingValues.ALLOW;
+        if (hostname.startsWith(ANY_SUBDOMAIN_PATTERN)) {
+            RecordHistogram.recordBooleanHistogram(
+                    "Android.RequestDesktopSite.UserSwitchToDesktop.DomainSettingAdded",
+                    isDesktopSite);
+        } else {
+            RecordHistogram.recordBooleanHistogram(
+                    "Android.RequestDesktopSite.UserSwitchToDesktop.SubDomainSettingAdded",
+                    isDesktopSite);
+        }
+    }
+
+    /**
+     * Records when a user manually edits a domain or subdomain level Request Desktop Setting from
+     * the site settings exception list.
+     * @param type The {@link SiteSettingsCategory.Type} of the current Site settings category.
+     * @param setting The {@link ContentSettingValues} of the newly added setting.
+     * @param site The {@link Website} of the newly added setting.
+     */
+    public static void recordDesktopSiteSettingsChanged(
+            @SiteSettingsCategory.Type int type, @ContentSettingValues int setting, Website site) {
+        if (type != SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE) {
+            return;
+        }
+
+        boolean isDesktopSite = setting == ContentSettingValues.ALLOW;
+        if (site.getAddress().getIsAnySubdomainPattern()) {
+            RecordHistogram.recordBooleanHistogram(
+                    "Android.RequestDesktopSite.DomainSettingChanged", isDesktopSite);
+        } else {
+            RecordHistogram.recordBooleanHistogram(
+                    "Android.RequestDesktopSite.SubDomainSettingChanged", isDesktopSite);
+        }
+    }
+}
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java
index 961415e..80d23ee 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SingleCategorySettings.java
@@ -699,6 +699,8 @@
                 RecordUserAction.record("SoundContentSetting.UnmuteBy.PatternException");
             }
         }
+        DesktopSiteMetrics.recordDesktopSiteSettingsManuallyAdded(
+                mCategory.getType(), setting, hostname);
     }
 
     /**
@@ -1227,6 +1229,8 @@
                             site.setContentSetting(
                                     browserContextHandle, contentSettingsType, permission);
 
+                            DesktopSiteMetrics.recordDesktopSiteSettingsChanged(
+                                    mCategory.getType(), permission, site);
                             getInfoForOrigins();
                             dialog.dismiss();
                         });
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteAddress.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteAddress.java
index 9f37dca9..911fdaa 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteAddress.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteAddress.java
@@ -30,7 +30,7 @@
     private String mDomainAndRegistry;
 
     private static final String SCHEME_SUFFIX = "://";
-    private static final String ANY_SUBDOMAIN_PATTERN = "[*.]";
+    static final String ANY_SUBDOMAIN_PATTERN = "[*.]";
 
     /**
      * Creates a new WebsiteAddress from |originOrHostOrPattern|.
diff --git a/components/browser_ui/site_settings/android/junit/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetricsUnitTest.java b/components/browser_ui/site_settings/android/junit/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetricsUnitTest.java
new file mode 100644
index 0000000..e762b6d
--- /dev/null
+++ b/components/browser_ui/site_settings/android/junit/src/org/chromium/components/browser_ui/site_settings/DesktopSiteMetricsUnitTest.java
@@ -0,0 +1,126 @@
+// Copyright 2022 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.components.browser_ui.site_settings;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.metrics.UmaRecorderHolder;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.components.content_settings.ContentSettingValues;
+
+/**
+ * Unit tests for {@link DesktopSiteMetrics}.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+@Config(manifest = Config.NONE)
+public class DesktopSiteMetricsUnitTest {
+    private Website mSite;
+    @Mock
+    private WebsiteAddress mOrigin;
+    @Mock
+    private WebsiteAddress mEmbedder;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mSite = new Website(mOrigin, mEmbedder);
+        UmaRecorderHolder.resetForTesting();
+    }
+
+    @After
+    public void tearDown() {
+        UmaRecorderHolder.resetForTesting();
+    }
+
+    @Test
+    public void testRecordDesktopSiteSettingsManuallyAdded() {
+        DesktopSiteMetrics.recordDesktopSiteSettingsManuallyAdded(
+                SiteSettingsCategory.Type.COOKIES, ContentSettingValues.BLOCK, "www.google.com");
+        assertEquals("Only REQUEST_DESKTOP_SITE type should be recorded.", 0,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.UserSwitchToDesktop.DomainSettingAdded", 0));
+        assertEquals("Only REQUEST_DESKTOP_SITE type should be recorded.", 0,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.UserSwitchToDesktop.SubDomainSettingAdded", 0));
+
+        DesktopSiteMetrics.recordDesktopSiteSettingsManuallyAdded(
+                SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, ContentSettingValues.BLOCK,
+                "[*.]google.com");
+        assertEquals("DomainSettingAdded should be recorded with value false.", 1,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.UserSwitchToDesktop.DomainSettingAdded", 0));
+
+        DesktopSiteMetrics.recordDesktopSiteSettingsManuallyAdded(
+                SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, ContentSettingValues.ALLOW,
+                "[*.]google.com");
+        assertEquals("DomainSettingAdded should be recorded with value true.", 1,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.UserSwitchToDesktop.DomainSettingAdded", 1));
+
+        DesktopSiteMetrics.recordDesktopSiteSettingsManuallyAdded(
+                SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, ContentSettingValues.BLOCK,
+                "www.google.com");
+        assertEquals("SubDomainSettingAdded should be recorded with value false.", 1,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.UserSwitchToDesktop.SubDomainSettingAdded", 0));
+
+        DesktopSiteMetrics.recordDesktopSiteSettingsManuallyAdded(
+                SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, ContentSettingValues.ALLOW,
+                "www.google.com");
+        assertEquals("SubDomainSettingAdded should be recorded with value true.", 1,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.UserSwitchToDesktop.SubDomainSettingAdded", 1));
+    }
+
+    @Test
+    public void testRecordDesktopSiteSettingsChanged() {
+        // SubDomain Setting
+        when(mOrigin.getIsAnySubdomainPattern()).thenReturn(false);
+        DesktopSiteMetrics.recordDesktopSiteSettingsChanged(
+                SiteSettingsCategory.Type.COOKIES, ContentSettingValues.ALLOW, mSite);
+        assertEquals("Only REQUEST_DESKTOP_SITE type should be recorded.", 0,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.DomainSettingChanged", 1));
+        assertEquals("Only REQUEST_DESKTOP_SITE type should be recorded.", 0,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.SubDomainSettingChanged", 1));
+
+        DesktopSiteMetrics.recordDesktopSiteSettingsChanged(
+                SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, ContentSettingValues.BLOCK, mSite);
+        assertEquals("SubDomainSettingChanged should be recorded with value false.", 1,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.SubDomainSettingChanged", 0));
+
+        DesktopSiteMetrics.recordDesktopSiteSettingsChanged(
+                SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, ContentSettingValues.ALLOW, mSite);
+        assertEquals("SubDomainSettingChanged should be recorded with value true.", 1,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.SubDomainSettingChanged", 1));
+
+        // Domain Setting
+        when(mOrigin.getIsAnySubdomainPattern()).thenReturn(true);
+        DesktopSiteMetrics.recordDesktopSiteSettingsChanged(
+                SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, ContentSettingValues.BLOCK, mSite);
+        assertEquals("DomainSettingChanged should be recorded with value false.", 1,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.DomainSettingChanged", 0));
+
+        DesktopSiteMetrics.recordDesktopSiteSettingsChanged(
+                SiteSettingsCategory.Type.REQUEST_DESKTOP_SITE, ContentSettingValues.ALLOW, mSite);
+        assertEquals("DomainSettingChanged should be recorded with value true.", 1,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.RequestDesktopSite.DomainSettingChanged", 1));
+    }
+}
\ No newline at end of file
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/MoreProgressButton.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/MoreProgressButton.java
index bc09a92f..1d4429f 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/MoreProgressButton.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/MoreProgressButton.java
@@ -14,6 +14,8 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.ui.widget.ButtonCompat;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -56,7 +58,7 @@
     }
 
     protected View mProgressSpinner;
-    protected View mButton;
+    protected ButtonCompat mButton;
     protected Runnable mOnClickRunnable;
 
     protected @State int mState = State.INVALID;
@@ -108,6 +110,10 @@
         this.mProgressSpinner.setVisibility(State.LOADING == state ? View.VISIBLE : View.GONE);
     }
 
+    public void setButtonText(String text) {
+        mButton.setText(text);
+    }
+
     @VisibleForTesting
     public @State int getStateForTest() {
         return mState;
diff --git a/components/cast_streaming/browser/cast_message_port_impl_unittest.cc b/components/cast_streaming/browser/cast_message_port_impl_unittest.cc
index d14c020..7eb720cd 100644
--- a/components/cast_streaming/browser/cast_message_port_impl_unittest.cc
+++ b/components/cast_streaming/browser/cast_message_port_impl_unittest.cc
@@ -249,7 +249,7 @@
 
   const base::Value* status_value = return_value->FindListKey(kKeyStatus);
   ASSERT_TRUE(status_value);
-  EXPECT_EQ(status_value->GetListDeprecated().size(), 1u);
+  EXPECT_EQ(status_value->GetList().size(), 1u);
 }
 
 // Checks sending invalid media messages results in no response.
diff --git a/components/cdm/common/cdm_manifest.cc b/components/cdm/common/cdm_manifest.cc
index 57d9ada78..132e700 100644
--- a/components/cdm/common/cdm_manifest.cc
+++ b/components/cdm/common/cdm_manifest.cc
@@ -148,7 +148,7 @@
   }
 
   base::flat_set<media::EncryptionScheme> result;
-  for (const auto& item : value->GetListDeprecated()) {
+  for (const auto& item : value->GetList()) {
     if (!item.is_string()) {
       DLOG(ERROR) << "Unrecognized item type in CDM manifest entry "
                   << kCdmSupportedEncryptionSchemesName;
diff --git a/components/cdm/renderer/widevine_key_system_info.cc b/components/cdm/renderer/widevine_key_system_info.cc
index e4140ea3..2d7963d 100644
--- a/components/cdm/renderer/widevine_key_system_info.cc
+++ b/components/cdm/renderer/widevine_key_system_info.cc
@@ -89,8 +89,10 @@
 bool WidevineKeySystemInfo::IsSupportedKeySystem(
     const std::string& key_system) const {
 #if BUILDFLAG(IS_WIN)
-  if (is_experimental_) {
-    return key_system == kWidevineExperimentKeySystem;
+  if (key_system == kWidevineExperimentKeySystem &&
+      base::FeatureList::IsEnabled(
+          media::kHardwareSecureDecryptionExperiment)) {
+    return true;
   }
 #endif  // BUILDFLAG(IS_WIN)
 
diff --git a/components/cdm/renderer/widevine_key_system_info.h b/components/cdm/renderer/widevine_key_system_info.h
index 027c78b..274f319 100644
--- a/components/cdm/renderer/widevine_key_system_info.h
+++ b/components/cdm/renderer/widevine_key_system_info.h
@@ -60,13 +60,6 @@
   media::EmeFeatureSupport GetPersistentStateSupport() const override;
   media::EmeFeatureSupport GetDistinctiveIdentifierSupport() const override;
 
-// `is_experimental_` is used to differentiate between
-// `kWidevineExperimentKeySystem` and `kWidevineKeySystem`. Please refer to
-// b/219818166 for more information.
-#if BUILDFLAG(IS_WIN)
-  void set_experimental() { is_experimental_ = true; }
-#endif  // BUILDFLAG(IS_WIN)
-
  private:
   const media::SupportedCodecs codecs_;
   const base::flat_set<media::EncryptionScheme> encryption_schemes_;
@@ -78,9 +71,6 @@
   const Robustness max_video_robustness_;
   const media::EmeFeatureSupport persistent_state_support_;
   const media::EmeFeatureSupport distinctive_identifier_support_;
-#if BUILDFLAG(IS_WIN)
-  bool is_experimental_ = false;
-#endif  // BUILDFLAG(IS_WIN)
 };
 
 }  // namespace cdm
diff --git a/components/commerce/core/account_checker.cc b/components/commerce/core/account_checker.cc
index 650254a..a705145 100644
--- a/components/commerce/core/account_checker.cc
+++ b/components/commerce/core/account_checker.cc
@@ -4,11 +4,13 @@
 
 #include "components/commerce/core/account_checker.h"
 #include "base/feature_list.h"
+#include "base/json/json_writer.h"
 #include "base/json/values_util.h"
 #include "base/values.h"
 #include "components/commerce/core/commerce_feature_list.h"
 #include "components/commerce/core/pref_names.h"
 #include "components/endpoint_fetcher/endpoint_fetcher.h"
+#include "components/prefs/pref_change_registrar.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/unified_consent/url_keyed_data_collection_consent_helper.h"
@@ -16,6 +18,23 @@
 #include "services/data_decoder/public/cpp/data_decoder.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
+namespace {
+
+const char kOAuthScope[] = "https://www.googleapis.com/auth/chromememex";
+const char kOAuthName[] = "chromememex_svc";
+const char kGetHttpMethod[] = "GET";
+const char kPostHttpMethod[] = "POST";
+const char kContentType[] = "application/json; charset=UTF-8";
+const char kEmptyPostData[] = "";
+const int64_t kTimeoutMs = 10000;
+
+const char kNotificationsPrefUrl[] =
+    "https://memex-pa.googleapis.com/v1/notifications/preferences";
+const char kPriceTrackEmailPref[] = "price_track_email";
+const char kPreferencesKey[] = "preferences";
+
+}  // namespace
+
 namespace commerce {
 
 AccountChecker::AccountChecker(
@@ -30,6 +49,16 @@
     FetchWaaStatus();
     scoped_identity_manager_observation_.Observe(identity_manager);
   }
+  // TODO(crbug.com/1366165): Avoid pushing the fetched pref value to the server
+  // again.
+  if (pref_service) {
+    pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
+    pref_change_registrar_->Init(pref_service);
+    pref_change_registrar_->Add(
+        kPriceEmailNotificationsEnabled,
+        base::BindRepeating(&AccountChecker::SendPriceEmailPref,
+                            weak_ptr_factory_.GetWeakPtr()));
+  }
 }
 
 AccountChecker::~AccountChecker() = default;
@@ -132,4 +161,156 @@
           pref_service));
 }
 
+void AccountChecker::FetchPriceEmailPref() {
+  if (!base::FeatureList::IsEnabled(kShoppingList) || !IsSignedIn())
+    return;
+
+  is_waiting_for_pref_fetch_completion_ = true;
+  net::NetworkTrafficAnnotationTag traffic_annotation =
+      net::DefineNetworkTrafficAnnotation(
+          "chrome_commerce_price_email_pref_fetcher",
+          R"(
+        semantics {
+          sender: "Chrome Shopping"
+          description:
+            "Check whether the user paused receiving price drop emails."
+            "If it is paused, we need to update the preference value to "
+            "correctly reflect the user's choice in Chrome settings."
+          trigger:
+            "Every time when the user opens the Chrome settings."
+          data:
+            "The request includes an OAuth2 token authenticating the user. The "
+            "response includes a map of commerce notification preference key "
+            "strings to current user opt-in status."
+          destination: GOOGLE_OWNED_SERVICE
+        }
+        policy {
+          cookies_allowed: NO
+          setting:
+            "This fetch is only enabled for users with Sync turned on. "
+            "There's no direct Chromium's setting to disable this, but users "
+            "can manage their preferences in Chrome settings."
+          chrome_policy {
+            SyncDisabled {
+              policy_options {mode: MANDATORY}
+              SyncDisabled: true
+            }
+          }
+        })");
+  auto endpoint_fetcher = std::make_unique<EndpointFetcher>(
+      url_loader_factory_, kOAuthName, GURL(kNotificationsPrefUrl),
+      kGetHttpMethod, kContentType, std::vector<std::string>{kOAuthScope},
+      kTimeoutMs, kEmptyPostData, traffic_annotation, identity_manager_);
+  endpoint_fetcher.get()->Fetch(base::BindOnce(
+      &AccountChecker::HandleFetchPriceEmailPrefResponse,
+      weak_ptr_factory_.GetWeakPtr(), std::move(endpoint_fetcher)));
+}
+
+void AccountChecker::HandleFetchPriceEmailPrefResponse(
+    std::unique_ptr<EndpointFetcher> endpoint_fetcher,
+    std::unique_ptr<EndpointResponse> responses) {
+  data_decoder::DataDecoder::ParseJsonIsolated(
+      responses->response,
+      base::BindOnce(&AccountChecker::OnFetchPriceEmailPrefJsonParsed,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void AccountChecker::OnFetchPriceEmailPrefJsonParsed(
+    data_decoder::DataDecoder::ValueOrError result) {
+  // Only update the pref if we're still waiting for the pref fetch completion.
+  // If users update the pref faster than we hear back from the server fetch,
+  // the fetched result should be discarded.
+  if (pref_service_ && is_waiting_for_pref_fetch_completion_ &&
+      result.has_value() && result->is_dict()) {
+    if (auto* preferences_map = result->FindKey(kPreferencesKey)) {
+      if (auto price_email_pref =
+              preferences_map->FindBoolKey(kPriceTrackEmailPref)) {
+        pref_service_->SetBoolean(kPriceEmailNotificationsEnabled,
+                                  *price_email_pref);
+      }
+    }
+  }
+  is_waiting_for_pref_fetch_completion_ = false;
+}
+
+void AccountChecker::SendPriceEmailPref() {
+  if (!base::FeatureList::IsEnabled(kShoppingList) || !IsSignedIn() ||
+      !pref_service_)
+    return;
+
+  // If users update the pref faster than we hear back from the server fetch,
+  // the fetched result should be discarded.
+  is_waiting_for_pref_fetch_completion_ = false;
+  base::Value preferences_map(base::Value::Type::DICTIONARY);
+  preferences_map.SetBoolKey(
+      kPriceTrackEmailPref,
+      pref_service_->GetBoolean(kPriceEmailNotificationsEnabled));
+  base::Value post_json(base::Value::Type::DICTIONARY);
+  post_json.SetKey(kPreferencesKey, std::move(preferences_map));
+  std::string post_data;
+  base::JSONWriter::Write(post_json, &post_data);
+
+  net::NetworkTrafficAnnotationTag traffic_annotation =
+      net::DefineNetworkTrafficAnnotation(
+          "chrome_commerce_price_email_pref_sender",
+          R"(
+        semantics {
+          sender: "Chrome Shopping"
+          description:
+            "Send the user's choice on whether to receive price drop emails."
+          trigger:
+            "Every time when the user changes their preference in the Chrome "
+            "settings."
+          data:
+            "The map of commerce notification preference key strings to the "
+            "new opt-in status. The request also includes an OAuth2 token "
+            "authenticating the user."
+          destination: GOOGLE_OWNED_SERVICE
+        }
+        policy {
+          cookies_allowed: NO
+          setting:
+            "This request is only enabled for users with Sync turned on. "
+            "There's no direct Chromium's setting to disable this, but users "
+            "can manage their preferences in Chrome settings."
+          chrome_policy {
+            SyncDisabled {
+              policy_options {mode: MANDATORY}
+              SyncDisabled: true
+            }
+          }
+        })");
+  auto endpoint_fetcher = std::make_unique<EndpointFetcher>(
+      url_loader_factory_, kOAuthName, GURL(kNotificationsPrefUrl),
+      kPostHttpMethod, kContentType, std::vector<std::string>{kOAuthScope},
+      kTimeoutMs, post_data, traffic_annotation, identity_manager_);
+  endpoint_fetcher.get()->Fetch(base::BindOnce(
+      &AccountChecker::HandleSendPriceEmailPrefResponse,
+      weak_ptr_factory_.GetWeakPtr(), std::move(endpoint_fetcher)));
+}
+
+void AccountChecker::HandleSendPriceEmailPrefResponse(
+    std::unique_ptr<EndpointFetcher> endpoint_fetcher,
+    std::unique_ptr<EndpointResponse> responses) {
+  data_decoder::DataDecoder::ParseJsonIsolated(
+      responses->response,
+      base::BindOnce(&AccountChecker::OnSendPriceEmailPrefJsonParsed,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void AccountChecker::OnSendPriceEmailPrefJsonParsed(
+    data_decoder::DataDecoder::ValueOrError result) {
+  if (pref_service_ && result.has_value() && result->is_dict()) {
+    if (auto* preferences_map = result->FindKey(kPreferencesKey)) {
+      if (auto price_email_pref =
+              preferences_map->FindBoolKey(kPriceTrackEmailPref)) {
+        if (pref_service_->GetBoolean(kPriceEmailNotificationsEnabled) !=
+            *price_email_pref) {
+          VLOG(1) << "Fail to update the price email pref";
+        }
+      }
+    }
+  }
+}
+
 }  // namespace commerce
diff --git a/components/commerce/core/account_checker.h b/components/commerce/core/account_checker.h
index 75d2ba389e..f2f5b37 100644
--- a/components/commerce/core/account_checker.h
+++ b/components/commerce/core/account_checker.h
@@ -10,9 +10,11 @@
 #include "components/endpoint_fetcher/endpoint_fetcher.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/signin/public/identity_manager/primary_account_change_event.h"
+#include "services/data_decoder/public/cpp/data_decoder.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 class PrefService;
+class PrefChangeRegistrar;
 
 namespace commerce {
 
@@ -38,6 +40,9 @@
       signin::IdentityManager* identity_manager,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
 
+  // Fetch users' pref from server on whether to receive price tracking emails.
+  void FetchPriceEmailPref();
+
  private:
   void OnPrimaryAccountChanged(
       const signin::PrimaryAccountChangeEvent& event_details) override;
@@ -56,6 +61,31 @@
       std::unique_ptr<EndpointFetcher> endpoint_fetcher,
       std::unique_ptr<EndpointResponse> responses);
 
+  // Send users' pref to server on whether to receive price tracking emails.
+  void SendPriceEmailPref();
+
+  void HandleSendPriceEmailPrefResponse(
+      // Passing the endpoint_fetcher ensures the endpoint_fetcher's
+      // lifetime extends to the callback and is not destroyed
+      // prematurely (which would result in cancellation of the request).
+      // TODO(crbug.com/1362026): Avoid passing this fetcher.
+      std::unique_ptr<EndpointFetcher> endpoint_fetcher,
+      std::unique_ptr<EndpointResponse> responses);
+
+  void OnSendPriceEmailPrefJsonParsed(
+      data_decoder::DataDecoder::ValueOrError result);
+
+  void HandleFetchPriceEmailPrefResponse(
+      // Passing the endpoint_fetcher ensures the endpoint_fetcher's
+      // lifetime extends to the callback and is not destroyed
+      // prematurely (which would result in cancellation of the request).
+      // TODO(crbug.com/1362026): Avoid passing this fetcher.
+      std::unique_ptr<EndpointFetcher> endpoint_fetcher,
+      std::unique_ptr<EndpointResponse> responses);
+
+  void OnFetchPriceEmailPrefJsonParsed(
+      data_decoder::DataDecoder::ValueOrError result);
+
   raw_ptr<PrefService> pref_service_;
 
   raw_ptr<signin::IdentityManager> identity_manager_;
@@ -66,6 +96,10 @@
 
   const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
+  std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
+
+  bool is_waiting_for_pref_fetch_completion_;
+
   base::WeakPtrFactory<AccountChecker> weak_ptr_factory_;
 };
 
diff --git a/components/commerce/core/shopping_bookmark_model_observer.cc b/components/commerce/core/shopping_bookmark_model_observer.cc
index 21cec1d..f9a8495 100644
--- a/components/commerce/core/shopping_bookmark_model_observer.cc
+++ b/components/commerce/core/shopping_bookmark_model_observer.cc
@@ -43,30 +43,17 @@
 void ShoppingBookmarkModelObserver::BookmarkNodeChanged(
     bookmarks::BookmarkModel* model,
     const bookmarks::BookmarkNode* node) {
-  std::unique_ptr<power_bookmarks::PowerBookmarkMeta> meta =
-      power_bookmarks::GetNodePowerBookmarkMeta(model, node);
+  if (node_to_url_map_[node->id()] != node->url()) {
+    // If the URL did change, clear the power bookmark shopping meta and
+    // unsubscribe if needed.
+    std::unique_ptr<power_bookmarks::PowerBookmarkMeta> meta =
+        power_bookmarks::GetNodePowerBookmarkMeta(model, node);
 
-  if (meta && meta->has_shopping_specifics()) {
-    power_bookmarks::ShoppingSpecifics* specifics =
-        meta->mutable_shopping_specifics();
-    uint64_t cluster_id = specifics->product_cluster_id();
+    if (meta && meta->has_shopping_specifics()) {
+      power_bookmarks::ShoppingSpecifics* specifics =
+          meta->mutable_shopping_specifics();
 
-    // If the changed bookmark is a shopping item, we check its tracking status
-    // with local subscriptions and if inconsistent, we need to sync local
-    // subscriptions with the server. This is mainly used to keep local
-    // subscriptions up to date when users operate on multiple devices.
-    if (subscriptions_manager_) {
-      CommerceSubscription sub(
-          SubscriptionType::kPriceTrack, IdentifierType::kProductClusterId,
-          base::NumberToString(cluster_id), ManagementType::kUserManaged);
-
-      subscriptions_manager_->VerifyIfSubscriptionExists(
-          std::move(sub), specifics->is_price_tracked());
-    }
-
-    if (node_to_url_map_[node->id()] != node->url()) {
-      // If the URL did change, clear the power bookmark shopping meta and
-      // unsubscribe if needed.
+      uint64_t cluster_id = specifics->product_cluster_id();
       meta->clear_shopping_specifics();
       power_bookmarks::SetNodePowerBookmarkMeta(model, node, std::move(meta));
 
@@ -116,4 +103,28 @@
                                    base::BindOnce([](bool success) {}));
 }
 
+void ShoppingBookmarkModelObserver::BookmarkMetaInfoChanged(
+    bookmarks::BookmarkModel* model,
+    const bookmarks::BookmarkNode* node) {
+  std::unique_ptr<power_bookmarks::PowerBookmarkMeta> meta =
+      power_bookmarks::GetNodePowerBookmarkMeta(model, node);
+
+  // If the changed bookmark is a shopping item, we check its tracking status
+  // with local subscriptions and if inconsistent, we need to sync local
+  // subscriptions with the server. This is mainly used to keep local
+  // subscriptions up to date when users operate on multiple devices.
+  if (meta && meta->has_shopping_specifics() && subscriptions_manager_) {
+    power_bookmarks::ShoppingSpecifics* specifics =
+        meta->mutable_shopping_specifics();
+    uint64_t cluster_id = specifics->product_cluster_id();
+
+    CommerceSubscription sub(
+        SubscriptionType::kPriceTrack, IdentifierType::kProductClusterId,
+        base::NumberToString(cluster_id), ManagementType::kUserManaged);
+
+    subscriptions_manager_->VerifyIfSubscriptionExists(
+        std::move(sub), specifics->is_price_tracked());
+  }
+}
+
 }  // namespace commerce
diff --git a/components/commerce/core/shopping_bookmark_model_observer.h b/components/commerce/core/shopping_bookmark_model_observer.h
index 3bda2db..0c32d3e 100644
--- a/components/commerce/core/shopping_bookmark_model_observer.h
+++ b/components/commerce/core/shopping_bookmark_model_observer.h
@@ -57,6 +57,9 @@
                            const bookmarks::BookmarkNode* node,
                            const std::set<GURL>& removed_urls) override;
 
+  void BookmarkMetaInfoChanged(bookmarks::BookmarkModel* model,
+                               const bookmarks::BookmarkNode* node) override;
+
  private:
   base::raw_ptr<ShoppingService> shopping_service_;
 
diff --git a/components/commerce/core/shopping_service.cc b/components/commerce/core/shopping_service.cc
index 602cd08..6ffde1f0 100644
--- a/components/commerce/core/shopping_service.cc
+++ b/components/commerce/core/shopping_service.cc
@@ -645,6 +645,12 @@
                                       std::move(callback));
 }
 
+void ShoppingService::FetchPriceEmailPref() {
+  if (account_checker_) {
+    account_checker_->FetchPriceEmailPref();
+  }
+}
+
 base::WeakPtr<ShoppingService> ShoppingService::AsWeakPtr() {
   return weak_ptr_factory_.GetWeakPtr();
 }
diff --git a/components/commerce/core/shopping_service.h b/components/commerce/core/shopping_service.h
index 151dc85..d23a68c 100644
--- a/components/commerce/core/shopping_service.h
+++ b/components/commerce/core/shopping_service.h
@@ -207,6 +207,9 @@
       std::unique_ptr<std::vector<CommerceSubscription>> subscriptions,
       base::OnceCallback<void(bool)> callback);
 
+  // Fetch users' pref from server on whether to receive price tracking emails.
+  void FetchPriceEmailPref();
+
   // Get a weak pointer for this service instance.
   base::WeakPtr<ShoppingService> AsWeakPtr();
 
diff --git a/components/commerce/core/subscriptions/subscriptions_server_proxy.cc b/components/commerce/core/subscriptions/subscriptions_server_proxy.cc
index edcc5ef7..fe70cdb 100644
--- a/components/commerce/core/subscriptions/subscriptions_server_proxy.cc
+++ b/components/commerce/core/subscriptions/subscriptions_server_proxy.cc
@@ -336,13 +336,14 @@
 base::Value SubscriptionsServerProxy::Serialize(
     const CommerceSubscription& subscription) {
   base::Value subscription_json(base::Value::Type::DICTIONARY);
-  subscription_json.SetIntKey(kSubscriptionTypeKey,
-                              static_cast<int>(subscription.type));
-  subscription_json.SetIntKey(kSubscriptionIdTypeKey,
-                              static_cast<int>(subscription.id_type));
+  subscription_json.SetStringKey(kSubscriptionTypeKey,
+                                 SubscriptionTypeToString(subscription.type));
+  subscription_json.SetStringKey(
+      kSubscriptionIdTypeKey, SubscriptionIdTypeToString(subscription.id_type));
   subscription_json.SetStringKey(kSubscriptionIdKey, subscription.id);
-  subscription_json.SetIntKey(kSubscriptionManagementTypeKey,
-                              static_cast<int>(subscription.management_type));
+  subscription_json.SetStringKey(
+      kSubscriptionManagementTypeKey,
+      SubscriptionManagementTypeToString(subscription.management_type));
   if (auto seen_offer = subscription.user_seen_offer) {
     base::Value seen_offer_json(base::Value::Type::DICTIONARY);
     seen_offer_json.SetStringKey(kSeenOfferIdKey, seen_offer->offer_id);
@@ -359,16 +360,17 @@
 absl::optional<CommerceSubscription> SubscriptionsServerProxy::Deserialize(
     const base::Value& value) {
   if (value.is_dict()) {
-    auto type = value.FindIntKey(kSubscriptionTypeKey);
-    auto id_type = value.FindIntKey(kSubscriptionIdTypeKey);
+    auto* type = value.FindStringKey(kSubscriptionTypeKey);
+    auto* id_type = value.FindStringKey(kSubscriptionIdTypeKey);
     auto* id = value.FindStringKey(kSubscriptionIdKey);
-    auto management_type = value.FindIntKey(kSubscriptionManagementTypeKey);
+    auto* management_type = value.FindStringKey(kSubscriptionManagementTypeKey);
     auto timestamp =
         base::ValueToInt64(value.FindKey(kSubscriptionTimestampKey));
     if (type && id_type && id && management_type && timestamp) {
       return absl::make_optional<CommerceSubscription>(
-          SubscriptionType(*type), IdentifierType(*id_type), *id,
-          ManagementType(*management_type), *timestamp);
+          StringToSubscriptionType(*type), StringToSubscriptionIdType(*id_type),
+          *id, StringToSubscriptionManagementType(*management_type),
+          *timestamp);
     }
   }
 
diff --git a/components/commerce/core/subscriptions/subscriptions_server_proxy_unittest.cc b/components/commerce/core/subscriptions/subscriptions_server_proxy_unittest.cc
index 83b2ec5..8c95cbf 100644
--- a/components/commerce/core/subscriptions/subscriptions_server_proxy_unittest.cc
+++ b/components/commerce/core/subscriptions/subscriptions_server_proxy_unittest.cc
@@ -50,9 +50,12 @@
 
 const std::string kExpectedPostDataForCreate =
     "{\"createShoppingSubscriptionsParams\":{\"subscriptions\":[{"
-    "\"identifier\":\"111\",\"identifierType\":2,\"managementType\":2,\"type\":"
-    "1},{\"identifier\":\"222\",\"identifierType\":2,\"managementType\":2,"
-    "\"type\":1,\"userSeenOffer\":{\"countryCode\":\"us\",\"offerId\":\"333\","
+    "\"identifier\":\"111\",\"identifierType\":\"PRODUCT_CLUSTER_ID\","
+    "\"managementType\":\"USER_MANAGED\",\"type\":"
+    "\"PRICE_TRACK\"},{\"identifier\":\"222\",\"identifierType\":\"PRODUCT_"
+    "CLUSTER_ID\",\"managementType\":\"USER_MANAGED\","
+    "\"type\":\"PRICE_TRACK\",\"userSeenOffer\":{\"countryCode\":\"us\","
+    "\"offerId\":\"333\","
     "\"seenPriceMicros\":\"100\"}}]}}";
 const std::string kExpectedPostDataForDelete =
     "{\"removeShoppingSubscriptionsParams\":{\"eventTimestampMicros\":["
@@ -61,8 +64,9 @@
 const std::string kResponseFailed = "{ \"status\": { \"code\": 1 } }";
 const std::string kValidGetResponse =
     "{\"subscriptions\":[{"
-    "\"identifier\":\"111\",\"identifierType\":2,\"managementType\":2,\"type\":"
-    "1,\"eventTimestampMicros\":\"123456\"}]}";
+    "\"identifier\":\"111\",\"identifierType\":\"PRODUCT_CLUSTER_ID\","
+    "\"managementType\":\"USER_MANAGED\",\"type\":"
+    "\"PRICE_TRACK\",\"eventTimestampMicros\":\"123456\"}]}";
 
 // Build a subscription list consisting of two subscriptions.
 std::unique_ptr<std::vector<commerce::CommerceSubscription>>
diff --git a/components/content_creation/notes/core/note_prefs.cc b/components/content_creation/notes/core/note_prefs.cc
index 6f58130..ef9b8bd 100644
--- a/components/content_creation/notes/core/note_prefs.cc
+++ b/components/content_creation/notes/core/note_prefs.cc
@@ -47,7 +47,7 @@
   }
 
   std::vector<NoteTemplateIds> template_ids;
-  for (const base::Value& current_value : stored_value.GetListDeprecated()) {
+  for (const base::Value& current_value : stored_value.GetList()) {
     absl::optional<int> maybe_int = current_value.GetIfInt();
     if (!maybe_int) {
       continue;
diff --git a/components/desks_storage/core/desk_model.cc b/components/desks_storage/core/desk_model.cc
index 5c70abb..50716c2f 100644
--- a/components/desks_storage/core/desk_model.cc
+++ b/components/desks_storage/core/desk_model.cc
@@ -83,7 +83,7 @@
     return;
   }
 
-  for (auto& desk_template : parsed_list->GetListDeprecated()) {
+  for (auto& desk_template : parsed_list->GetList()) {
     std::unique_ptr<ash::DeskTemplate> dt =
         desk_template_conversion::ParseDeskTemplateFromSource(
             desk_template, ash::DeskTemplateSource::kPolicy);
diff --git a/components/desks_storage/core/desk_template_conversion.cc b/components/desks_storage/core/desk_template_conversion.cc
index 9585042..62db6da 100644
--- a/components/desks_storage/core/desk_template_conversion.cc
+++ b/components/desks_storage/core/desk_template_conversion.cc
@@ -458,7 +458,7 @@
     app_launch_info->urls.emplace();
     const base::Value* tabs = app.FindKeyOfType(kTabs, base::Value::Type::LIST);
     if (tabs) {
-      for (auto& tab : tabs->GetListDeprecated()) {
+      for (auto& tab : tabs->GetList()) {
         std::string url;
         if (GetString(tab, kTabUrl, &url)) {
           app_launch_info->urls.value().emplace_back(url);
@@ -631,7 +631,7 @@
 
   const base::Value* apps = desk->FindListKey(kApps);
   if (apps) {
-    for (const auto& app : apps->GetListDeprecated()) {
+    for (const auto& app : apps->GetList()) {
       std::unique_ptr<app_restore::AppLaunchInfo> app_launch_info =
           ConvertJsonToAppLaunchInfo(app);
       if (!app_launch_info)
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc
index acffa85..15df013 100644
--- a/components/feature_engagement/public/feature_configurations.cc
+++ b/components/feature_engagement/public/feature_configurations.cc
@@ -151,6 +151,23 @@
     return config;
   }
 
+  if (kIPHHighEfficiencyModeFeature.name == feature->name) {
+    absl::optional<FeatureConfig> config = FeatureConfig();
+    config->valid = true;
+    config->availability = Comparator(ANY, 0);
+    config->session_rate = Comparator(ANY, 0);
+    // Show the promo max 3 times, once per day.
+    config->trigger = EventConfig("high_efficiency_prompt_in_trigger",
+                                  Comparator(LESS_THAN, 1), 1, 360);
+    // This event is never logged but is included for consistency.
+    config->used = EventConfig("high_efficiency_prompt_in_used",
+                               Comparator(EQUAL, 0), 360, 360);
+    config->event_configs.insert(
+        EventConfig("high_efficiency_prompt_in_trigger",
+                    Comparator(LESS_THAN, 3), 360, 360));
+    return config;
+  }
+
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) ||
         // BUILDFLAG(IS_CHROMEOS)
 
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc
index 1136858..6be80a5b 100644
--- a/components/feature_engagement/public/feature_constants.cc
+++ b/components/feature_engagement/public/feature_constants.cc
@@ -46,6 +46,9 @@
 BASE_FEATURE(kIPHHighEfficiencyInfoModeFeature,
              "IPH_HighEfficiencyInfoMode",
              base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kIPHHighEfficiencyModeFeature,
+             "IPH_HighEfficiencyMode",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kIPHLiveCaptionFeature,
              "IPH_LiveCaption",
              base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h
index ea7e451..e6a67125 100644
--- a/components/feature_engagement/public/feature_constants.h
+++ b/components/feature_engagement/public/feature_constants.h
@@ -40,6 +40,7 @@
 BASE_DECLARE_FEATURE(kIPHFocusHelpBubbleScreenReaderPromoFeature);
 BASE_DECLARE_FEATURE(kIPHGMCCastStartStopFeature);
 BASE_DECLARE_FEATURE(kIPHHighEfficiencyInfoModeFeature);
+BASE_DECLARE_FEATURE(kIPHHighEfficiencyModeFeature);
 BASE_DECLARE_FEATURE(kIPHLiveCaptionFeature);
 BASE_DECLARE_FEATURE(kIPHTabAudioMutingFeature);
 BASE_DECLARE_FEATURE(kIPHPasswordsAccountStorageFeature);
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc
index 245392e..3b0780de 100644
--- a/components/feature_engagement/public/feature_list.cc
+++ b/components/feature_engagement/public/feature_list.cc
@@ -125,6 +125,7 @@
     &kIPHFocusHelpBubbleScreenReaderPromoFeature,
     &kIPHGMCCastStartStopFeature,
     &kIPHHighEfficiencyInfoModeFeature,
+    &kIPHHighEfficiencyModeFeature,
     &kIPHLiveCaptionFeature,
     &kIPHTabAudioMutingFeature,
     &kIPHPasswordsAccountStorageFeature,
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h
index dcfae8bb..8143c82 100644
--- a/components/feature_engagement/public/feature_list.h
+++ b/components/feature_engagement/public/feature_list.h
@@ -226,6 +226,7 @@
 DEFINE_VARIATION_PARAM(kIPHGMCCastStartStopFeature, "IPH_GMCCastStartStop");
 DEFINE_VARIATION_PARAM(kIPHHighEfficiencyInfoModeFeature,
                        "IPH_HighEfficiencyInfoMode");
+DEFINE_VARIATION_PARAM(kIPHHighEfficiencyModeFeature, "IPH_HighEfficiencyMode");
 DEFINE_VARIATION_PARAM(kIPHLiveCaption, "IPH_LiveCaption");
 DEFINE_VARIATION_PARAM(kIPHPasswordsAccountStorageFeature,
                        "IPH_PasswordsAccountStorage");
@@ -365,6 +366,7 @@
         VARIATION_ENTRY(kIPHGlobalMediaControls),
         VARIATION_ENTRY(kIPHGMCCastStartStopFeature),
         VARIATION_ENTRY(kIPHHighEfficiencyInfoModeFeature),
+        VARIATION_ENTRY(kIPHHighEfficiencyModeFeature),
         VARIATION_ENTRY(kIPHLiveCaption),
         VARIATION_ENTRY(kIPHPasswordsAccountStorageFeature),
         VARIATION_ENTRY(kIPHReadingListDiscoveryFeature),
diff --git a/components/feed/feed_feature_list.cc b/components/feed/feed_feature_list.cc
index 0d1ed3e..4efb6bd44 100644
--- a/components/feed/feed_feature_list.cc
+++ b/components/feed/feed_feature_list.cc
@@ -15,22 +15,27 @@
 
 namespace feed {
 
-const base::Feature kInterestFeedContentSuggestions{
-    "InterestFeedContentSuggestions", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kInterestFeedContentSuggestions,
+             "InterestFeedContentSuggestions",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 // InterestFeedV2 takes precedence over InterestFeedContentSuggestions.
 // InterestFeedV2 is cached in ChromeCachedFlags. If the default value here is
 // changed, please update the cached one's default value in CachedFeatureFlags.
-const base::Feature kInterestFeedV2{"InterestFeedV2",
-                                    base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kInterestFeedV2,
+             "InterestFeedV2",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
-const base::Feature kInterestFeedV2Autoplay{"InterestFeedV2Autoplay",
-                                            base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kInterestFeedV2Autoplay,
+             "InterestFeedV2Autoplay",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kInterestFeedV2Hearts{"InterestFeedV2Hearts",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kInterestFeedV2Hearts,
+             "InterestFeedV2Hearts",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kInterestFeedV2Scrolling{"InterestFeedV2Scrolling",
-                                             base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kInterestFeedV2Scrolling,
+             "InterestFeedV2Scrolling",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 const base::FeatureParam<std::string> kDisableTriggerTypes{
     &kInterestFeedContentSuggestions, "disable_trigger_types", ""};
@@ -44,56 +49,66 @@
     &kInterestFeedContentSuggestions,
     "only_set_last_refresh_attempt_on_success", true};
 
-const base::Feature kInterestFeedV1ClicksAndViewsConditionalUpload{
-    "InterestFeedV1ClickAndViewActionsConditionalUpload",
-    base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kInterestFeedV2ClicksAndViewsConditionalUpload{
-    "InterestFeedV2ClickAndViewActionsConditionalUpload",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kInterestFeedV1ClicksAndViewsConditionalUpload,
+             "InterestFeedV1ClickAndViewActionsConditionalUpload",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kInterestFeedV2ClicksAndViewsConditionalUpload,
+             "InterestFeedV2ClickAndViewActionsConditionalUpload",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 #if BUILDFLAG(IS_IOS)
-const base::Feature kInterestFeedNoticeCardAutoDismiss{
-    "InterestFeedNoticeCardAutoDismiss", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kInterestFeedNoticeCardAutoDismiss,
+             "InterestFeedNoticeCardAutoDismiss",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 #endif
 
-const base::Feature kWebFeed{"WebFeed", base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kDiscoFeedEndpoint{"DiscoFeedEndpoint",
-                                       base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kXsurfaceMetricsReporting{
-    "XsurfaceMetricsReporting", base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kReliabilityLogging{"FeedReliabilityLogging",
-                                        base::FEATURE_ENABLED_BY_DEFAULT};
-const base::Feature kFeedInteractiveRefresh{"FeedInteractiveRefresh",
-                                            base::FEATURE_ENABLED_BY_DEFAULT};
-const base::Feature kFeedLoadingPlaceholder{"FeedLoadingPlaceholder",
-                                            base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kWebFeed, "WebFeed", base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kDiscoFeedEndpoint,
+             "DiscoFeedEndpoint",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kXsurfaceMetricsReporting,
+             "XsurfaceMetricsReporting",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kReliabilityLogging,
+             "FeedReliabilityLogging",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kFeedInteractiveRefresh,
+             "FeedInteractiveRefresh",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kFeedLoadingPlaceholder,
+             "FeedLoadingPlaceholder",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 const base::FeatureParam<bool>
     kEnableFeedLoadingPlaceholderAnimationOnInstantStart{
         &kFeedLoadingPlaceholder, "enable_animation_on_instant_start", false};
-const base::Feature kFeedImageMemoryCacheSizePercentage{
-    "FeedImageMemoryCacheSizePercentage", base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kFeedClearImageMemoryCache{
-    "FeedClearImageMemoryCache", base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kFeedBackToTop{"FeedBackToTop",
-                                   base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kFeedStamp{"FeedStamp", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kFeedImageMemoryCacheSizePercentage,
+             "FeedImageMemoryCacheSizePercentage",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kFeedClearImageMemoryCache,
+             "FeedClearImageMemoryCache",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kFeedBackToTop,
+             "FeedBackToTop",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kFeedStamp, "FeedStamp", base::FEATURE_DISABLED_BY_DEFAULT);
 
 const char kDefaultReferrerUrl[] = "https://www.google.com/";
 
-const base::Feature kWebFeedAwareness{"WebFeedAwareness",
-                                      base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kWebFeedAwareness,
+             "WebFeedAwareness",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kWebFeedOnboarding{"WebFeedOnboarding",
-                                       base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kWebFeedOnboarding,
+             "WebFeedOnboarding",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kWebFeedSort{"WebFeedSort",
-                                 base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kWebFeedSort, "WebFeedSort", base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kEnableOpenInNewTabFromStartSurfaceFeed{
-    "EnableOpenInNewTabFromStartSurfaceFeed",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kEnableOpenInNewTabFromStartSurfaceFeed,
+             "EnableOpenInNewTabFromStartSurfaceFeed",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kWebUiFeed{"FeedWebUi", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kWebUiFeed, "FeedWebUi", base::FEATURE_DISABLED_BY_DEFAULT);
 const base::FeatureParam<std::string> kWebUiFeedUrl{
     &kWebUiFeed, "feedurl", "https://www.google.com/feed-api/following"};
 const base::FeatureParam<bool> kWebUiDisableContentSecurityPolicy{
@@ -108,11 +123,13 @@
   return referrer.empty() ? kDefaultReferrerUrl : referrer;
 }
 
-const base::Feature kPersonalizeFeedUnsignedUsers{
-    "PersonalizeFeedUnsignedUsers", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kPersonalizeFeedUnsignedUsers,
+             "PersonalizeFeedUnsignedUsers",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kPersonalizeFeedNonSyncUsers{
-    "PersonalizeFeedNonSyncUsers", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kPersonalizeFeedNonSyncUsers,
+             "PersonalizeFeedNonSyncUsers",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 signin::ConsentLevel GetConsentLevelNeededForPersonalizedFeed() {
   if (!base::FeatureList::IsEnabled(kPersonalizeFeedNonSyncUsers))
@@ -120,27 +137,32 @@
   return signin::ConsentLevel::kSignin;
 }
 
-const base::Feature kInfoCardAcknowledgementTracking{
-    "InfoCardAcknowledgementTracking", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kInfoCardAcknowledgementTracking,
+             "InfoCardAcknowledgementTracking",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kShareCrowButton{"ShareCrowButton",
-                                     base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kShareCrowButton,
+             "ShareCrowButton",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kIsAblated{"FeedAblation",
-                               base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kIsAblated, "FeedAblation", base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kFeedCloseRefresh{"FeedCloseRefresh",
-                                      base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kFeedCloseRefresh,
+             "FeedCloseRefresh",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 const base::FeatureParam<int> kFeedCloseRefreshDelayMinutes{
     &kFeedCloseRefresh, "delay_minutes", 30};
 const base::FeatureParam<bool> kFeedCloseRefreshRequireInteraction{
     &kFeedCloseRefresh, "require_interaction", false};
 
-const base::Feature kFeedNoViewCache{"FeedNoViewCache",
-                                     base::FEATURE_ENABLED_BY_DEFAULT};
-const base::Feature kFeedReplaceAll{"FeedReplaceAll",
-                                    base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kFeedVideoInlinePlayback{"FeedVideoInlinePlayback",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kFeedNoViewCache,
+             "FeedNoViewCache",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kFeedReplaceAll,
+             "FeedReplaceAll",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kFeedVideoInlinePlayback,
+             "FeedVideoInlinePlayback",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 }  // namespace feed
diff --git a/components/feed/feed_feature_list.h b/components/feed/feed_feature_list.h
index dd10698..94bf105 100644
--- a/components/feed/feed_feature_list.h
+++ b/components/feed/feed_feature_list.h
@@ -16,11 +16,11 @@
 
 namespace feed {
 
-extern const base::Feature kInterestFeedContentSuggestions;
-extern const base::Feature kInterestFeedV2;
-extern const base::Feature kInterestFeedV2Autoplay;
-extern const base::Feature kInterestFeedV2Hearts;
-extern const base::Feature kInterestFeedV2Scrolling;
+BASE_DECLARE_FEATURE(kInterestFeedContentSuggestions);
+BASE_DECLARE_FEATURE(kInterestFeedV2);
+BASE_DECLARE_FEATURE(kInterestFeedV2Autoplay);
+BASE_DECLARE_FEATURE(kInterestFeedV2Hearts);
+BASE_DECLARE_FEATURE(kInterestFeedV2Scrolling);
 
 extern const base::FeatureParam<std::string> kDisableTriggerTypes;
 extern const base::FeatureParam<int> kSuppressRefreshDurationMinutes;
@@ -34,34 +34,34 @@
 // click and view actions in the feed (e.g., the user needs to view X cards).
 // For example, this is needed when the notice card is at the second position in
 // the feed.
-extern const base::Feature kInterestFeedV1ClicksAndViewsConditionalUpload;
-extern const base::Feature kInterestFeedV2ClicksAndViewsConditionalUpload;
+BASE_DECLARE_FEATURE(kInterestFeedV1ClicksAndViewsConditionalUpload);
+BASE_DECLARE_FEATURE(kInterestFeedV2ClicksAndViewsConditionalUpload);
 
 // Feature that allows the client to automatically dismiss the notice card based
 // on the clicks and views on the notice card.
 #if BUILDFLAG(IS_IOS)
-extern const base::Feature kInterestFeedNoticeCardAutoDismiss;
+BASE_DECLARE_FEATURE(kInterestFeedNoticeCardAutoDismiss);
 #endif
 
 // Feature that allows users to keep up with and consume web content.
-extern const base::Feature kWebFeed;
+BASE_DECLARE_FEATURE(kWebFeed);
 
 // Use the new DiscoFeed endpoint.
-extern const base::Feature kDiscoFeedEndpoint;
+BASE_DECLARE_FEATURE(kDiscoFeedEndpoint);
 
 // Feature that enables xsurface to provide the metrics reporting state to an
 // xsurface feed.
-extern const base::Feature kXsurfaceMetricsReporting;
+BASE_DECLARE_FEATURE(kXsurfaceMetricsReporting);
 
 // Whether to log reliability events.
-extern const base::Feature kReliabilityLogging;
+BASE_DECLARE_FEATURE(kReliabilityLogging);
 
 // Feature that enables refreshing feeds triggered by the users.
-extern const base::Feature kFeedInteractiveRefresh;
+BASE_DECLARE_FEATURE(kFeedInteractiveRefresh);
 
 // Feature that shows placeholder cards instead of a loading spinner at first
 // load.
-extern const base::Feature kFeedLoadingPlaceholder;
+BASE_DECLARE_FEATURE(kFeedLoadingPlaceholder);
 
 // Param allowing animations to be disabled when showing the placeholder on
 // instant start.
@@ -70,62 +70,62 @@
 
 // Feature that allows tuning the size of the image memory cache. Value is a
 // percentage of the maximum size calculated for the device.
-extern const base::Feature kFeedImageMemoryCacheSizePercentage;
+BASE_DECLARE_FEATURE(kFeedImageMemoryCacheSizePercentage);
 
 // Feature that enables clearing the image memory cache when the feed is
 // destroyed.
-extern const base::Feature kFeedClearImageMemoryCache;
+BASE_DECLARE_FEATURE(kFeedClearImageMemoryCache);
 
 // Feature that enables showing a callout to help users return to the top of the
 // feeds quickly.
-extern const base::Feature kFeedBackToTop;
+BASE_DECLARE_FEATURE(kFeedBackToTop);
 
 // Feature that enables StAMP cards in the feed.
-extern const base::Feature kFeedStamp;
+BASE_DECLARE_FEATURE(kFeedStamp);
 
 // Feature that provides the user assistance in discovering the web feed.
-extern const base::Feature kWebFeedAwareness;
+BASE_DECLARE_FEATURE(kWebFeedAwareness);
 
 // Feature that provides the user assistance in using the web feed.
-extern const base::Feature kWebFeedOnboarding;
+BASE_DECLARE_FEATURE(kWebFeedOnboarding);
 
 // Feature that enables sorting by different heuristics in the web feed.
-extern const base::Feature kWebFeedSort;
+BASE_DECLARE_FEATURE(kWebFeedSort);
 
 // Feature that causes the "open in new tab" menu item to appear on feed items
 // on Start Surface.
-extern const base::Feature kEnableOpenInNewTabFromStartSurfaceFeed;
+BASE_DECLARE_FEATURE(kEnableOpenInNewTabFromStartSurfaceFeed);
 
 // Feature that causes the WebUI version of the Feed to be enabled.
-extern const base::Feature kWebUiFeed;
+BASE_DECLARE_FEATURE(kWebUiFeed);
 extern const base::FeatureParam<std::string> kWebUiFeedUrl;
 extern const base::FeatureParam<bool> kWebUiDisableContentSecurityPolicy;
 
 std::string GetFeedReferrerUrl();
 
 // Personalize feed for unsigned users.
-extern const base::Feature kPersonalizeFeedUnsignedUsers;
+BASE_DECLARE_FEATURE(kPersonalizeFeedUnsignedUsers);
 
 // Personalize feed for signed in users who haven't enabled sync.
-extern const base::Feature kPersonalizeFeedNonSyncUsers;
+BASE_DECLARE_FEATURE(kPersonalizeFeedNonSyncUsers);
 
 // Returns the consent level needed to request a personalized feed.
 signin::ConsentLevel GetConsentLevelNeededForPersonalizedFeed();
 
 // Feature that enables tracking the acknowledgement state for the info cards.
-extern const base::Feature kInfoCardAcknowledgementTracking;
+BASE_DECLARE_FEATURE(kInfoCardAcknowledgementTracking);
 
 // Feature that enables the Crow feature.
 // Owned by the CwF team but located here until it makes sense to create a crow
 // component, since it is being used in the feed component.
-extern const base::Feature kShareCrowButton;
+BASE_DECLARE_FEATURE(kShareCrowButton);
 
 // Feature that when enabled completely removes all Feeds from chrome.
-extern const base::Feature kIsAblated;
+BASE_DECLARE_FEATURE(kIsAblated);
 
 // When enabled, schedule a background refresh for a feed sometime after the
 // last user engagement with that feed.
-extern const base::Feature kFeedCloseRefresh;
+BASE_DECLARE_FEATURE(kFeedCloseRefresh);
 // On each qualifying user engagement, schedule a background refresh this many
 // minutes out.
 extern const base::FeatureParam<int> kFeedCloseRefreshDelayMinutes;
@@ -134,12 +134,12 @@
 extern const base::FeatureParam<bool> kFeedCloseRefreshRequireInteraction;
 
 // When enabled, no view cache is used.
-extern const base::Feature kFeedNoViewCache;
+BASE_DECLARE_FEATURE(kFeedNoViewCache);
 // When enabled, replace all items.
-extern const base::Feature kFeedReplaceAll;
+BASE_DECLARE_FEATURE(kFeedReplaceAll);
 
 // When enabled, play the feed video via inline playback.
-extern const base::Feature kFeedVideoInlinePlayback;
+BASE_DECLARE_FEATURE(kFeedVideoInlinePlayback);
 
 }  // namespace feed
 
diff --git a/components/flags_ui/flags_test_helpers.cc b/components/flags_ui/flags_test_helpers.cc
index 454dd3c..7b10e2f 100644
--- a/components/flags_ui/flags_test_helpers.cc
+++ b/components/flags_ui/flags_test_helpers.cc
@@ -68,11 +68,11 @@
   base::Value metadata_json = FileContents(FlagFile::kFlagMetadata);
 
   FlagMetadataMap metadata;
-  for (const auto& entry : metadata_json.GetListDeprecated()) {
+  for (const auto& entry : metadata_json.GetList()) {
     std::string name = entry.FindKey("name")->GetString();
     std::vector<std::string> owners;
     if (const base::Value* e = entry.FindKey("owners")) {
-      for (const auto& owner : e->GetListDeprecated())
+      for (const auto& owner : e->GetList())
         owners.push_back(owner.GetString());
     }
     int expiry_milestone = entry.FindKey("expiry_milestone")->GetInt();
@@ -86,7 +86,7 @@
   base::Value list_json = FileContents(FlagFile::kFlagNeverExpire);
 
   std::vector<std::string> result;
-  for (const auto& entry : list_json.GetListDeprecated()) {
+  for (const auto& entry : list_json.GetList()) {
     result.push_back(entry.GetString());
   }
   return result;
@@ -275,7 +275,7 @@
 
   std::vector<std::string> normalized_names;
   std::vector<std::string> names;
-  for (const auto& entry : metadata_json.GetListDeprecated()) {
+  for (const auto& entry : metadata_json.GetList()) {
     normalized_names.push_back(
         NormalizeName(entry.FindKey("name")->GetString()));
     names.push_back(entry.FindKey("name")->GetString());
@@ -287,7 +287,7 @@
 
   normalized_names.clear();
   names.clear();
-  for (const auto& entry : expiration_json.GetListDeprecated()) {
+  for (const auto& entry : expiration_json.GetList()) {
     normalized_names.push_back(NormalizeName(entry.GetString()));
     names.push_back(entry.GetString());
   }
diff --git a/components/flags_ui/resources/flags.ts b/components/flags_ui/resources/flags.ts
index 3317986..5f1093ef 100644
--- a/components/flags_ui/resources/flags.ts
+++ b/components/flags_ui/resources/flags.ts
@@ -13,7 +13,7 @@
 import {isIOS, sendWithPromise} from 'chrome://resources/js/cr.m.js';
 import {FocusOutlineManager} from 'chrome://resources/js/cr/ui/focus_outline_manager.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
 import {$} from 'chrome://resources/js/util.m.js';
 
 let lastChanged: HTMLElement|null = null;
diff --git a/components/history/core/browser/browsing_history_service.cc b/components/history/core/browser/browsing_history_service.cc
index 2534a6d..9dece5d 100644
--- a/components/history/core/browser/browsing_history_service.cc
+++ b/components/history/core/browser/browsing_history_service.cc
@@ -689,22 +689,22 @@
     has_synced_results_ = true;
     if (const base::Value* events = results_value->FindListKey("event")) {
       state->remote_results.reserve(state->remote_results.size() +
-                                    events->GetListDeprecated().size());
+                                    events->GetList().size());
       std::string host_name_utf8 = base::UTF16ToUTF8(state->search_text);
-      for (const base::Value& event : events->GetListDeprecated()) {
+      for (const base::Value& event : events->GetList()) {
         if (!event.is_dict())
           continue;
         const base::Value* results = event.FindListKey("result");
-        if (!results || results->GetListDeprecated().empty())
+        if (!results || results->GetList().empty())
           continue;
-        const base::Value& result = results->GetListDeprecated()[0];
+        const base::Value& result = results->GetList()[0];
         if (!result.is_dict())
           continue;
         const std::string* url = result.FindStringKey("url");
         if (!url)
           continue;
         const base::Value* ids = result.FindListKey("id");
-        if (!ids || ids->GetListDeprecated().empty())
+        if (!ids || ids->GetList().empty())
           continue;
 
         GURL gurl(*url);
@@ -731,7 +731,7 @@
 
         // Extract the timestamps of all the visits to this URL.
         // They are referred to as "IDs" by the server.
-        for (const base::Value& id : ids->GetListDeprecated()) {
+        for (const base::Value& id : ids->GetList()) {
           const std::string* timestamp_string;
           int64_t timestamp_usec = 0;
 
diff --git a/components/history_clusters_strings.grdp b/components/history_clusters_strings.grdp
index a0d86c2..ac9907d 100644
--- a/components/history_clusters_strings.grdp
+++ b/components/history_clusters_strings.grdp
@@ -73,7 +73,7 @@
   <message name="IDS_HISTORY_CLUSTERS_SHOW_LESS_BUTTON_LABEL" desc="A label for the button that collapses the view showing fewer history items.">
     Show less
   </message>
-  <message name="IDS_HISTORY_CLUSTERS_SHOW_MORE_BUTTON_LABEL" desc="A label for the button that expands the view showing more history items.">
+  <message name="IDS_HISTORY_CLUSTERS_SHOW_MORE_BUTTON_LABEL" desc="A label for the button that expands the view showing more history items." formatter_data="android_java">
     Show more
   </message>
   <message name="IDS_HISTORY_CLUSTERS_SEARCH_YOUR_JOURNEYS" desc="A label for the hint text for the search box in Chrome Journeys." formatter_data="android_java">
diff --git a/components/live_caption/views/caption_bubble.cc b/components/live_caption/views/caption_bubble.cc
index 7a4586c..a7db143 100644
--- a/components/live_caption/views/caption_bubble.cc
+++ b/components/live_caption/views/caption_bubble.cc
@@ -986,9 +986,9 @@
   media_foundation_renderer_error_checkbox_->SetCheckedIconImageColor(
       color_provider->GetColor(ui::kColorLiveCaptionBubbleCheckbox));
 #endif
-  views::SetImageFromVectorIconWithColor(back_to_tab_button_,
-                                         vector_icons::kLaunchIcon, kButtonDip,
-                                         icon_color, icon_disabled_color);
+  views::SetImageFromVectorIconWithColor(
+      back_to_tab_button_, vector_icons::kBackToTabIcon, kButtonDip, icon_color,
+      icon_disabled_color);
   views::SetImageFromVectorIconWithColor(
       close_button_, vector_icons::kCloseRoundedIcon, kButtonDip, icon_color,
       icon_disabled_color);
diff --git a/components/metrics/data_use_tracker.cc b/components/metrics/data_use_tracker.cc
index 4ce4366..7c55350 100644
--- a/components/metrics/data_use_tracker.cc
+++ b/components/metrics/data_use_tracker.cc
@@ -110,12 +110,12 @@
                                      int message_size) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  DictionaryPrefUpdate pref_updater(local_state_, pref_name);
+  ScopedDictPrefUpdate pref_updater(local_state_, pref_name);
   std::string todays_key = GetCurrentMeasurementDateAsString();
 
   const base::Value::Dict& user_pref_dict = local_state_->GetDict(pref_name);
   int todays_traffic = user_pref_dict.FindInt(todays_key).value_or(0);
-  pref_updater->SetIntKey(todays_key, todays_traffic + message_size);
+  pref_updater->Set(todays_key, todays_traffic + message_size);
 }
 
 void DataUseTracker::RemoveExpiredEntries() {
diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc
index b1d14da..c362616 100644
--- a/components/metrics/file_metrics_provider.cc
+++ b/components/metrics/file_metrics_provider.cc
@@ -683,9 +683,9 @@
 }
 
 void FileMetricsProvider::AppendToSamplesCountPref(size_t samples_count) {
-  ListPrefUpdate update(pref_service_,
-                        metrics::prefs::kMetricsFileMetricsMetadata);
-  update->GetList().Append(static_cast<int>(samples_count));
+  ScopedListPrefUpdate update(pref_service_,
+                              metrics::prefs::kMetricsFileMetricsMetadata);
+  update->Append(static_cast<int>(samples_count));
 }
 
 void FileMetricsProvider::RecordFileMetadataOnTaskRunner(SourceInfo* source) {
@@ -924,9 +924,9 @@
     return false;
   }
 
-  ListPrefUpdate list_pref(pref_service_,
-                           metrics::prefs::kMetricsFileMetricsMetadata);
-  base::Value::List& list_value = list_pref->GetList();
+  ScopedListPrefUpdate list_pref(pref_service_,
+                                 metrics::prefs::kMetricsFileMetricsMetadata);
+  base::Value::List& list_value = list_pref.Get();
   if (list_value.empty())
     return false;
 
diff --git a/components/metrics/unsent_log_store.cc b/components/metrics/unsent_log_store.cc
index 654afe1..f8c1c4fb 100644
--- a/components/metrics/unsent_log_store.cc
+++ b/components/metrics/unsent_log_store.cc
@@ -265,8 +265,8 @@
 }
 
 void UnsentLogStore::TrimAndPersistUnsentLogs(bool overwrite_in_memory_store) {
-  ListPrefUpdate update(local_state_, log_data_pref_name_);
-  LogsPrefWriter writer(&update->GetList());
+  ScopedListPrefUpdate update(local_state_, log_data_pref_name_);
+  LogsPrefWriter writer(&update.Get());
 
   std::vector<std::unique_ptr<LogInfo>> trimmed_list;
   size_t bytes_used = 0;
@@ -442,8 +442,8 @@
   if (metadata_pref_name_ == nullptr)
     return;
 
-  DictionaryPrefUpdate update(local_state_, metadata_pref_name_);
-  base::Value::Dict& pref_data = update->GetDict();
+  ScopedDictPrefUpdate update(local_state_, metadata_pref_name_);
+  base::Value::Dict& pref_data = update.Get();
   pref_data.Set(kLogUnsentCountKey, unsent_samples_count);
   pref_data.Set(kLogSentCountKey, sent_samples_count);
   // Round up to kb.
diff --git a/components/omnibox/browser/actions/omnibox_pedal_provider.cc b/components/omnibox/browser/actions/omnibox_pedal_provider.cc
index 61ecfe7..71aef6e 100644
--- a/components/omnibox/browser/actions/omnibox_pedal_provider.cc
+++ b/components/omnibox/browser/actions/omnibox_pedal_provider.cc
@@ -298,11 +298,10 @@
     tokenize_characters_ = u" -";
   }
 
-  const auto& dictionary =
-      concept_data->FindKey("dictionary")->GetListDeprecated();
-  dictionary_.reserve(dictionary.size());
+  const auto& list = concept_data->FindKey("dictionary")->GetList();
+  dictionary_.reserve(list.size());
   int token_id = 0;
-  for (const auto& token_value : dictionary) {
+  for (const auto& token_value : list) {
     std::u16string token;
     if (token_value.is_string())
       token = base::UTF8ToUTF16(token_value.GetString());
@@ -323,8 +322,7 @@
   }
   ignore_group_.SortSynonyms();
 
-  for (const auto& pedal_value :
-       concept_data->FindKey("pedals")->GetListDeprecated()) {
+  for (const auto& pedal_value : concept_data->FindKey("pedals")->GetList()) {
     DCHECK(pedal_value.is_dict());
     const int id = pedal_value.FindIntKey("id").value();
     const auto pedal_iter = pedals_.find(static_cast<OmniboxPedalId>(id));
@@ -351,8 +349,7 @@
     // the appropriate string names won't be defined. In such cases, we fall
     // back to loading from JSON to robustly handle partial presence of data.
     if (specs.empty()) {
-      for (const auto& group_value :
-           pedal_value.FindKey("groups")->GetListDeprecated()) {
+      for (const auto& group_value : pedal_value.FindKey("groups")->GetList()) {
         // Note, group JSON values are preprocessed by the data generation tool.
         pedal->AddSynonymGroup(LoadSynonymGroupValue(group_value));
       }
@@ -387,11 +384,11 @@
   DCHECK(group_value.is_dict());
   const bool required = group_value.FindKey("required")->GetBool();
   const bool single = group_value.FindKey("single")->GetBool();
-  const auto& synonyms = group_value.FindKey("synonyms")->GetListDeprecated();
+  const auto& synonyms = group_value.FindKey("synonyms")->GetList();
   OmniboxPedal::SynonymGroup synonym_group(required, single, synonyms.size());
   for (const auto& synonyms_value : synonyms) {
     DCHECK(synonyms_value.is_list());
-    const auto& synonyms_value_list = synonyms_value.GetListDeprecated();
+    const auto& synonyms_value_list = synonyms_value.GetList();
     OmniboxPedal::TokenSequence synonym_all_tokens(synonyms_value_list.size());
     for (const auto& token_index_value : synonyms_value_list) {
       synonym_all_tokens.Add(token_index_value.GetInt());
diff --git a/components/omnibox/browser/document_provider.cc b/components/omnibox/browser/document_provider.cc
index e62518bd..0fc85b77 100644
--- a/components/omnibox/browser/document_provider.cc
+++ b/components/omnibox/browser/document_provider.cc
@@ -200,7 +200,7 @@
   if (!values)
     return {};
 
-  auto list = values->GetListDeprecated();
+  const auto& list = values->GetList();
   std::vector<const std::string*> extracted(list.size());
   std::transform(list.begin(), list.end(), extracted.begin(),
                  [field_path](const auto& value) {
@@ -870,7 +870,7 @@
   if (!results) {
     return matches;
   }
-  size_t num_results = results->GetListDeprecated().size();
+  size_t num_results = results->GetList().size();
   UMA_HISTOGRAM_COUNTS_1M("Omnibox.DocumentSuggest.ResultCount", num_results);
 
   // During development/quality iteration we may wish to defeat server scores.
@@ -901,7 +901,7 @@
   // Ensure server's suggestions are added with monotonically decreasing scores.
   int previous_score = INT_MAX;
   for (size_t i = 0; i < num_results; i++) {
-    const base::Value& result = results->GetListDeprecated()[i];
+    const base::Value& result = results->GetList()[i];
     if (!result.is_dict()) {
       return matches;
     }
diff --git a/components/omnibox/browser/search_suggestion_parser.cc b/components/omnibox/browser/search_suggestion_parser.cc
index b77c7c8..9fc5f2f 100644
--- a/components/omnibox/browser/search_suggestion_parser.cc
+++ b/components/omnibox/browser/search_suggestion_parser.cc
@@ -74,7 +74,7 @@
 
   if (subtypes_value == nullptr || !subtypes_value->is_list())
     return result;
-  auto subtypes_list = subtypes_value->GetListDeprecated();
+  const auto& subtypes_list = subtypes_value->GetList();
 
   if (!subtypes_list.empty() && subtypes_list.size() != expected_size) {
     LOG(WARNING) << "The length of reported subtypes (" << subtypes_list.size()
@@ -89,7 +89,7 @@
     if (!subtypes_item.is_list())
       continue;
 
-    auto subtype_list = subtypes_item.GetListDeprecated();
+    const auto& subtype_list = subtypes_item.GetList();
     auto& result_subtypes = result[index];
     result_subtypes.reserve(subtype_list.size());
 
@@ -528,7 +528,7 @@
     Results* results) {
   if (!root_val.is_list())
     return false;
-  auto root_list = root_val.GetListDeprecated();
+  const auto& root_list = root_val.GetList();
 
   // 1st element: query.
   if (root_list.empty() || !root_list[0].is_string())
@@ -540,7 +540,7 @@
   // 2nd element: suggestions list.
   if (root_list.size() < 2u || !root_list[1].is_list())
     return false;
-  auto results_list = root_list[1].GetListDeprecated();
+  const auto& results_list = root_list[1].GetList();
 
   // 3rd element: Ignore the optional description list for now.
   // 4th element: Disregard the query URL list.
@@ -567,8 +567,7 @@
 
     relevances = extras.FindListKey("google:suggestrelevance");
     // Discard this list if its size does not match that of the suggestions.
-    if (relevances &&
-        relevances->GetListDeprecated().size() != results_list.size()) {
+    if (relevances && relevances->GetList().size() != results_list.size()) {
       relevances = nullptr;
     }
 
@@ -626,7 +625,7 @@
 
       const base::Value* hidden_group_ids = header_texts->FindListKey("h");
       if (hidden_group_ids) {
-        for (const auto& value : hidden_group_ids->GetListDeprecated()) {
+        for (const auto& value : hidden_group_ids->GetList()) {
           if (value.is_int()) {
             (*groups_info.mutable_group_configs_map())[value.GetInt()]
                 .set_visibility(omnibox::GroupConfig_Visibility_HIDDEN);
@@ -644,7 +643,7 @@
     suggestion_details = extras.FindListKey("google:suggestdetail");
     // Discard this list if its size does not match that of the suggestions.
     if (suggestion_details &&
-        suggestion_details->GetListDeprecated().size() != results_list.size()) {
+        suggestion_details->GetList().size() != results_list.size()) {
       suggestion_details = nullptr;
     }
 
@@ -652,8 +651,7 @@
     subtype_identifiers = extras.FindListKey("google:subtypeid");
     // Discard this list if its size does not match that of the suggestions.
     if (subtype_identifiers &&
-        subtype_identifiers->GetListDeprecated().size() !=
-            results_list.size()) {
+        subtype_identifiers->GetList().size() != results_list.size()) {
       subtype_identifiers = nullptr;
     }
 
@@ -691,10 +689,10 @@
 
     // Apply valid suggested relevance scores; discard invalid lists.
     if (relevances) {
-      if (!relevances->GetListDeprecated()[index].is_int()) {
+      if (!relevances->GetList()[index].is_int()) {
         relevances = nullptr;
       } else {
-        relevance = relevances->GetListDeprecated()[index].GetInt();
+        relevance = relevances->GetList()[index].GetInt();
       }
     }
 
@@ -703,25 +701,23 @@
 
     // Legacy code: if the server sends us a single subtype ID, place it beside
     // other subtypes.
-    if (subtype_identifiers &&
-        index < subtype_identifiers->GetListDeprecated().size() &&
-        subtype_identifiers->GetListDeprecated()[index].is_int()) {
+    if (subtype_identifiers && index < subtype_identifiers->GetList().size() &&
+        subtype_identifiers->GetList()[index].is_int()) {
       subtypes[index].emplace_back(
-          subtype_identifiers->GetListDeprecated()[index].GetInt());
+          subtype_identifiers->GetList()[index].GetInt());
     }
 
-    if (suggest_types && index < suggest_types->GetListDeprecated().size() &&
-        suggest_types->GetListDeprecated()[index].is_string()) {
-      match_type = GetAutocompleteMatchType(
-          suggest_types->GetListDeprecated()[index].GetString());
+    if (suggest_types && index < suggest_types->GetList().size() &&
+        suggest_types->GetList()[index].is_string()) {
+      match_type =
+          GetAutocompleteMatchType(suggest_types->GetList()[index].GetString());
     }
 
     std::string deletion_url;
-    if (suggestion_details &&
-        index < suggestion_details->GetListDeprecated().size() &&
-        suggestion_details->GetListDeprecated()[index].is_dict()) {
+    if (suggestion_details && index < suggestion_details->GetList().size() &&
+        suggestion_details->GetList()[index].is_dict()) {
       const base::Value& suggestion_detail =
-          suggestion_details->GetListDeprecated()[index];
+          suggestion_details->GetList()[index];
       deletion_url = FindStringKeyOrEmpty(suggestion_detail, "du");
     }
 
@@ -734,7 +730,7 @@
         std::u16string title;
         // 3rd element: optional descriptions list
         if (root_list.size() > 2u && root_list[2].is_list()) {
-          auto descriptions = root_list[2].GetListDeprecated();
+          const auto& descriptions = root_list[2].GetList();
           if (index < descriptions.size() && descriptions[index].is_string()) {
             title = base::UTF8ToUTF16(descriptions[index].GetString());
           }
@@ -772,10 +768,10 @@
       absl::optional<int> suggestion_group_id;
 
       if (suggestion_details &&
-          suggestion_details->GetListDeprecated()[index].is_dict() &&
-          !suggestion_details->GetListDeprecated()[index].DictEmpty()) {
+          suggestion_details->GetList()[index].is_dict() &&
+          !suggestion_details->GetList()[index].DictEmpty()) {
         const base::Value& suggestion_detail =
-            suggestion_details->GetListDeprecated()[index];
+            suggestion_details->GetList()[index];
         match_contents =
             base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "t"));
         if (match_contents.empty()) {
diff --git a/components/omnibox/browser/search_suggestion_parser_fuzzer.cc b/components/omnibox/browser/search_suggestion_parser_fuzzer.cc
index bcacc47b..c7bdd09 100644
--- a/components/omnibox/browser/search_suggestion_parser_fuzzer.cc
+++ b/components/omnibox/browser/search_suggestion_parser_fuzzer.cc
@@ -38,7 +38,7 @@
     {
       // Set-up the input so downstream won't reject it.
       if (value->is_list()) {
-        base::Value::ConstListView root_list = value->GetListDeprecated();
+        const base::Value::List& root_list = value->GetList();
         if (!root_list.empty() && root_list[0].is_string()) {
           std::string query = root_list[0].GetString();
           input = AutocompleteInput(base::UTF8ToUTF16(query),
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc
index f17ab65..cf6f5ad 100644
--- a/components/omnibox/common/omnibox_features.cc
+++ b/components/omnibox/common/omnibox_features.cc
@@ -39,176 +39,200 @@
 
 // Feature used to enable various experiments on keyword mode, UI and
 // suggestions.
-const base::Feature kExperimentalKeywordMode{"OmniboxExperimentalKeywordMode",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kExperimentalKeywordMode,
+             "OmniboxExperimentalKeywordMode",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature to enable showing thumbnail in front of the Omnibox clipboard image
 // search suggestion.
-const base::Feature kImageSearchSuggestionThumbnail{
-    "ImageSearchSuggestionThumbnail", enabled_by_default_android_only};
+BASE_FEATURE(kImageSearchSuggestionThumbnail,
+             "ImageSearchSuggestionThumbnail",
+             enabled_by_default_android_only);
 
 // Feature used to allow users to remove suggestions from clipboard.
-const base::Feature kOmniboxRemoveSuggestionsFromClipboard{
-    "OmniboxRemoveSuggestionsFromClipboard", enabled_by_default_android_only};
+BASE_FEATURE(kOmniboxRemoveSuggestionsFromClipboard,
+             "OmniboxRemoveSuggestionsFromClipboard",
+             enabled_by_default_android_only);
 
 // Auxiliary search for Android. See http://crbug/1310100 for more details.
-const base::Feature kAndroidAuxiliarySearch{"AndroidAuxiliarySearch",
-                                            base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kAndroidAuxiliarySearch,
+             "AndroidAuxiliarySearch",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables various tweaks to `AutocompleteController` autocompletion twiddling
 // that may improve autocompletion stability. Feature params control which
 // tweaks specifically are enabled. Enabling this feature without params is a
 // no-op.
-const base::Feature kAutocompleteStability{"OmniboxAutocompleteStability",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kAutocompleteStability,
+             "OmniboxAutocompleteStability",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature to enable memoizing and filtering non-doc hosts for
 // `DocumentProvider::GetURLForDeduping()`.
-const base::Feature kDocumentProviderDedupingOptimization{
-    "OmniboxDocumentProviderDedupingOptimization",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kDocumentProviderDedupingOptimization,
+             "OmniboxDocumentProviderDedupingOptimization",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature to tweak how the default suggestion is preserved. Feature params
 // control which tweaks specifically are enabled. Enabling this feature without
 // params is a no-op.
-const base::Feature kPreserveDefault{"OmniboxPreserveDefault",
-                                     base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kPreserveDefault,
+             "OmniboxPreserveDefault",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Demotes the relevance scores when comparing suggestions based on the
 // suggestion's |AutocompleteMatchType| and the user's |PageClassification|.
 // This feature's main job is to contain the DemoteByType parameter.
-const base::Feature kOmniboxDemoteByType{"OmniboxDemoteByType",
-                                         base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kOmniboxDemoteByType,
+             "OmniboxDemoteByType",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature to enable memoizing URLs when replacing search terms in
 // `AutocompleteMatch::GURLToStrippedGURL()`.
-const base::Feature kStrippedGurlOptimization{
-    "OmniboxStrippedGurlOptimization", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kStrippedGurlOptimization,
+             "OmniboxStrippedGurlOptimization",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature to debounce `AutocompleteController::UpdateResult()`.
-const base::Feature kUpdateResultDebounce{"OmniboxUpdateResultDebounce",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kUpdateResultDebounce,
+             "OmniboxUpdateResultDebounce",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to cap max zero suggestions shown according to the param
 // OmniboxMaxZeroSuggestMatches. If omitted,
 // OmniboxUIExperimentMaxAutocompleteMatches will be used instead. If present,
 // OmniboxMaxZeroSuggestMatches will override
 // OmniboxUIExperimentMaxAutocompleteMatches when |from_omnibox_focus| is true.
-const base::Feature kMaxZeroSuggestMatches{"OmniboxMaxZeroSuggestMatches",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kMaxZeroSuggestMatches,
+             "OmniboxMaxZeroSuggestMatches",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to cap max suggestions shown according to the params
 // UIMaxAutocompleteMatches and UIMaxAutocompleteMatchesByProvider.
-const base::Feature kUIExperimentMaxAutocompleteMatches{
-    "OmniboxUIExperimentMaxAutocompleteMatches",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kUIExperimentMaxAutocompleteMatches,
+             "OmniboxUIExperimentMaxAutocompleteMatches",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to cap the number of URL-type matches shown within the
 // Omnibox. If enabled, the number of URL-type matches is limited (unless
 // there are no more non-URL matches available.) If enabled, there is a
 // companion parameter - OmniboxMaxURLMatches - which specifies the maximum
 // desired number of URL-type matches.
-const base::Feature kOmniboxMaxURLMatches{"OmniboxMaxURLMatches",
-                                          enabled_by_default_desktop_android};
+BASE_FEATURE(kOmniboxMaxURLMatches,
+             "OmniboxMaxURLMatches",
+             enabled_by_default_desktop_android);
 
 // Feature used to cap max suggestions to a dynamic limit based on how many URLs
 // would be shown. E.g., show up to 10 suggestions if doing so would display no
 // URLs; else show up to 8 suggestions if doing so would include 1 or more URLs.
-const base::Feature kDynamicMaxAutocomplete{"OmniboxDynamicMaxAutocomplete",
-                                            enabled_by_default_desktop_android};
+BASE_FEATURE(kDynamicMaxAutocomplete,
+             "OmniboxDynamicMaxAutocomplete",
+             enabled_by_default_desktop_android);
 
 // Used to adjust the relevance for the local history zero-prefix suggestions.
 // If enabled, the relevance is determined by this feature's companion
 // parameter, OmniboxFieldTrial::kLocalHistoryZeroSuggestRelevanceScore.
-const base::Feature kAdjustLocalHistoryZeroSuggestRelevanceScore{
-    "AdjustLocalHistoryZeroSuggestRelevanceScore",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kAdjustLocalHistoryZeroSuggestRelevanceScore,
+             "AdjustLocalHistoryZeroSuggestRelevanceScore",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables on-clobber (i.e., when the user clears the whole omnibox text)
 // zero-prefix suggestions on the Open Web, that are contextual to the current
 // URL. Will only work if user is signed-in and syncing, or is otherwise
 // eligible to send the current page URL to the suggest server.
-const base::Feature kClobberTriggersContextualWebZeroSuggest{
-    "OmniboxClobberTriggersContextualWebZeroSuggest",
-    enabled_by_default_desktop_only};
+BASE_FEATURE(kClobberTriggersContextualWebZeroSuggest,
+             "OmniboxClobberTriggersContextualWebZeroSuggest",
+             enabled_by_default_desktop_only);
 
 // Enables on-clobber (i.e., when the user clears the whole omnibox text)
 // zero-prefix suggestions on the SRP.
-const base::Feature kClobberTriggersSRPZeroSuggest{
-    "OmniboxClobberTriggersSRPZeroSuggest", enabled_by_default_desktop_only};
+BASE_FEATURE(kClobberTriggersSRPZeroSuggest,
+             "OmniboxClobberTriggersSRPZeroSuggest",
+             enabled_by_default_desktop_only);
 
 // Enables on-focus zero-prefix suggestions on the Open Web, that are contextual
 // to the current URL. Will only work if user is signed-in and syncing, or is
 // otherwise eligible to send the current page URL to the suggest server.
-const base::Feature kFocusTriggersContextualWebZeroSuggest{
-    "OmniboxFocusTriggersContextualWebZeroSuggest",
-    enabled_by_default_android_only};
+BASE_FEATURE(kFocusTriggersContextualWebZeroSuggest,
+             "OmniboxFocusTriggersContextualWebZeroSuggest",
+             enabled_by_default_android_only);
 
 // Enables on-focus zero-prefix suggestions on the SRP.
-const base::Feature kFocusTriggersSRPZeroSuggest{
-    "OmniboxFocusTriggersSRPZeroSuggest", enabled_by_default_android_only};
+BASE_FEATURE(kFocusTriggersSRPZeroSuggest,
+             "OmniboxFocusTriggersSRPZeroSuggest",
+             enabled_by_default_android_only);
 
 // Revamps how local search history is extracted and processed for generating
 // zero-prefix and prefix suggestions.
-extern const base::Feature kLocalHistorySuggestRevamp{
-    "LocalHistorySuggestRevamp", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kLocalHistorySuggestRevamp,
+             "LocalHistorySuggestRevamp",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables local history zero-prefix suggestions in every context in which the
 // remote zero-prefix suggestions are enabled.
-const base::Feature kLocalHistoryZeroSuggestBeyondNTP{
-    "LocalHistoryZeroSuggestBeyondNTP", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kLocalHistoryZeroSuggestBeyondNTP,
+             "LocalHistoryZeroSuggestBeyondNTP",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Used to adjust the age threshold since the last visit in order to consider a
 // normalized keyword search term as a zero-prefix suggestion. If disabled, the
 // default value of 60 days for Desktop and 7 days for Android and iOS is used.
 // If enabled, the age threshold is determined by this feature's companion
 // parameter, OmniboxFieldTrial::kOmniboxLocalZeroSuggestAgeThresholdParam.
-const base::Feature kOmniboxLocalZeroSuggestAgeThreshold{
-    "OmniboxLocalZeroSuggestAgeThreshold", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kOmniboxLocalZeroSuggestAgeThreshold,
+             "OmniboxLocalZeroSuggestAgeThreshold",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables on-focus zero-prefix suggestions on the NTP for signed-out users.
-const base::Feature kZeroSuggestOnNTPForSignedOutUsers{
-    "OmniboxTrendingZeroPrefixSuggestionsOnNTP",
-    enabled_by_default_desktop_android};
+BASE_FEATURE(kZeroSuggestOnNTPForSignedOutUsers,
+             "OmniboxTrendingZeroPrefixSuggestionsOnNTP",
+             enabled_by_default_desktop_android);
 
 // Enables prefetching of the zero prefix suggestions for eligible users on NTP.
-const base::Feature kZeroSuggestPrefetching{"ZeroSuggestPrefetching",
-                                            enabled_by_default_desktop_android};
+BASE_FEATURE(kZeroSuggestPrefetching,
+             "ZeroSuggestPrefetching",
+             enabled_by_default_desktop_android);
 
 // Enables prefetching of the zero prefix suggestions for eligible users on SRP.
-const base::Feature kZeroSuggestPrefetchingOnSRP{
-    "ZeroSuggestPrefetchingOnSRP", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kZeroSuggestPrefetchingOnSRP,
+             "ZeroSuggestPrefetchingOnSRP",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables prefetching of the zero prefix suggestions for eligible users on the
 // Web (i.e. non-NTP and non-SRP URLs).
-const base::Feature kZeroSuggestPrefetchingOnWeb{
-    "ZeroSuggestPrefetchingOnWeb", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kZeroSuggestPrefetchingOnWeb,
+             "ZeroSuggestPrefetchingOnWeb",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // If enabled, zero prefix suggestions will be stored using an in-memory caching
 // service, instead of using the existing prefs-based cache.
-extern const base::Feature kZeroSuggestInMemoryCaching{
-    "ZeroSuggestInMemoryCaching", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kZeroSuggestInMemoryCaching,
+             "ZeroSuggestInMemoryCaching",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Features to provide non personalized head search suggestion from a compact
 // on device model. More specifically, feature name with suffix Incognito /
 // NonIncognito will only controls behaviors under incognito / non-incognito
 // mode respectively.
-const base::Feature kOnDeviceHeadProviderIncognito{
-    "OmniboxOnDeviceHeadProviderIncognito", base::FEATURE_ENABLED_BY_DEFAULT};
-const base::Feature kOnDeviceHeadProviderNonIncognito{
-    "OmniboxOnDeviceHeadProviderNonIncognito",
-    base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kOnDeviceHeadProviderIncognito,
+             "OmniboxOnDeviceHeadProviderIncognito",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kOnDeviceHeadProviderNonIncognito,
+             "OmniboxOnDeviceHeadProviderNonIncognito",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // If enabled, changes the way Google-provided search suggestions are scored by
 // the backend. Note that this Feature is only used for triggering a server-
 // side experiment config that will send experiment IDs to the backend. It is
 // not referred to in any of the Chromium code.
-const base::Feature kOmniboxExperimentalSuggestScoring{
-    "OmniboxExperimentalSuggestScoring", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kOmniboxExperimentalSuggestScoring,
+             "OmniboxExperimentalSuggestScoring",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // If enabled, suggestions from a cgi param name match are scored to 0.
-const base::Feature kDisableCGIParamMatching{"OmniboxDisableCGIParamMatching",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kDisableCGIParamMatching,
+             "OmniboxDisableCGIParamMatching",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Features used to enable matching short inputs to bookmarks for suggestions.
 // By default, if both of the following are disabled, input words shorter than 3
@@ -219,147 +243,169 @@
 // If |kShortBookmarkSuggestionsByTotalInputLength()| is enabled, matching is
 //   limited by input length rather than input word length. Input 'abc x' can
 //   but input 'x' can't match bookmark text 'abc xyz'.
-const base::Feature kShortBookmarkSuggestions{
-    "OmniboxShortBookmarkSuggestions", base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kShortBookmarkSuggestionsByTotalInputLength{
-    "OmniboxShortBookmarkSuggestionsByTotalInputLength",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kShortBookmarkSuggestions,
+             "OmniboxShortBookmarkSuggestions",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kShortBookmarkSuggestionsByTotalInputLength,
+             "OmniboxShortBookmarkSuggestionsByTotalInputLength",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // If enabled, inputs may match bookmark paths. These path matches won't
 // contribute to scoring. E.g. 'planets jupiter' can suggest a bookmark titled
 // 'Jupiter' with URL 'en.wikipedia.org/wiki/Jupiter' located in a path
 // containing 'planet.'
-const base::Feature kBookmarkPaths{"OmniboxBookmarkPaths",
-                                   base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kBookmarkPaths,
+             "OmniboxBookmarkPaths",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // If disabled, shortcuts to the same stripped destination URL are scored
 // independently, and only the highest scored shortcut is kept. If enabled,
 // duplicate shortcuts are given an aggregate score, as if they had been a
 // single shortcut.
-const base::Feature kAggregateShortcuts{"OmniboxAggregateShortcuts",
-                                        base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kAggregateShortcuts,
+             "OmniboxAggregateShortcuts",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // If enabled, when updating or creating a shortcut, the last word of the input
 // is expanded, if possible, to a complete word in the suggestion description.
-const base::Feature kShortcutExpanding{"OmniboxShortcutExpanding",
-                                       base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kShortcutExpanding,
+             "OmniboxShortcutExpanding",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // If enabled, the relevant AutocompleteProviders will store "title" data in
 // AutocompleteMatch::contents and "URL" data in AutocompleteMatch::description
 // for URL-based omnibox suggestions (see crbug.com/1202964 for more details).
-const base::Feature kStoreTitleInContentsAndUrlInDescription{
-    "OmniboxStoreTitleInContentsAndUrlInDescription",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kStoreTitleInContentsAndUrlInDescription,
+             "OmniboxStoreTitleInContentsAndUrlInDescription",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // HQP scores suggestions higher when it finds fewer matches. When enabled,
 // HQP will consider the count of unique hosts, rather than the total count of
 // matches.
-const base::Feature kHistoryQuickProviderSpecificityScoreCountUniqueHosts{
-    "OmniboxHistoryQuickProviderSpecificityScoreCountUniqueHosts",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kHistoryQuickProviderSpecificityScoreCountUniqueHosts,
+             "OmniboxHistoryQuickProviderSpecificityScoreCountUniqueHosts",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to fetch document suggestions.
-const base::Feature kDocumentProvider{"OmniboxDocumentProvider",
-                                      enabled_by_default_desktop_only};
+BASE_FEATURE(kDocumentProvider,
+             "OmniboxDocumentProvider",
+             enabled_by_default_desktop_only);
 
 // Feature to determine a value in the drive request indicating whether the
 // request should be served by the  ASO backend.
-const base::Feature kDocumentProviderAso{"OmniboxDocumentProviderAso",
-                                         base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kDocumentProviderAso,
+             "OmniboxDocumentProviderAso",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Allows Omnibox to dynamically adjust number of offered suggestions to fill in
 // the space between Omnibox and the soft keyboard. The number of suggestions
 // shown will be no less than minimum for the platform (eg. 5 for Android).
-const base::Feature kAdaptiveSuggestionsCount{"OmniboxAdaptiveSuggestionsCount",
-                                              enabled_by_default_android_only};
+BASE_FEATURE(kAdaptiveSuggestionsCount,
+             "OmniboxAdaptiveSuggestionsCount",
+             enabled_by_default_android_only);
 
 // If enabled, clipboard suggestion will not show the clipboard content until
 // the user clicks the reveal button.
-const base::Feature kClipboardSuggestionContentHidden = {
-    "ClipboardSuggestionContentHidden", enabled_by_default_android_only};
+BASE_FEATURE(kClipboardSuggestionContentHidden,
+             "ClipboardSuggestionContentHidden",
+             enabled_by_default_android_only);
 
 // If enabled, finance ticker answer from omnibox will reverse the color for
 // stock ticker. only colors being swapped are those that represent "growth" and
 // "loss" to represent colors red and green in a way that is appropriate for a
 // given country/culture
-const base::Feature kSuggestionAnswersColorReverse = {
-    "SuggestionAnswersColorReverse", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kSuggestionAnswersColorReverse,
+             "SuggestionAnswersColorReverse",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // If enabled, frequently visited sites are presented in form of a single row
 // with a carousel of tiles, instead of one URL per row.
-extern const base::Feature kMostVisitedTiles{"OmniboxMostVisitedTiles",
-                                             enabled_by_default_android_only};
+BASE_FEATURE(kMostVisitedTiles,
+             "OmniboxMostVisitedTiles",
+             enabled_by_default_android_only);
 
 // If enabled, computes spacing between MV tiles so that about 4.5 tiles are
 // shown on screen on narrow devices.
-extern const base::Feature kMostVisitedTilesDynamicSpacing{
-    "OmniboxMostVisitedTilesDynamicSpacing", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kMostVisitedTilesDynamicSpacing,
+             "OmniboxMostVisitedTilesDynamicSpacing",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // If enabled, permits the title on the MostVisitedTiles to wrap around to
 // second line.
-extern const base::Feature kMostVisitedTilesTitleWrapAround{
-    "OmniboxMostVisitedTilesTitleWrapAround",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kMostVisitedTilesTitleWrapAround,
+             "OmniboxMostVisitedTilesTitleWrapAround",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // If enabled, expands autocompletion to possibly (depending on params) include
 // suggestion titles and non-prefixes as opposed to be restricted to URL
 // prefixes. Will also adjust the location bar UI and omnibox text selection to
 // accommodate the autocompletions.
-const base::Feature kRichAutocompletion{"OmniboxRichAutocompletion",
-                                        base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kRichAutocompletion,
+             "OmniboxRichAutocompletion",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to enable Pedals in the NTP Realbox.
-const base::Feature kNtpRealboxPedals{"NtpRealboxPedals",
-                                      base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kNtpRealboxPedals,
+             "NtpRealboxPedals",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to enable URL suggestions for inputs that may contain typos.
-const base::Feature kOmniboxFuzzyUrlSuggestions{
-    "OmniboxFuzzyUrlSuggestions", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kOmniboxFuzzyUrlSuggestions,
+             "OmniboxFuzzyUrlSuggestions",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to update the left and bottom padding of the omnibox suggestion
 // header.
-const base::Feature kOmniboxHeaderPaddingUpdate{
-    "OmniboxHeaderPaddingUpdate", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kOmniboxHeaderPaddingUpdate,
+             "OmniboxHeaderPaddingUpdate",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to remove the capitalization of the suggestion header text.
-const base::Feature kOmniboxRemoveSuggestionHeaderCapitalization{
-    "OmniboxRemoveSuggestionHeaderCapitalization",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kOmniboxRemoveSuggestionHeaderCapitalization,
+             "OmniboxRemoveSuggestionHeaderCapitalization",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to remove the chevron on the right side of suggestion list
 // header under omnibox.
-const base::Feature kOmniboxRemoveSuggestionHeaderChevron{
-    "OmniboxRemoveSuggestionHeaderChevron", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kOmniboxRemoveSuggestionHeaderChevron,
+             "OmniboxRemoveSuggestionHeaderChevron",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to add fading effect to most visited tiles on tablet.
-const base::Feature kOmniboxMostVisitedTilesFadingOnTablet{
-    "OmniboxMostVisitedTilesFadingOnTablet", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kOmniboxMostVisitedTilesFadingOnTablet,
+             "OmniboxMostVisitedTilesFadingOnTablet",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to add most visited tiles to the suggestions when the user is on
 // a search result page that does not do search term replacement.
-const base::Feature kOmniboxMostVisitedTilesOnSrp{
-    "OmniboxMostVisitedTilesOnSrp", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kOmniboxMostVisitedTilesOnSrp,
+             "OmniboxMostVisitedTilesOnSrp",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // When enabled, use Assistant for omnibox voice query recognition instead of
 // Android's built-in voice recognition service. Only works on Android.
-const base::Feature kOmniboxAssistantVoiceSearch{
-    "OmniboxAssistantVoiceSearch", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kOmniboxAssistantVoiceSearch,
+             "OmniboxAssistantVoiceSearch",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kClosePopupWithEscape{"OmniboxClosePopupWithEscape",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kClosePopupWithEscape,
+             "OmniboxClosePopupWithEscape",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kBlurWithEscape{"OmniboxBlurWithEscape",
-                                    base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kBlurWithEscape,
+             "OmniboxBlurWithEscape",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // When enabled, adds a "starter pack" of @history, @bookmarks, and @settings
 // scopes to Site Search/Keyword Mode.
-const base::Feature kSiteSearchStarterPack{"OmniboxSiteSearchStarterPack",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kSiteSearchStarterPack,
+             "OmniboxSiteSearchStarterPack",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Experiment to introduce new security indicators for HTTPS.
-const base::Feature kUpdatedConnectionSecurityIndicators{
-    "OmniboxUpdatedConnectionSecurityIndicators",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kUpdatedConnectionSecurityIndicators,
+             "OmniboxUpdatedConnectionSecurityIndicators",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Feature used to default typed navigations to use HTTPS instead of HTTP.
 // This only applies to navigations that don't have a scheme such as
@@ -367,9 +413,9 @@
 // loads http://example.com. When this feature is enabled, it should load
 // https://example.com instead, with fallback to http://example.com if
 // necessary.
-const base::Feature kDefaultTypedNavigationsToHttps{
-    "OmniboxDefaultTypedNavigationsToHttps",
-    enabled_by_default_desktop_android};
+BASE_FEATURE(kDefaultTypedNavigationsToHttps,
+             "OmniboxDefaultTypedNavigationsToHttps",
+             enabled_by_default_desktop_android);
 // Parameter name used to look up the delay before falling back to the HTTP URL
 // while trying an HTTPS URL. The parameter is treated as a TimeDelta, so the
 // unit must be included in the value as well (e.g. 3s for 3 seconds).
@@ -380,17 +426,20 @@
 
 // If enabled, Omnibox reports the Assisted Query Stats in the aqs= param in the
 // Search Results Page URL.
-const base::Feature kReportAssistedQueryStats{"OmniboxReportAssistedQueryStats",
-                                              base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kReportAssistedQueryStats,
+             "OmniboxReportAssistedQueryStats",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // If enabled, Omnibox reports the Searchbox Stats in the gs_lcrp= param in the
 // Search Results Page URL.
-extern const base::Feature kReportSearchboxStats{
-    "OmniboxReportSearchboxStats", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kReportSearchboxStats,
+             "OmniboxReportSearchboxStats",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // If enabled, retains all suggestions with headers to be presented entirely.
 // Disabling the feature trims the suggestions list to the predefined limit.
-extern const base::Feature kRetainSuggestionsWithHeaders{
-    "OmniboxRetainSuggestionsWithHeaders", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kRetainSuggestionsWithHeaders,
+             "OmniboxRetainSuggestionsWithHeaders",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 }  // namespace omnibox
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h
index 87ccb4f..12e73fb 100644
--- a/components/omnibox/common/omnibox_features.h
+++ b/components/omnibox/common/omnibox_features.h
@@ -13,110 +13,109 @@
 // Please do not add more features to this "big blob" list.
 // Instead, use the categorized and alphabetized lists below this "big blob".
 // You can create a new category if none of the existing ones fit.
-extern const base::Feature kExperimentalKeywordMode;
-extern const base::Feature kImageSearchSuggestionThumbnail;
-extern const base::Feature kOmniboxRemoveSuggestionsFromClipboard;
-extern const base::Feature kAndroidAuxiliarySearch;
+BASE_DECLARE_FEATURE(kExperimentalKeywordMode);
+BASE_DECLARE_FEATURE(kImageSearchSuggestionThumbnail);
+BASE_DECLARE_FEATURE(kOmniboxRemoveSuggestionsFromClipboard);
+BASE_DECLARE_FEATURE(kAndroidAuxiliarySearch);
 
 // Flags that affect the "twiddle" step of AutocompleteResult, e.g.,
 // `SortAndCull()`.
-extern const base::Feature kAutocompleteStability;
-extern const base::Feature kDocumentProviderDedupingOptimization;
-extern const base::Feature kOmniboxDemoteByType;
-extern const base::Feature kPreserveDefault;
-extern const base::Feature kStrippedGurlOptimization;
-extern const base::Feature kUpdateResultDebounce;
+BASE_DECLARE_FEATURE(kAutocompleteStability);
+BASE_DECLARE_FEATURE(kDocumentProviderDedupingOptimization);
+BASE_DECLARE_FEATURE(kOmniboxDemoteByType);
+BASE_DECLARE_FEATURE(kPreserveDefault);
+BASE_DECLARE_FEATURE(kStrippedGurlOptimization);
+BASE_DECLARE_FEATURE(kUpdateResultDebounce);
 
 // Features below this line should be sorted alphabetically by their comments.
 
 // Num suggestions - these affect how many suggestions are shown based on e.g.
 // focus, page context, provider, or URL v non-URL.
-extern const base::Feature kMaxZeroSuggestMatches;
-extern const base::Feature kUIExperimentMaxAutocompleteMatches;
+BASE_DECLARE_FEATURE(kMaxZeroSuggestMatches);
+BASE_DECLARE_FEATURE(kUIExperimentMaxAutocompleteMatches);
 // The default value is established here as a bool so it can be referred to in
 // OmniboxFieldTrial.
 extern const bool kOmniboxMaxURLMatchesEnabledByDefault;
-extern const base::Feature kOmniboxMaxURLMatches;
-extern const base::Feature kDynamicMaxAutocomplete;
-extern const base::Feature kRetainSuggestionsWithHeaders;
+BASE_DECLARE_FEATURE(kOmniboxMaxURLMatches);
+BASE_DECLARE_FEATURE(kDynamicMaxAutocomplete);
+BASE_DECLARE_FEATURE(kRetainSuggestionsWithHeaders);
 
 // Local history zero-prefix (aka zero-suggest) and prefix suggestions.
-extern const base::Feature kAdjustLocalHistoryZeroSuggestRelevanceScore;
-extern const base::Feature kClobberTriggersContextualWebZeroSuggest;
-extern const base::Feature kClobberTriggersSRPZeroSuggest;
-extern const base::Feature kFocusTriggersContextualWebZeroSuggest;
-extern const base::Feature kFocusTriggersSRPZeroSuggest;
-extern const base::Feature kLocalHistorySuggestRevamp;
-extern const base::Feature kLocalHistoryZeroSuggestBeyondNTP;
-extern const base::Feature kOmniboxLocalZeroSuggestAgeThreshold;
-extern const base::Feature kZeroSuggestOnNTPForSignedOutUsers;
-extern const base::Feature kZeroSuggestPrefetching;
-extern const base::Feature kZeroSuggestPrefetchingOnSRP;
-extern const base::Feature kZeroSuggestPrefetchingOnWeb;
-extern const base::Feature kZeroSuggestInMemoryCaching;
+BASE_DECLARE_FEATURE(kAdjustLocalHistoryZeroSuggestRelevanceScore);
+BASE_DECLARE_FEATURE(kClobberTriggersContextualWebZeroSuggest);
+BASE_DECLARE_FEATURE(kClobberTriggersSRPZeroSuggest);
+BASE_DECLARE_FEATURE(kFocusTriggersContextualWebZeroSuggest);
+BASE_DECLARE_FEATURE(kFocusTriggersSRPZeroSuggest);
+BASE_DECLARE_FEATURE(kLocalHistorySuggestRevamp);
+BASE_DECLARE_FEATURE(kLocalHistoryZeroSuggestBeyondNTP);
+BASE_DECLARE_FEATURE(kOmniboxLocalZeroSuggestAgeThreshold);
+BASE_DECLARE_FEATURE(kZeroSuggestOnNTPForSignedOutUsers);
+BASE_DECLARE_FEATURE(kZeroSuggestPrefetching);
+BASE_DECLARE_FEATURE(kZeroSuggestPrefetchingOnSRP);
+BASE_DECLARE_FEATURE(kZeroSuggestPrefetchingOnWeb);
+BASE_DECLARE_FEATURE(kZeroSuggestInMemoryCaching);
 // Related, kMaxZeroSuggestMatches.
 
 // On Device Head Suggest.
-extern const base::Feature kOnDeviceHeadProviderIncognito;
-extern const base::Feature kOnDeviceHeadProviderNonIncognito;
+BASE_DECLARE_FEATURE(kOnDeviceHeadProviderIncognito);
+BASE_DECLARE_FEATURE(kOnDeviceHeadProviderNonIncognito);
 
 // Provider-specific - These features change the behavior of specific providers.
-extern const base::Feature kOmniboxExperimentalSuggestScoring;
-extern const base::Feature kDisableCGIParamMatching;
-extern const base::Feature kShortBookmarkSuggestions;
-extern const base::Feature kShortBookmarkSuggestionsByTotalInputLength;
-extern const base::Feature kBookmarkPaths;
-extern const base::Feature kAggregateShortcuts;
-extern const base::Feature kShortcutExpanding;
+BASE_DECLARE_FEATURE(kOmniboxExperimentalSuggestScoring);
+BASE_DECLARE_FEATURE(kDisableCGIParamMatching);
+BASE_DECLARE_FEATURE(kShortBookmarkSuggestions);
+BASE_DECLARE_FEATURE(kShortBookmarkSuggestionsByTotalInputLength);
+BASE_DECLARE_FEATURE(kBookmarkPaths);
+BASE_DECLARE_FEATURE(kAggregateShortcuts);
+BASE_DECLARE_FEATURE(kShortcutExpanding);
 // TODO(crbug.com/1202964): Clean up feature flag used in staged roll-out of
 // various CLs related to the contents/description clean-up work.
-extern const base::Feature kStoreTitleInContentsAndUrlInDescription;
-extern const base::Feature
-    kHistoryQuickProviderSpecificityScoreCountUniqueHosts;
+BASE_DECLARE_FEATURE(kStoreTitleInContentsAndUrlInDescription);
+BASE_DECLARE_FEATURE(kHistoryQuickProviderSpecificityScoreCountUniqueHosts);
 
 // Document provider
-extern const base::Feature kDocumentProvider;
-extern const base::Feature kDocumentProviderAso;
+BASE_DECLARE_FEATURE(kDocumentProvider);
+BASE_DECLARE_FEATURE(kDocumentProviderAso);
 
 // Suggestions UI - these affect the UI or function of the suggestions popup.
-extern const base::Feature kAdaptiveSuggestionsCount;
-extern const base::Feature kClipboardSuggestionContentHidden;
-extern const base::Feature kSuggestionAnswersColorReverse;
-extern const base::Feature kMostVisitedTiles;
-extern const base::Feature kMostVisitedTilesDynamicSpacing;
-extern const base::Feature kMostVisitedTilesTitleWrapAround;
-extern const base::Feature kRichAutocompletion;
-extern const base::Feature kNtpRealboxPedals;
-extern const base::Feature kOmniboxFuzzyUrlSuggestions;
-extern const base::Feature kOmniboxHeaderPaddingUpdate;
-extern const base::Feature kOmniboxRemoveSuggestionHeaderCapitalization;
-extern const base::Feature kOmniboxRemoveSuggestionHeaderChevron;
-extern const base::Feature kOmniboxMostVisitedTilesFadingOnTablet;
-extern const base::Feature kOmniboxMostVisitedTilesOnSrp;
+BASE_DECLARE_FEATURE(kAdaptiveSuggestionsCount);
+BASE_DECLARE_FEATURE(kClipboardSuggestionContentHidden);
+BASE_DECLARE_FEATURE(kSuggestionAnswersColorReverse);
+BASE_DECLARE_FEATURE(kMostVisitedTiles);
+BASE_DECLARE_FEATURE(kMostVisitedTilesDynamicSpacing);
+BASE_DECLARE_FEATURE(kMostVisitedTilesTitleWrapAround);
+BASE_DECLARE_FEATURE(kRichAutocompletion);
+BASE_DECLARE_FEATURE(kNtpRealboxPedals);
+BASE_DECLARE_FEATURE(kOmniboxFuzzyUrlSuggestions);
+BASE_DECLARE_FEATURE(kOmniboxHeaderPaddingUpdate);
+BASE_DECLARE_FEATURE(kOmniboxRemoveSuggestionHeaderCapitalization);
+BASE_DECLARE_FEATURE(kOmniboxRemoveSuggestionHeaderChevron);
+BASE_DECLARE_FEATURE(kOmniboxMostVisitedTilesFadingOnTablet);
+BASE_DECLARE_FEATURE(kOmniboxMostVisitedTilesOnSrp);
 
 // Omnibox UI - these affect the UI or function of the location bar (not the
 // popup).
-extern const base::Feature kOmniboxAssistantVoiceSearch;
+BASE_DECLARE_FEATURE(kOmniboxAssistantVoiceSearch);
 
 // Omnibox & Suggestions UI - these affect both the omnibox and the suggestions
 // popup.
-extern const base::Feature kClosePopupWithEscape;
-extern const base::Feature kBlurWithEscape;
+BASE_DECLARE_FEATURE(kClosePopupWithEscape);
+BASE_DECLARE_FEATURE(kBlurWithEscape);
 
 // Settings Page - these affect the appearance of the Search Engines settings
 // page
-extern const base::Feature kSiteSearchStarterPack;
+BASE_DECLARE_FEATURE(kSiteSearchStarterPack);
 
 // Experiment to introduce new security indicators for HTTPS.
-extern const base::Feature kUpdatedConnectionSecurityIndicators;
+BASE_DECLARE_FEATURE(kUpdatedConnectionSecurityIndicators);
 
 // Navigation experiments.
-extern const base::Feature kDefaultTypedNavigationsToHttps;
+BASE_DECLARE_FEATURE(kDefaultTypedNavigationsToHttps);
 extern const char kDefaultTypedNavigationsToHttpsTimeoutParam[];
 
 // Omnibox Logging.
-extern const base::Feature kReportAssistedQueryStats;
-extern const base::Feature kReportSearchboxStats;
+BASE_DECLARE_FEATURE(kReportAssistedQueryStats);
+BASE_DECLARE_FEATURE(kReportSearchboxStats);
 
 }  // namespace omnibox
 
diff --git a/components/optimization_guide/content/browser/salient_image_retriever.cc b/components/optimization_guide/content/browser/salient_image_retriever.cc
index d3d6733..a9fbec8 100644
--- a/components/optimization_guide/content/browser/salient_image_retriever.cc
+++ b/components/optimization_guide/content/browser/salient_image_retriever.cc
@@ -17,6 +17,10 @@
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
+#include "services/metrics/public/cpp/metrics_utils.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
+#include "services/metrics/public/cpp/ukm_source.h"
 #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/mojom/opengraph/metadata.mojom.h"
@@ -24,6 +28,32 @@
 
 namespace optimization_guide {
 
+namespace {
+
+// Keep in sync with OptimizationGuideSalientImageAvailability histogram enum.
+enum class SalientImageAvailability {
+  kUnknown = 0,
+  kNotAvailable = 1,
+  kAvailableButUnparsableFromOgImage = 2,
+  kAvailableFromOgImage = 3,
+  kMaxValue = kAvailableFromOgImage
+};
+
+void RecordMetrics(ukm::SourceId ukm_source_id,
+                   SalientImageAvailability image_availability_result) {
+  const char og_image_availability_histogram_name[] =
+      "OptimizationGuide.PageContentAnnotations.SalientImageAvailability";
+
+  ukm::builders::SalientImageAvailability(ukm_source_id)
+      .SetImageAvailability(static_cast<int64_t>(image_availability_result))
+      .Record(ukm::UkmRecorder::Get());
+
+  base::UmaHistogramEnumeration(og_image_availability_histogram_name,
+                                image_availability_result);
+}
+
+}  // namespace
+
 SalientImageRetriever::SalientImageRetriever(
     OptimizationGuideLogger* optimization_guide_logger)
     : optimization_guide_logger_(optimization_guide_logger) {}
@@ -35,40 +65,27 @@
 
   main_frame.GetOpenGraphMetadata(base::BindOnce(
       &SalientImageRetriever::OnGetOpenGraphMetadata,
-      weak_factory_.GetWeakPtr(), main_frame.GetLastCommittedURL()));
+      weak_factory_.GetWeakPtr(), main_frame.GetLastCommittedURL(),
+      web_contents->GetPrimaryMainFrame()->GetPageUkmSourceId()));
 }
 
 void SalientImageRetriever::OnGetOpenGraphMetadata(
     const GURL& page_url,
+    ukm::SourceId ukm_source_id,
     blink::mojom::OpenGraphMetadataPtr metadata) {
-  const char og_image_availability_histogram_name[] =
-      "OptimizationGuide.PageContentAnnotations.SalientImageAvailability";
-  // Keep in sync with OptimizationGuideSalientImageAvailability histogram enum.
-  enum class SalientImageAvailability {
-    kUnknown = 0,
-    kNotAvailable = 1,
-    kAvailableButUnparsableFromOgImage = 2,
-    kAvailableFromOgImage = 3,
-    kMaxValue = kAvailableFromOgImage
-  };
-
   if (!metadata || !metadata->image) {
-    base::UmaHistogramEnumeration(og_image_availability_histogram_name,
-                                  SalientImageAvailability::kNotAvailable);
+    RecordMetrics(ukm_source_id, SalientImageAvailability::kNotAvailable);
     return;
   }
 
   GURL url(metadata->image.value());
   if (url.is_empty() || !url.is_valid() || !url.SchemeIsHTTPOrHTTPS()) {
-    base::UmaHistogramEnumeration(
-        og_image_availability_histogram_name,
-        SalientImageAvailability::kAvailableButUnparsableFromOgImage);
+    RecordMetrics(ukm_source_id,
+                  SalientImageAvailability::kAvailableButUnparsableFromOgImage);
     return;
   }
 
-  base::UmaHistogramEnumeration(
-      og_image_availability_histogram_name,
-      SalientImageAvailability::kAvailableFromOgImage);
+  RecordMetrics(ukm_source_id, SalientImageAvailability::kAvailableFromOgImage);
 
   OPTIMIZATION_GUIDE_LOGGER(
       optimization_guide_common::mojom::LogSource::PAGE_CONTENT_ANNOTATIONS,
@@ -77,4 +94,4 @@
       << " Salient Image URL: " << metadata->image.value();
 }
 
-}  // namespace optimization_guide
\ No newline at end of file
+}  // namespace optimization_guide
diff --git a/components/optimization_guide/content/browser/salient_image_retriever.h b/components/optimization_guide/content/browser/salient_image_retriever.h
index 3f0592c..dbbae84 100644
--- a/components/optimization_guide/content/browser/salient_image_retriever.h
+++ b/components/optimization_guide/content/browser/salient_image_retriever.h
@@ -7,6 +7,7 @@
 
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
+#include "services/metrics/public/cpp/ukm_source_id.h"
 #include "third_party/blink/public/mojom/opengraph/metadata.mojom-forward.h"
 
 class OptimizationGuideLogger;
@@ -33,6 +34,7 @@
 
  private:
   void OnGetOpenGraphMetadata(const GURL& page_url,
+                              ukm::SourceId ukm_source_id,
                               blink::mojom::OpenGraphMetadataPtr metadata);
 
   // The logger that plumbs the debug logs to the optimization guide
@@ -45,4 +47,4 @@
 
 }  // namespace optimization_guide
 
-#endif  // COMPONENTS_OPTIMIZATION_GUIDE_CONTENT_BROWSER_SALIENT_IMAGE_RETRIEVER_H_
\ No newline at end of file
+#endif  // COMPONENTS_OPTIMIZATION_GUIDE_CONTENT_BROWSER_SALIENT_IMAGE_RETRIEVER_H_
diff --git a/components/performance_manager/graph/graph_impl_unittest.cc b/components/performance_manager/graph/graph_impl_unittest.cc
index 195e012f6..5ec8336 100644
--- a/components/performance_manager/graph/graph_impl_unittest.cc
+++ b/components/performance_manager/graph/graph_impl_unittest.cc
@@ -255,7 +255,7 @@
   const base::Value* v = descr.FindListKey(key);
   ASSERT_NE(nullptr, v);
 
-  const auto list = v->GetListDeprecated();
+  const auto& list = v->GetList();
   ASSERT_EQ(2u, list.size());
   ASSERT_EQ(list[0], base::Value(s1));
   ASSERT_EQ(list[1], base::Value(s2));
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 4ab01db..0888141 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -2160,7 +2160,7 @@
       'owners': ['file://components/history_clusters/OWNERS', 'mahmadi@chromium.org', 'chrome-journeys@google.com'],
       'type': 'main',
       'schema': { 'type': 'boolean' },
-      'supported_on': ['chrome.*:97-', 'chrome_os:97-'],
+      'supported_on': ['chrome.*:97-', 'chrome_os:97-', 'android:107-'],
       'future_on': ['fuchsia'],
       'features': {
         'dynamic_refresh': True,
diff --git a/components/reporting/proto/BUILD.gn b/components/reporting/proto/BUILD.gn
index ce20891..4f41acbf 100644
--- a/components/reporting/proto/BUILD.gn
+++ b/components/reporting/proto/BUILD.gn
@@ -80,3 +80,10 @@
 
   sources = [ "synced/security_xdr_events.proto" ]
 }
+
+# Definition for pipeline id storage info.
+proto_library("pipeline_id_proto") {
+  proto_in_dir = "//"
+
+  sources = [ "synced/pipeline_id.proto" ]
+}
diff --git a/components/reporting/proto/synced/pipeline_id.proto b/components/reporting/proto/synced/pipeline_id.proto
new file mode 100644
index 0000000..fa0de7b
--- /dev/null
+++ b/components/reporting/proto/synced/pipeline_id.proto
@@ -0,0 +1,15 @@
+// Copyright 2021 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+
+package reporting;
+
+// Used to (de)serialize pipeline id + signature for storage
+message PipelineIdStorageInfo {
+  optional string pipeline_id = 1;
+  optional string pipeline_id_signature = 2;
+}
\ No newline at end of file
diff --git a/components/reporting/storage/BUILD.gn b/components/reporting/storage/BUILD.gn
index ba3e71a..de56333 100644
--- a/components/reporting/storage/BUILD.gn
+++ b/components/reporting/storage/BUILD.gn
@@ -76,6 +76,7 @@
     "//components/reporting/encryption:primitives",
     "//components/reporting/encryption:verification",
     "//components/reporting/health:health_module",
+    "//components/reporting/proto:pipeline_id_proto",
     "//components/reporting/proto:record_constants",
     "//components/reporting/proto:record_proto",
     "//components/reporting/resources:resource_interface",
diff --git a/components/reporting/storage/storage.cc b/components/reporting/storage/storage.cc
index 9e5eb36..f822e0d 100644
--- a/components/reporting/storage/storage.cc
+++ b/components/reporting/storage/storage.cc
@@ -28,6 +28,7 @@
 #include "components/reporting/encryption/encryption_module_interface.h"
 #include "components/reporting/encryption/primitives.h"
 #include "components/reporting/encryption/verification.h"
+#include "components/reporting/proto/synced/pipeline_id.pb.h"
 #include "components/reporting/proto/synced/record.pb.h"
 #include "components/reporting/resources/resource_interface.h"
 #include "components/reporting/storage/storage_configuration.h"
@@ -38,6 +39,7 @@
 #include "components/reporting/util/status_macros.h"
 #include "components/reporting/util/statusor.h"
 #include "components/reporting/util/task_runner_context.h"
+#include "crypto/sha2.h"
 #include "third_party/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h"
 
 namespace reporting {
@@ -45,7 +47,10 @@
 namespace {
 constexpr base::FilePath::CharType kEncryptionKeyFilePrefix[] =
     FILE_PATH_LITERAL("EncryptionKey.");
+constexpr base::FilePath::CharType kPipelineIdFileName[] =
+    FILE_PATH_LITERAL("PipelineId");
 constexpr int32_t kEncryptionKeyMaxFileSize = 256;
+constexpr int32_t kPipelineIdMaxFileSize = 256;
 }  // namespace
 
 // Uploader interface adaptor for individual queue.
@@ -201,6 +206,146 @@
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
+class Storage::PipelineIdInStorage {
+ public:
+  explicit PipelineIdInStorage(const base::FilePath& directory)
+      : directory_(directory) {}
+  ~PipelineIdInStorage() = default;
+  Status StorePipelineId(base::StringPiece pipeline_id) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    PipelineIdStorageInfo info;
+    std::string pipeline_id_str(pipeline_id);
+    info.set_pipeline_id(pipeline_id_str);
+    info.set_pipeline_id_signature(GetSignature(pipeline_id_str));
+    Status write_status = WriteToFile(info);
+    if (write_status.ok()) {
+      // Invalidate cached |pipeline_id_| value so that we read from the file
+      // next time.
+      pipeline_id_.reset();
+    }
+    return write_status;
+  }
+  StatusOr<std::string> GetPipelineId() {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    // Read cached value instead of performing a file read.
+    if (pipeline_id_.has_value()) {
+      return pipeline_id_.value();
+    }
+    const auto pipeline_id_result = ReadFromFile();
+    if (!pipeline_id_result.ok()) {
+      return pipeline_id_result.status();
+    }
+    // Cache |pipeline_id_| for next read
+    pipeline_id_ = pipeline_id_result.ValueOrDie().pipeline_id();
+    DCHECK(pipeline_id_.has_value());
+    base::StringPiece signature =
+        pipeline_id_result.ValueOrDie().pipeline_id_signature();
+    if (!VerifySignature(pipeline_id_.value(), signature)) {
+      return Status(error::DATA_LOSS, "Pipeline id corrupted in storage.");
+    }
+    return pipeline_id_.value();
+  }
+
+ private:
+  static bool VerifySignature(base::StringPiece id,
+                              base::StringPiece signature) {
+    return signature == GetSignature(id);
+  }
+  static std::string GetSignature(base::StringPiece pipeline_id) {
+    return crypto::SHA256HashString(pipeline_id);
+  }
+  // Writes the pipeline ID and its signature to a file in a serialized
+  // PipelineIdStorageInfo format. Overwrites any data written during previous
+  // calls.
+  Status WriteToFile(const PipelineIdStorageInfo info) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    base::FilePath pipeline_id_file_path =
+        directory_.Append(kPipelineIdFileName);
+    // Create or overwrite the existing file and open for writing.
+    base::File pipeline_id_file(
+        pipeline_id_file_path,
+        base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+    if (!pipeline_id_file.IsValid()) {
+      return Status(
+          error::NOT_FOUND,
+          base::StrCat({"Cannot open pipeline id file='",
+                        pipeline_id_file_path.MaybeAsASCII(), "' for append"}));
+    }
+    std::string serialized_info;
+    if (!info.SerializeToString(&serialized_info)) {
+      return Status(error::DATA_LOSS,
+                    base::StrCat({"Failed to serialize pipeline id into file='",
+                                  pipeline_id_file_path.MaybeAsASCII(), "'"}));
+    }
+    const int32_t write_result = pipeline_id_file.Write(
+        /*offset=*/0, serialized_info.data(), serialized_info.size());
+    if (write_result < 0) {
+      return Status(
+          error::DATA_LOSS,
+          base::StrCat({"File write error=",
+                        pipeline_id_file.ErrorToString(
+                            pipeline_id_file.GetLastFileError()),
+                        " file=", pipeline_id_file_path.MaybeAsASCII()}));
+    }
+    if (static_cast<size_t>(write_result) != serialized_info.size()) {
+      return Status(error::DATA_LOSS,
+                    base::StrCat({"Failed to serialize pipeline id into file='",
+                                  pipeline_id_file_path.MaybeAsASCII(), "'"}));
+    }
+    return Status::StatusOK();
+  }
+  StatusOr<PipelineIdStorageInfo> ReadFromFile() {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    // Make sure the assigned directory exists.
+    if (base::File::Error error;
+        !base::CreateDirectoryAndGetError(directory_, &error)) {
+      return Status(
+          error::UNAVAILABLE,
+          base::StrCat(
+              {"Storage directory '", directory_.MaybeAsASCII(),
+               "' does not exist, error=", base::File::ErrorToString(error)}));
+    }
+    base::FilePath pipeline_id_file_path =
+        directory_.Append(kPipelineIdFileName);
+    base::File pipeline_id_file(pipeline_id_file_path,
+                                base::File::FLAG_OPEN | base::File::FLAG_READ);
+    if (!pipeline_id_file.IsValid()) {
+      return Status(error::NOT_FOUND,
+                    base::StrCat({"Could not open pipeline file, full_name= ",
+                                  pipeline_id_file_path.MaybeAsASCII()}));
+    }
+    PipelineIdStorageInfo pipeline_id_storage_info;
+    const auto file_buffer = std::make_unique<char[]>(kPipelineIdMaxFileSize);
+    const int32_t read_result = pipeline_id_file.Read(
+        /*offset=*/0, file_buffer.get(), kPipelineIdMaxFileSize);
+    if (read_result < 0) {
+      return Status(error::DATA_LOSS,
+                    base::StrCat({"File read error, full_name= ",
+                                  pipeline_id_file.ErrorToString(
+                                      pipeline_id_file.GetLastFileError()),
+                                  " ", pipeline_id_file_path.MaybeAsASCII()}));
+    }
+    if (read_result == 0 || read_result >= kPipelineIdMaxFileSize) {
+      return Status(
+          error::DATA_LOSS,
+          base::StrCat({"Unexpected pipeline id file size, full_name= ",
+                        pipeline_id_file_path.MaybeAsASCII()}));
+    }
+    google::protobuf::io::ArrayInputStream stream(  // Zero-copy stream.
+        file_buffer.get(), read_result);
+    if (!pipeline_id_storage_info.ParseFromZeroCopyStream(&stream)) {
+      return Status(
+          error::DATA_LOSS,
+          base::StrCat({"Failed to parse pipeline ID file, full_name= ",
+                        pipeline_id_file_path.MaybeAsASCII()}));
+    }
+    return pipeline_id_storage_info;
+  }
+  absl::optional<std::string> pipeline_id_;
+  const base::FilePath directory_;
+  SEQUENCE_CHECKER(sequence_checker_);
+};
+
 class Storage::KeyInStorage {
  public:
   KeyInStorage(base::StringPiece signature_verification_public_key,
@@ -614,7 +759,9 @@
       key_in_storage_(std::make_unique<KeyInStorage>(
           options.signature_verification_public_key(),
           options.directory())),
-      async_start_upload_cb_(async_start_upload_cb) {}
+      async_start_upload_cb_(async_start_upload_cb),
+      pipeline_id_in_storage_(
+          std::make_unique<PipelineIdInStorage>(options.directory())) {}
 
 Storage::~Storage() = default;
 
@@ -722,4 +869,12 @@
   }
   return it->second;
 }
+
+Status Storage::StorePipelineId(base::StringPiece pipeline_id) {
+  return pipeline_id_in_storage_->StorePipelineId(pipeline_id);
+}
+
+StatusOr<std::string> Storage::GetPipelineId() {
+  return pipeline_id_in_storage_->GetPipelineId();
+}
 }  // namespace reporting
diff --git a/components/reporting/storage/storage.h b/components/reporting/storage/storage.h
index 9470dcf..f9587d9 100644
--- a/components/reporting/storage/storage.h
+++ b/components/reporting/storage/storage.h
@@ -76,6 +76,12 @@
   // be paased here.
   void UpdateEncryptionKey(SignedEncryptionInfo signed_encryption_key);
 
+  // Stores the given |pipeline_id|. Overwrites any data from previous calls.
+  // Returns "ok" |Status| if success. Otherwise returns error Status.
+  Status StorePipelineId(base::StringPiece pipeline_id);
+  // Returns the pipeline ID if possible. Otherwise, returns error Status.
+  StatusOr<std::string> GetPipelineId();
+
  protected:
   virtual ~Storage();
 
@@ -93,6 +99,9 @@
   // one server roundtrip and notify all requestors upon its completion.
   class KeyDelivery;
 
+  // Private helper class for pipeline ID upload/download to the file system.
+  class PipelineIdInStorage;
+
   // Private constructor, to be called by Create factory method only.
   // Queues need to be added afterwards.
   Storage(const StorageOptions& options,
@@ -131,6 +140,9 @@
 
   // Upload provider callback.
   const UploaderInterface::AsyncStartUploaderCb async_start_upload_cb_;
+
+  // Internal pipeline ID management module.
+  std::unique_ptr<PipelineIdInStorage> pipeline_id_in_storage_;
 };
 
 }  // namespace reporting
diff --git a/components/reporting/storage/storage_unittest.cc b/components/reporting/storage/storage_unittest.cc
index 64854ce..1f018fb 100644
--- a/components/reporting/storage/storage_unittest.cc
+++ b/components/reporting/storage/storage_unittest.cc
@@ -51,6 +51,7 @@
 using ::testing::Gt;
 using ::testing::HasSubstr;
 using ::testing::Invoke;
+using ::testing::Ne;
 using ::testing::Property;
 using ::testing::Return;
 using ::testing::Sequence;
@@ -1031,6 +1032,51 @@
 constexpr std::array<const char*, 3> kData = {"Rec1111", "Rec222", "Rec33"};
 constexpr std::array<const char*, 3> kMoreData = {"More1111", "More222",
                                                   "More33"};
+TEST_P(StorageTest, WriteAndReadPipelineId) {
+  ResetTestStorage();
+  CreateTestStorageOrDie(BuildTestStorageOptions());
+  constexpr char kTestPipelineId[] = "test_pipeline_id";
+  Status status = storage_->StorePipelineId(kTestPipelineId);
+  EXPECT_THAT(status, Eq(Status::StatusOK()));
+  StatusOr<std::string> pipeline_id_result = storage_->GetPipelineId();
+  EXPECT_THAT(pipeline_id_result.status(), Eq(Status::StatusOK()));
+  EXPECT_THAT(pipeline_id_result.ValueOrDie(), Eq(kTestPipelineId));
+}
+
+TEST_P(StorageTest, PipelineIdMultipleSuccessiveReadsOk) {
+  ResetTestStorage();
+  CreateTestStorageOrDie(BuildTestStorageOptions());
+  constexpr char kTestPipelineId[] = "test_pipeline_id";
+  Status status = storage_->StorePipelineId(kTestPipelineId);
+  EXPECT_THAT(status, Eq(Status::StatusOK()));
+  StatusOr<std::string> pipeline_id_result = storage_->GetPipelineId();
+  EXPECT_THAT(pipeline_id_result.status(), Eq(Status::StatusOK()));
+  EXPECT_THAT(pipeline_id_result.ValueOrDie(), Eq(kTestPipelineId));
+  StatusOr<std::string> pipeline_id_result_2 = storage_->GetPipelineId();
+  EXPECT_THAT(pipeline_id_result_2.status(), Eq(Status::StatusOK()));
+  EXPECT_THAT(pipeline_id_result_2.ValueOrDie(), Eq(kTestPipelineId));
+}
+
+TEST_P(StorageTest, OverwritingPipelineIdReturnsMostRecentWrite) {
+  ResetTestStorage();
+  CreateTestStorageOrDie(BuildTestStorageOptions());
+  constexpr char kTestPipelineId[] = "test_pipeline_id";
+  Status status = storage_->StorePipelineId(kTestPipelineId);
+  EXPECT_THAT(status, Eq(Status::StatusOK()));
+  constexpr char kTestPipelineId_2[] = "test_pipeline_id_2";
+  Status status_2 = storage_->StorePipelineId(kTestPipelineId_2);
+  EXPECT_THAT(status_2, Eq(Status::StatusOK()));
+  StatusOr<std::string> pipeline_id_result = storage_->GetPipelineId();
+  EXPECT_THAT(pipeline_id_result.status(), Eq(Status::StatusOK()));
+  EXPECT_THAT(pipeline_id_result.ValueOrDie(), Eq(kTestPipelineId_2));
+}
+
+TEST_P(StorageTest, PipelineIdReadReturnsErrorIfNothingStored) {
+  ResetTestStorage();
+  CreateTestStorageOrDie(BuildTestStorageOptions());
+  StatusOr<std::string> pipeline_id_result = storage_->GetPipelineId();
+  EXPECT_THAT(pipeline_id_result.status(), Ne(Status::StatusOK()));
+}
 
 TEST_P(StorageTest, WriteIntoNewStorageAndReopen) {
   CreateTestStorageOrDie(BuildTestStorageOptions());
diff --git a/components/safe_browsing/content/browser/browser_url_loader_throttle.cc b/components/safe_browsing/content/browser/browser_url_loader_throttle.cc
index 5c3289c..1aa1de3e 100644
--- a/components/safe_browsing/content/browser/browser_url_loader_throttle.cc
+++ b/components/safe_browsing/content/browser/browser_url_loader_throttle.cc
@@ -39,6 +39,7 @@
       bool real_time_lookup_enabled,
       bool can_rt_check_subresource_url,
       bool can_check_db,
+      bool can_check_high_confidence_allowlist,
       base::WeakPtr<RealTimeUrlLookupServiceBase> url_lookup_service)
       : delegate_getter_(std::move(delegate_getter)),
         frame_tree_node_id_(frame_tree_node_id),
@@ -47,6 +48,8 @@
         real_time_lookup_enabled_(real_time_lookup_enabled),
         can_rt_check_subresource_url_(can_rt_check_subresource_url),
         can_check_db_(can_check_db),
+        can_check_high_confidence_allowlist_(
+            can_check_high_confidence_allowlist),
         url_lookup_service_(url_lookup_service) {
     content::WebContents* contents = web_contents_getter_.Run();
     if (!!contents) {
@@ -85,7 +88,8 @@
         url_checker_delegate, web_contents_getter_,
         content::ChildProcessHost::kInvalidUniqueID, MSG_ROUTING_NONE,
         frame_tree_node_id_, real_time_lookup_enabled_,
-        can_rt_check_subresource_url_, can_check_db_, last_committed_url_,
+        can_rt_check_subresource_url_, can_check_db_,
+        can_check_high_confidence_allowlist_, last_committed_url_,
         content::GetUIThreadTaskRunner({}), url_lookup_service_,
         WebUIInfoSingleton::GetInstance());
 
@@ -156,6 +160,7 @@
   bool real_time_lookup_enabled_ = false;
   bool can_rt_check_subresource_url_ = false;
   bool can_check_db_ = true;
+  bool can_check_high_confidence_allowlist_ = true;
   GURL last_committed_url_;
   base::WeakPtr<RealTimeUrlLookupServiceBase> url_lookup_service_;
 };
@@ -192,10 +197,15 @@
   // default.
   bool can_check_db =
       url_lookup_service ? url_lookup_service->CanCheckSafeBrowsingDb() : true;
+  bool can_check_high_confidence_allowlist =
+      url_lookup_service
+          ? url_lookup_service->CanCheckSafeBrowsingHighConfidenceAllowlist()
+          : true;
   io_checker_ = std::make_unique<CheckerOnIO>(
       std::move(delegate_getter), frame_tree_node_id, web_contents_getter,
       weak_factory_.GetWeakPtr(), real_time_lookup_enabled,
-      can_rt_check_subresource_url, can_check_db, url_lookup_service);
+      can_rt_check_subresource_url, can_check_db,
+      can_check_high_confidence_allowlist, url_lookup_service);
 }
 
 BrowserURLLoaderThrottle::~BrowserURLLoaderThrottle() {
diff --git a/components/safe_browsing/content/browser/mojo_safe_browsing_impl.cc b/components/safe_browsing/content/browser/mojo_safe_browsing_impl.cc
index d030435f..255d3f0 100644
--- a/components/safe_browsing/content/browser/mojo_safe_browsing_impl.cc
+++ b/components/safe_browsing/content/browser/mojo_safe_browsing_impl.cc
@@ -162,8 +162,8 @@
       content::RenderFrameHost::kNoFrameTreeNodeId,
       /*real_time_lookup_enabled=*/false,
       /*can_rt_check_subresource_url=*/false,
-      /*can_check_db=*/true, /*last_committed_url=*/GURL(),
-      content::GetUIThreadTaskRunner({}),
+      /*can_check_db=*/true, /*can_check_high_confidence_allowlist=*/true,
+      /*last_committed_url=*/GURL(), content::GetUIThreadTaskRunner({}),
       /*url_lookup_service=*/nullptr, WebUIInfoSingleton::GetInstance());
 
   checker_impl->CheckUrl(
diff --git a/components/safe_browsing/content/browser/web_api_handshake_checker.cc b/components/safe_browsing/content/browser/web_api_handshake_checker.cc
index 2d528de..ee79d98 100644
--- a/components/safe_browsing/content/browser/web_api_handshake_checker.cc
+++ b/components/safe_browsing/content/browser/web_api_handshake_checker.cc
@@ -64,8 +64,8 @@
         /*render_frame_id=*/MSG_ROUTING_NONE, frame_tree_node_id_,
         /*real_time_lookup_enabled=*/false,
         /*can_rt_check_subresource_url=*/false,
-        /*can_check_db=*/true, last_committed_url_,
-        content::GetUIThreadTaskRunner({}),
+        /*can_check_db=*/true, /*can_check_high_confidence_allowlist=*/true,
+        last_committed_url_, content::GetUIThreadTaskRunner({}),
         /*url_lookup_service=*/nullptr, WebUIInfoSingleton::GetInstance());
     url_checker_->CheckUrl(
         url, "GET",
diff --git a/components/safe_browsing/core/browser/realtime/url_lookup_service.cc b/components/safe_browsing/core/browser/realtime/url_lookup_service.cc
index 38a562a..336350b 100644
--- a/components/safe_browsing/core/browser/realtime/url_lookup_service.cc
+++ b/components/safe_browsing/core/browser/realtime/url_lookup_service.cc
@@ -148,6 +148,13 @@
   return true;
 }
 
+bool RealTimeUrlLookupService::CanCheckSafeBrowsingHighConfidenceAllowlist()
+    const {
+  // Always return true, because consumer real time URL check always checks
+  // high confidence allowlist.
+  return true;
+}
+
 bool RealTimeUrlLookupService::CanSendRTSampleRequest() const {
   return IsExtendedReportingEnabled(*pref_service_) &&
          base::FeatureList::IsEnabled(
diff --git a/components/safe_browsing/core/browser/realtime/url_lookup_service.h b/components/safe_browsing/core/browser/realtime/url_lookup_service.h
index 42ea49b..36188b704 100644
--- a/components/safe_browsing/core/browser/realtime/url_lookup_service.h
+++ b/components/safe_browsing/core/browser/realtime/url_lookup_service.h
@@ -76,6 +76,7 @@
   bool CanPerformFullURLLookup() const override;
   bool CanCheckSubresourceURL() const override;
   bool CanCheckSafeBrowsingDb() const override;
+  bool CanCheckSafeBrowsingHighConfidenceAllowlist() const override;
   void Shutdown() override;
   bool CanSendRTSampleRequest() const override;
 
diff --git a/components/safe_browsing/core/browser/realtime/url_lookup_service_base.h b/components/safe_browsing/core/browser/realtime/url_lookup_service_base.h
index f7d0372e..8993156 100644
--- a/components/safe_browsing/core/browser/realtime/url_lookup_service_base.h
+++ b/components/safe_browsing/core/browser/realtime/url_lookup_service_base.h
@@ -116,6 +116,11 @@
   // check is enabled.
   virtual bool CanCheckSafeBrowsingDb() const = 0;
 
+  // Returns whether safe browsing high confidence allowlist can be checked when
+  // real time URL check is enabled. This should only be used when
+  // CanCheckSafeBrowsingDb() returns true.
+  virtual bool CanCheckSafeBrowsingHighConfidenceAllowlist() const = 0;
+
   // Checks if a sample ping can be sent to Safe Browsing.
   virtual bool CanSendRTSampleRequest() const = 0;
 
diff --git a/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.cc b/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.cc
index 643f3eba..0feec8b 100644
--- a/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.cc
+++ b/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.cc
@@ -128,6 +128,7 @@
     bool real_time_lookup_enabled,
     bool can_rt_check_subresource_url,
     bool can_check_db,
+    bool can_check_high_confidence_allowlist,
     GURL last_committed_url,
     scoped_refptr<base::SequencedTaskRunner> ui_task_runner,
     base::WeakPtr<RealTimeUrlLookupServiceBase> url_lookup_service_on_ui,
@@ -145,6 +146,7 @@
       real_time_lookup_enabled_(real_time_lookup_enabled),
       can_rt_check_subresource_url_(can_rt_check_subresource_url),
       can_check_db_(can_check_db),
+      can_check_high_confidence_allowlist_(can_check_high_confidence_allowlist),
       last_committed_url_(last_committed_url),
       ui_task_runner_(ui_task_runner),
       url_lookup_service_on_ui_(url_lookup_service_on_ui),
@@ -434,7 +436,7 @@
                                 request_destination_);
       safe_synchronously = false;
       AsyncMatch match =
-          can_check_db_
+          (can_check_db_ && can_check_high_confidence_allowlist_)
               ? database_manager_->CheckUrlForHighConfidenceAllowlist(url, this)
               : AsyncMatch::NO_MATCH;
       RecordLocalMatchResult(match, request_destination_);
diff --git a/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.h b/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.h
index 028ead2..861f356 100644
--- a/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.h
+++ b/components/safe_browsing/core/browser/safe_browsing_url_checker_impl.h
@@ -106,6 +106,7 @@
       bool real_time_lookup_enabled,
       bool can_rt_check_subresource_url,
       bool can_check_db,
+      bool can_check_high_confidence_allowlist,
       GURL last_committed_url,
       scoped_refptr<base::SequencedTaskRunner> ui_task_runner,
       base::WeakPtr<RealTimeUrlLookupServiceBase> url_lookup_service_on_ui,
@@ -342,6 +343,11 @@
   // for this profile.
   bool can_check_db_;
 
+  // Whether the high confidence allowlist can be checked. It is set to false
+  // when enterprise real time URL lookup and allowlist bypass is also
+  // enabled (SafeBrowsingRealTimeUrlLookupForEnterpriseAllowlistBypass).
+  bool can_check_high_confidence_allowlist_ = true;
+
   // The last committed URL when the checker is constructed. It is used to
   // obtain page load token when the URL being checked is not a mainframe URL.
   // Only used when real time lookup is performed.
diff --git a/components/safe_browsing/core/browser/safe_browsing_url_checker_impl_unittest.cc b/components/safe_browsing/core/browser/safe_browsing_url_checker_impl_unittest.cc
index 4969386..f95351a 100644
--- a/components/safe_browsing/core/browser/safe_browsing_url_checker_impl_unittest.cc
+++ b/components/safe_browsing/core/browser/safe_browsing_url_checker_impl_unittest.cc
@@ -241,6 +241,9 @@
   bool CanPerformFullURLLookup() const override { return true; }
   bool CanCheckSubresourceURL() const override { return false; }
   bool CanCheckSafeBrowsingDb() const override { return true; }
+  bool CanCheckSafeBrowsingHighConfidenceAllowlist() const override {
+    return true;
+  }
   bool CanSendRTSampleRequest() const override { return true; }
 
  private:
@@ -296,6 +299,7 @@
         UnsafeResource::kNoRenderFrameId, UnsafeResource::kNoFrameTreeNodeId,
         real_time_lookup_enabled,
         /*can_rt_check_subresource_url=*/false, can_check_safe_browsing_db,
+        /*can_check_high_confidence_allowlist=*/true,
         /*last_committed_url=*/GURL(), base::SequencedTaskRunnerHandle::Get(),
         real_time_lookup_enabled ? url_lookup_service_->GetWeakPtr() : nullptr,
         /*webui_delegate_=*/nullptr);
diff --git a/components/search_engines/keyword_table.cc b/components/search_engines/keyword_table.cc
index 342906d4..cf891562 100644
--- a/components/search_engines/keyword_table.cc
+++ b/components/search_engines/keyword_table.cc
@@ -529,7 +529,7 @@
   data->alternate_urls.clear();
   absl::optional<base::Value> value(base::JSONReader::Read(s.ColumnString(15)));
   if (value && value->is_list()) {
-    for (const base::Value& alternate_url : value->GetListDeprecated()) {
+    for (const base::Value& alternate_url : value->GetList()) {
       if (alternate_url.is_string()) {
         data->alternate_urls.push_back(alternate_url.GetString());
       }
diff --git a/components/search_engines/template_url_data.cc b/components/search_engines/template_url_data.cc
index b1ea84d..ca0976e 100644
--- a/components/search_engines/template_url_data.cc
+++ b/components/search_engines/template_url_data.cc
@@ -112,10 +112,8 @@
   SetURL(std::string(search_url));
   input_encodings.push_back(std::string(encoding));
   if (alternate_urls_list.is_list()) {
-    auto alternate_urls_list_view = alternate_urls_list.GetListDeprecated();
-    for (size_t i = 0; i < alternate_urls_list_view.size(); ++i) {
-      const std::string* alternate_url =
-          alternate_urls_list_view[i].GetIfString();
+    for (const auto& entry : alternate_urls_list.GetList()) {
+      const std::string* alternate_url = entry.GetIfString();
       DCHECK(alternate_url && !alternate_url->empty());
       if (alternate_url) {
         alternate_urls.push_back(*alternate_url);
diff --git a/components/segmentation_platform/public/constants.cc b/components/segmentation_platform/public/constants.cc
index 2f02fd5..46d228a 100644
--- a/components/segmentation_platform/public/constants.cc
+++ b/components/segmentation_platform/public/constants.cc
@@ -16,8 +16,6 @@
   // go/segmentation-field-trials-map.
   if (segmentation_key == kAdaptiveToolbarSegmentationKey) {
     return kAdaptiveToolbarUmaName;
-  } else if (segmentation_key == kDummySegmentationKey) {
-    return kDummyFeatureUmaName;
   } else if (segmentation_key == kChromeStartAndroidSegmentationKey) {
     return kChromeStartAndroidUmaName;
   } else if (segmentation_key == kChromeStartAndroidV2SegmentationKey) {
diff --git a/components/segmentation_platform/public/constants.h b/components/segmentation_platform/public/constants.h
index d04a723..eaa133c 100644
--- a/components/segmentation_platform/public/constants.h
+++ b/components/segmentation_platform/public/constants.h
@@ -15,11 +15,6 @@
 const char kAdaptiveToolbarSegmentationKey[] = "adaptive_toolbar";
 const char kAdaptiveToolbarUmaName[] = "AdaptiveToolbar";
 
-// The key to be used for any feature that needs to collect and store data on
-// client side while being built.
-const char kDummySegmentationKey[] = "dummy_feature";
-const char kDummyFeatureUmaName[] = "DummyFeature";
-
 // The key is used to decide whether to show Chrome Start or not.
 const char kChromeStartAndroidSegmentationKey[] = "chrome_start_android";
 const char kChromeStartAndroidUmaName[] = "ChromeStartAndroid";
diff --git a/components/services/app_service/public/cpp/preferred_apps_converter.cc b/components/services/app_service/public/cpp/preferred_apps_converter.cc
index 2125a0f..a048de80 100644
--- a/components/services/app_service/public/cpp/preferred_apps_converter.cc
+++ b/components/services/app_service/public/cpp/preferred_apps_converter.cc
@@ -85,7 +85,7 @@
              << apps::kConditionValuesKey << "\" key with list value.";
     return nullptr;
   }
-  for (auto& condition_value : values->GetListDeprecated()) {
+  for (auto& condition_value : values->GetList()) {
     auto parsed_condition_value = ParseValueToConditionValue(condition_value);
     if (!parsed_condition_value) {
       DVLOG(0) << "Fail to parse condition. Cannot parse condition values";
@@ -105,7 +105,7 @@
     return nullptr;
   }
   auto intent_filter = std::make_unique<apps::IntentFilter>();
-  for (auto& condition : value->GetListDeprecated()) {
+  for (auto& condition : value->GetList()) {
     auto parsed_condition = ParseValueToCondition(condition);
     if (!parsed_condition) {
       DVLOG(0) << "Fail to parse intent filter. Cannot parse conditions.";
@@ -162,7 +162,7 @@
   }
 
   PreferredApps preferred_apps;
-  for (auto& entry : preferred_apps_list->GetListDeprecated()) {
+  for (auto& entry : preferred_apps_list->GetList()) {
     auto* app_id = entry.FindStringKey(kAppIdKey);
     if (!app_id) {
       DVLOG(0) << "Fail to parse condition value. Cannot find \""
diff --git a/components/services/app_service/public/cpp/preferred_apps_converter_unittest.cc b/components/services/app_service/public/cpp/preferred_apps_converter_unittest.cc
index aa0dfd5a..e0ff1a8 100644
--- a/components/services/app_service/public/cpp/preferred_apps_converter_unittest.cc
+++ b/components/services/app_service/public/cpp/preferred_apps_converter_unittest.cc
@@ -34,21 +34,20 @@
   auto* converted_preferred_apps =
       converted_value.FindKey(apps::kPreferredAppsKey);
   // Check that each entry is correct.
-  ASSERT_EQ(1u, converted_preferred_apps->GetListDeprecated().size());
-  auto& entry = converted_preferred_apps->GetListDeprecated()[0];
+  ASSERT_EQ(1u, converted_preferred_apps->GetList().size());
+  auto& entry = converted_preferred_apps->GetList()[0];
   EXPECT_EQ(kAppId1, *entry.FindStringKey(apps::kAppIdKey));
 
   auto* converted_intent_filter = entry.FindKey(apps::kIntentFilterKey);
   ASSERT_EQ(intent_filter->conditions.size(),
-            converted_intent_filter->GetListDeprecated().size());
+            converted_intent_filter->GetList().size());
 
   for (size_t i = 0; i < intent_filter->conditions.size(); i++) {
     auto& condition = intent_filter->conditions[i];
-    auto& converted_condition = converted_intent_filter->GetListDeprecated()[i];
+    auto& converted_condition = converted_intent_filter->GetList()[i];
     auto& condition_values = condition->condition_values;
-    auto converted_condition_values =
-        converted_condition.FindKey(apps::kConditionValuesKey)
-            ->GetListDeprecated();
+    const auto& converted_condition_values =
+        converted_condition.FindKey(apps::kConditionValuesKey)->GetList();
 
     EXPECT_EQ(static_cast<int>(condition->condition_type),
               converted_condition.FindIntKey(apps::kConditionTypeKey));
diff --git a/components/sync/base/features.h b/components/sync/base/features.h
index 84c9f8800..2cee9f5 100644
--- a/components/sync/base/features.h
+++ b/components/sync/base/features.h
@@ -186,6 +186,9 @@
 inline constexpr base::Feature kSyncEnableHistoryDataType = {
     "SyncEnableHistoryDataType", base::FEATURE_DISABLED_BY_DEFAULT};
 
+inline constexpr base::Feature kSyncEnableContactInfoDataType{
+    "SyncEnableContactInfoDataType", base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace syncer
 
 #endif  // COMPONENTS_SYNC_BASE_FEATURES_H_
diff --git a/components/sync/driver/sync_policy_handler.cc b/components/sync/driver/sync_policy_handler.cc
index be825cd..a8b389a 100644
--- a/components/sync/driver/sync_policy_handler.cc
+++ b/components/sync/driver/sync_policy_handler.cc
@@ -66,8 +66,7 @@
   const base::Value* disabled_sync_types_value = policies.GetValue(
       policy::key::kSyncTypesListDisabled, base::Value::Type::LIST);
   if (disabled_sync_types_value) {
-    base::Value::ConstListView list =
-        disabled_sync_types_value->GetListDeprecated();
+    const base::Value::List& list = disabled_sync_types_value->GetList();
     for (const base::Value& type_name : list) {
       if (!type_name.is_string())
         continue;
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn
index 5c5b5dd..7107133 100644
--- a/components/vector_icons/BUILD.gn
+++ b/components/vector_icons/BUILD.gn
@@ -16,6 +16,7 @@
     "ads_click.icon",
     "arrow_back.icon",
     "back_arrow.icon",
+    "back_to_tab.icon",
     "blocked_badge.icon",
     "bluetooth.icon",
     "bluetooth_connected.icon",
diff --git a/chrome/app/vector_icons/back_to_tab.icon b/components/vector_icons/back_to_tab.icon
similarity index 100%
rename from chrome/app/vector_icons/back_to_tab.icon
rename to components/vector_icons/back_to_tab.icon
diff --git a/components/viz/service/display/overlay_candidate_factory_unittest.cc b/components/viz/service/display/overlay_candidate_factory_unittest.cc
index 2164b43..ce7708f3 100644
--- a/components/viz/service/display/overlay_candidate_factory_unittest.cc
+++ b/components/viz/service/display/overlay_candidate_factory_unittest.cc
@@ -182,7 +182,7 @@
 // would likely be incorrect since clip rects are generally provided in target
 // space and cannot be baked into the display rect when there is an arbitrary
 // transform in between.
-TEST_F(OverlayCandidateFactoryArbitraryTransformTest, DISABLED_DeathOnNoClipSupport) {
+TEST_F(OverlayCandidateFactoryArbitraryTransformTest, DeathOnNoClipSupport) {
   AggregatedRenderPass render_pass;
   render_pass.SetNew(AggregatedRenderPassId::FromUnsafeValue(1),
                      gfx::Rect(0, 0, 1, 1), gfx::Rect(), gfx::Transform());
@@ -196,7 +196,7 @@
 // calculation. This doesn't make sense with arbitrary transforms, so we expect
 // a DCHECK to trip.
 TEST_F(OverlayCandidateFactoryArbitraryTransformTest,
-       DISABLED_DeathOnResourcelessAndArbitraryTransform) {
+       DeathOnResourcelessAndArbitraryTransform) {
   AggregatedRenderPass render_pass;
   render_pass.SetNew(AggregatedRenderPassId::FromUnsafeValue(1),
                      gfx::Rect(0, 0, 2, 2), gfx::Rect(0, 0, 1, 1),
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
index f557b4a..c7bcac4 100644
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
+++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
@@ -40,7 +40,7 @@
 public final class AuthenticatorImpl implements Authenticator {
     private static final String GMSCORE_PACKAGE_NAME = "com.google.android.gms";
     public static final int GMSCORE_MIN_VERSION = 16890000;
-    public static final int GMSCORE_MIN_VERSION_GET_MATCHING_CRED_IDS = 22330000;
+    public static final int GMSCORE_MIN_VERSION_GET_MATCHING_CRED_IDS = 223300000;
     private final WebAuthenticationDelegate.IntentSender mIntentSender;
     private final RenderFrameHost mRenderFrameHost;
     private final @WebAuthenticationDelegate.Support int mSupportLevel;
diff --git a/components/webdata_services/web_data_service_wrapper.cc b/components/webdata_services/web_data_service_wrapper.cc
index d88ec48..22129b0 100644
--- a/components/webdata_services/web_data_service_wrapper.cc
+++ b/components/webdata_services/web_data_service_wrapper.cc
@@ -21,6 +21,7 @@
 #include "components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_wallet_usage_data_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
+#include "components/autofill/core/browser/webdata/contact_info_sync_bridge.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/search_engines/keyword_table.h"
 #include "components/search_engines/keyword_web_data_service.h"
@@ -42,6 +43,7 @@
     scoped_refptr<base::SingleThreadTaskRunner> db_task_runner,
     const scoped_refptr<autofill::AutofillWebDataService>& autofill_web_data,
     const std::string& app_locale,
+    bool enable_contact_info_sync,
     autofill::AutofillWebDataBackend* autofill_backend) {
   DCHECK(db_task_runner->RunsTasksInCurrentSequence());
 
@@ -49,6 +51,10 @@
       autofill_web_data.get(), autofill_backend);
   autofill::AutofillProfileSyncBridge::CreateForWebDataServiceAndBackend(
       app_locale, autofill_backend, autofill_web_data.get());
+  if (enable_contact_info_sync) {
+    autofill::ContactInfoSyncBridge::CreateForWebDataServiceAndBackend(
+        autofill_backend, autofill_web_data.get());
+  }
 }
 
 void InitWalletSyncBridgesOnDBSequence(
@@ -139,9 +145,10 @@
       base::BindOnce(show_error_callback, ERROR_LOADING_PAYMENT_MANIFEST));
 #endif
 
-  profile_autofill_web_data_->GetAutofillBackend(
-      base::BindOnce(&InitAutofillSyncBridgesOnDBSequence, db_task_runner,
-                     profile_autofill_web_data_, application_locale));
+  profile_autofill_web_data_->GetAutofillBackend(base::BindOnce(
+      &InitAutofillSyncBridgesOnDBSequence, db_task_runner,
+      profile_autofill_web_data_, application_locale,
+      base::FeatureList::IsEnabled(syncer::kSyncEnableContactInfoDataType)));
   profile_autofill_web_data_->GetAutofillBackend(
       base::BindOnce(&InitWalletSyncBridgesOnDBSequence, db_task_runner,
                      profile_autofill_web_data_, application_locale));
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc
index 7e4b76c..2f799a2 100644
--- a/content/browser/accessibility/browser_accessibility_android.cc
+++ b/content/browser/accessibility/browser_accessibility_android.cc
@@ -639,6 +639,20 @@
   return true;
 }
 
+std::u16string BrowserAccessibilityAndroid::GetBrailleLabel() const {
+  if (HasStringAttribute(ax::mojom::StringAttribute::kAriaBrailleLabel))
+    return GetString16Attribute(ax::mojom::StringAttribute::kAriaBrailleLabel);
+  return std::u16string();
+}
+
+std::u16string BrowserAccessibilityAndroid::GetBrailleRoleDescription() const {
+  if (HasStringAttribute(
+          ax::mojom::StringAttribute::kAriaBrailleRoleDescription))
+    return GetString16Attribute(
+        ax::mojom::StringAttribute::kAriaBrailleRoleDescription);
+  return std::u16string();
+}
+
 std::u16string BrowserAccessibilityAndroid::GetTextContentUTF16() const {
   return GetSubstringTextContentUTF16(absl::nullopt);
 }
diff --git a/content/browser/accessibility/browser_accessibility_android.h b/content/browser/accessibility/browser_accessibility_android.h
index 3927a75e..638f9072 100644
--- a/content/browser/accessibility/browser_accessibility_android.h
+++ b/content/browser/accessibility/browser_accessibility_android.h
@@ -108,6 +108,9 @@
   bool IsLeaf() const override;
   bool IsLeafConsideringChildren() const;
 
+  std::u16string GetBrailleLabel() const;
+  std::u16string GetBrailleRoleDescription() const;
+
   // Note: In the Android accessibility API, the word "text" is used where other
   // platforms would use "name". The value returned here will appear in dump
   // tree tests as "name" in the ...-android.txt files, but as "text" in the
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index 7c9ed5f..6ba6dd8 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -311,10 +311,10 @@
 
 void BrowserAccessibilityManager::FireGeneratedEvent(
     ui::AXEventGenerator::Event event_type,
-    BrowserAccessibility* node) {
+    const ui::AXNode* node) {
   if (!generated_event_callback_for_testing_.is_null()) {
     generated_event_callback_for_testing_.Run(delegate(), event_type,
-                                              node->GetId());
+                                              node->id());
   }
 }
 
@@ -384,8 +384,10 @@
   BrowserAccessibilityManager* parent_manager = parent->manager();
   parent = parent_manager->RetargetBrowserAccessibilityForEvents(
       parent, RetargetEventType::RetargetEventTypeGenerated);
+  DCHECK(parent) << "RetargetBrowserAccessibilityForEvents shouldn't return a "
+                    "null pointer when |parent| is not null.";
   parent_manager->FireGeneratedEvent(
-      ui::AXEventGenerator::Event::CHILDREN_CHANGED, parent);
+      ui::AXEventGenerator::Event::CHILDREN_CHANGED, parent->node());
 }
 
 void BrowserAccessibilityManager::EnsureParentConnectionIfNotRootManager() {
@@ -592,10 +594,12 @@
       continue;
 
     // IsDescendantOf() also returns true in the case of equality.
-    if (focus && focus != event_target && focus->IsDescendantOf(event_target))
-      FireGeneratedEvent(targeted_event.event_params.event, event_target);
-    else
+    if (focus && focus != event_target && focus->IsDescendantOf(event_target)) {
+      FireGeneratedEvent(targeted_event.event_params.event,
+                         event_target->node());
+    } else {
       deferred_events.push_back(targeted_event);
+    }
   }
 
   // Screen readers might not process events related to the currently-focused
@@ -622,7 +626,7 @@
     if (!event_target->CanFireEvents())
       continue;
 
-    FireGeneratedEvent(targeted_event.event_params.event, event_target);
+    FireGeneratedEvent(targeted_event.event_params.event, event_target->node());
   }
   event_generator().ClearEvents();
 
@@ -1572,15 +1576,13 @@
 void BrowserAccessibilityManager::OnNodeWillBeDeleted(ui::AXTree* tree,
                                                       ui::AXNode* node) {
   DCHECK(node);
-  if (BrowserAccessibility* wrapper = GetFromAXNode(node)) {
-    if (node == GetLastFocusedNode())
-      SetLastFocusedNode(nullptr);
+  if (node == GetLastFocusedNode())
+    SetLastFocusedNode(nullptr);
 
-    // We fire these here, immediately, to ensure we can send platform
-    // notifications prior to the actual destruction of the object.
-    if (node->GetRole() == ax::mojom::Role::kMenu)
-      FireGeneratedEvent(ui::AXEventGenerator::Event::MENU_POPUP_END, wrapper);
-  }
+  // We fire these here, immediately, to ensure we can send platform
+  // notifications prior to the actual destruction of the object.
+  if (node->GetRole() == ax::mojom::Role::kMenu)
+    FireGeneratedEvent(ui::AXEventGenerator::Event::MENU_POPUP_END, node);
 }
 
 void BrowserAccessibilityManager::OnSubtreeWillBeDeleted(ui::AXTree* tree,
@@ -1950,7 +1952,7 @@
     base::TimeTicks activation_time) {
   if (GetTreeData().loaded) {
     FireGeneratedEvent(ui::AXEventGenerator::Event::PORTAL_ACTIVATED,
-                       GetBrowserAccessibilityRoot());
+                       GetRoot());
   }
 }
 
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h
index 492055c..936eb2b 100644
--- a/content/browser/accessibility/browser_accessibility_manager.h
+++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -169,8 +169,10 @@
   virtual void FireBlinkEvent(ax::mojom::Event event_type,
                               BrowserAccessibility* node,
                               int action_request_id) {}
-  virtual void FireGeneratedEvent(ui::AXEventGenerator::Event event_type,
-                                  BrowserAccessibility* node);
+
+  // AXTreemanager overrides.
+  void FireGeneratedEvent(ui::AXEventGenerator::Event event_type,
+                          const ui::AXNode* node) override;
 
   // Checks whether focus has changed since the last time it was checked,
   // taking into account whether the window has focus and which frame within
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc
index f2f68d4..6028698 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -79,12 +79,12 @@
 
 bool BrowserAccessibilityManagerAndroid::ShouldRespectDisplayedPasswordText() {
   WebContentsAccessibilityAndroid* wcax = GetWebContentsAXFromRootManager();
-  return wcax ? wcax->ShouldRespectDisplayedPasswordText() : false;
+  return wcax ? wcax->should_respect_displayed_password_text() : false;
 }
 
 bool BrowserAccessibilityManagerAndroid::ShouldExposePasswordText() {
   WebContentsAccessibilityAndroid* wcax = GetWebContentsAXFromRootManager();
-  return wcax ? wcax->ShouldExposePasswordText() : false;
+  return wcax ? wcax->should_expose_password_text() : false;
 }
 
 BrowserAccessibility* BrowserAccessibilityManagerAndroid::GetFocus() const {
@@ -221,14 +221,16 @@
 
 void BrowserAccessibilityManagerAndroid::FireGeneratedEvent(
     ui::AXEventGenerator::Event event_type,
-    BrowserAccessibility* node) {
+    const ui::AXNode* node) {
   BrowserAccessibilityManager::FireGeneratedEvent(event_type, node);
   WebContentsAccessibilityAndroid* wcax = GetWebContentsAXFromRootManager();
   if (!wcax)
     return;
 
+  BrowserAccessibility* wrapper = GetFromAXNode(node);
+  DCHECK(wrapper);
   BrowserAccessibilityAndroid* android_node =
-      static_cast<BrowserAccessibilityAndroid*>(node);
+      static_cast<BrowserAccessibilityAndroid*>(wrapper);
 
   if (event_type == ui::AXEventGenerator::Event::CHILDREN_CHANGED) {
     BrowserAccessibilityAndroid::ResetLeafCache();
@@ -320,7 +322,7 @@
       // leaf node might not be a text field. For example, in the unusual case
       // when the text field is inside a button, the leaf node is the button not
       // the text field.
-      if (android_node->IsTextField() && GetFocus() == node)
+      if (android_node->IsTextField() && GetFocus() == wrapper)
         wcax->HandleEditableTextChanged(android_node->unique_id());
       break;
 
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.h b/content/browser/accessibility/browser_accessibility_manager_android.h
index 69ad9714..c3d522e 100644
--- a/content/browser/accessibility/browser_accessibility_manager_android.h
+++ b/content/browser/accessibility/browser_accessibility_manager_android.h
@@ -98,7 +98,7 @@
                       BrowserAccessibility* node,
                       int action_request_id) override;
   void FireGeneratedEvent(ui::AXEventGenerator::Event event_type,
-                          BrowserAccessibility* node) override;
+                          const ui::AXNode* node) override;
 
   void FireLocationChanged(BrowserAccessibility* node);
 
diff --git a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
index 26b4b1ff..e0ab2d0 100644
--- a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
@@ -197,18 +197,20 @@
 
 void BrowserAccessibilityManagerAuraLinux::FireGeneratedEvent(
     ui::AXEventGenerator::Event event_type,
-    BrowserAccessibility* node) {
+    const ui::AXNode* node) {
   BrowserAccessibilityManager::FireGeneratedEvent(event_type, node);
 
+  BrowserAccessibility* wrapper = GetFromAXNode(node);
+  DCHECK(wrapper);
   switch (event_type) {
     case ui::AXEventGenerator::Event::ACTIVE_DESCENDANT_CHANGED:
-      FireEvent(node, ax::mojom::Event::kActiveDescendantChanged);
+      FireEvent(wrapper, ax::mojom::Event::kActiveDescendantChanged);
       break;
     case ui::AXEventGenerator::Event::ATK_TEXT_OBJECT_ATTRIBUTE_CHANGED:
-      FireTextAttributesChangedEvent(node);
+      FireTextAttributesChangedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::CHECKED_STATE_CHANGED:
-      FireEvent(node, ax::mojom::Event::kCheckedStateChanged);
+      FireEvent(wrapper, ax::mojom::Event::kCheckedStateChanged);
       break;
     case ui::AXEventGenerator::Event::BUSY_CHANGED: {
       // We reliably get busy-changed notifications when the value of aria-busy
@@ -219,17 +221,17 @@
       // loading. Because Orca needs the busy-changed notification to be
       // reliably fired on the document, we do so in response to load-start and
       // load-complete and suppress possible duplication here.
-      if (node->IsPlatformDocument())
+      if (wrapper->IsPlatformDocument())
         return;
-      FireBusyChangedEvent(node, node->GetData().GetBoolAttribute(
-                                     ax::mojom::BoolAttribute::kBusy));
+      FireBusyChangedEvent(wrapper, wrapper->GetData().GetBoolAttribute(
+                                        ax::mojom::BoolAttribute::kBusy));
       break;
     }
     case ui::AXEventGenerator::Event::COLLAPSED:
-      FireExpandedEvent(node, false);
+      FireExpandedEvent(wrapper, false);
       break;
     case ui::AXEventGenerator::Event::DESCRIPTION_CHANGED:
-      FireDescriptionChangedEvent(node);
+      FireDescriptionChangedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED: {
       ui::AXNodeID focus_id =
@@ -240,65 +242,65 @@
       break;
     }
     case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED:
-      FireEvent(node, ax::mojom::Event::kDocumentTitleChanged);
+      FireEvent(wrapper, ax::mojom::Event::kDocumentTitleChanged);
       break;
     case ui::AXEventGenerator::Event::ENABLED_CHANGED:
-      FireEnabledChangedEvent(node);
+      FireEnabledChangedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::EXPANDED:
-      FireExpandedEvent(node, true);
+      FireExpandedEvent(wrapper, true);
       break;
     case ui::AXEventGenerator::Event::INVALID_STATUS_CHANGED:
-      FireInvalidStatusChangedEvent(node);
+      FireInvalidStatusChangedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::ARIA_CURRENT_CHANGED:
-      FireAriaCurrentChangedEvent(node);
+      FireAriaCurrentChangedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::MENU_ITEM_SELECTED:
-      FireSelectedEvent(node);
+      FireSelectedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::MENU_POPUP_END:
-      FireShowingEvent(node, false);
+      FireShowingEvent(wrapper, false);
       break;
     case ui::AXEventGenerator::Event::MENU_POPUP_START:
-      FireShowingEvent(node, true);
+      FireShowingEvent(wrapper, true);
       break;
     case ui::AXEventGenerator::Event::NAME_CHANGED:
-      FireNameChangedEvent(node);
+      FireNameChangedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::PARENT_CHANGED:
-      FireParentChangedEvent(node);
+      FireParentChangedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::READONLY_CHANGED:
-      FireReadonlyChangedEvent(node);
+      FireReadonlyChangedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::RANGE_VALUE_CHANGED:
-      DCHECK(node->GetData().IsRangeValueSupported());
-      FireEvent(node, ax::mojom::Event::kValueChanged);
+      DCHECK(wrapper->GetData().IsRangeValueSupported());
+      FireEvent(wrapper, ax::mojom::Event::kValueChanged);
       break;
     case ui::AXEventGenerator::Event::SELECTED_CHILDREN_CHANGED:
-      FireEvent(node, ax::mojom::Event::kSelectedChildrenChanged);
+      FireEvent(wrapper, ax::mojom::Event::kSelectedChildrenChanged);
       break;
     case ui::AXEventGenerator::Event::SELECTED_CHANGED:
-      FireSelectedEvent(node);
+      FireSelectedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::SELECTED_VALUE_CHANGED:
-      DCHECK(ui::IsSelectElement(node->GetRole()));
-      FireEvent(node, ax::mojom::Event::kValueChanged);
+      DCHECK(ui::IsSelectElement(wrapper->GetRole()));
+      FireEvent(wrapper, ax::mojom::Event::kValueChanged);
       break;
     case ui::AXEventGenerator::Event::SORT_CHANGED:
-      FireSortDirectionChangedEvent(node);
+      FireSortDirectionChangedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::SUBTREE_CREATED:
-      FireSubtreeCreatedEvent(node);
+      FireSubtreeCreatedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::TEXT_ATTRIBUTE_CHANGED:
-      FireTextAttributesChangedEvent(node);
+      FireTextAttributesChangedEvent(wrapper);
       break;
     case ui::AXEventGenerator::Event::VALUE_IN_TEXT_FIELD_CHANGED:
-      if (!node->IsTextField())
-        return;  // Node no longer editable since event originally fired.
-      FireEvent(node, ax::mojom::Event::kValueChanged);
+      if (!wrapper->IsTextField())
+        return;  // node no longer editable since event originally fired.
+      FireEvent(wrapper, ax::mojom::Event::kValueChanged);
       break;
 
     // Currently unused events on this platform.
diff --git a/content/browser/accessibility/browser_accessibility_manager_auralinux.h b/content/browser/accessibility/browser_accessibility_manager_auralinux.h
index aa90dbd..ba3a5b28 100644
--- a/content/browser/accessibility/browser_accessibility_manager_auralinux.h
+++ b/content/browser/accessibility/browser_accessibility_manager_auralinux.h
@@ -42,7 +42,7 @@
                       BrowserAccessibility* node,
                       int action_request_id) override;
   void FireGeneratedEvent(ui::AXEventGenerator::Event event_type,
-                          BrowserAccessibility* node) override;
+                          const ui::AXNode* node) override;
 
   void FireSelectedEvent(BrowserAccessibility* node);
   void FireEnabledChangedEvent(BrowserAccessibility* node);
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.h b/content/browser/accessibility/browser_accessibility_manager_mac.h
index 2b39e8b..d5a0dfbe 100644
--- a/content/browser/accessibility/browser_accessibility_manager_mac.h
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.h
@@ -46,7 +46,7 @@
                       BrowserAccessibility* node,
                       int action_request_id) override;
   void FireGeneratedEvent(ui::AXEventGenerator::Event event_type,
-                          BrowserAccessibility* node) override;
+                          const ui::AXNode* node) override;
 
   bool OnAccessibilityEvents(
       const AXEventNotificationDetails& details) override;
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm
index 6309769..fda9114 100644
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -129,18 +129,21 @@
 
 void BrowserAccessibilityManagerMac::FireGeneratedEvent(
     ui::AXEventGenerator::Event event_type,
-    BrowserAccessibility* node) {
+    const ui::AXNode* node) {
   BrowserAccessibilityManager::FireGeneratedEvent(event_type, node);
-  BrowserAccessibilityCocoa* native_node = node->GetNativeViewAccessible();
+  BrowserAccessibility* wrapper = GetFromAXNode(node);
+  DCHECK(wrapper);
+  BrowserAccessibilityCocoa* native_node = wrapper->GetNativeViewAccessible();
   DCHECK(native_node);
 
   // Refer to |AXObjectCache::postPlatformNotification| in WebKit source code.
   NSString* mac_notification = nullptr;
   switch (event_type) {
     case ui::AXEventGenerator::Event::ACTIVE_DESCENDANT_CHANGED:
-      if (node->GetRole() == ax::mojom::Role::kTree) {
+      if (wrapper->GetRole() == ax::mojom::Role::kTree) {
         mac_notification = NSAccessibilitySelectedRowsChangedNotification;
-      } else if (node->GetRole() == ax::mojom::Role::kTextFieldWithComboBox) {
+      } else if (wrapper->GetRole() ==
+                 ax::mojom::Role::kTextFieldWithComboBox) {
         // Even though the selected item in the combo box has changed, we don't
         // want to post a focus change because this will take the focus out of
         // the combo box where the user might be typing.
@@ -172,8 +175,8 @@
       mac_notification = NSAccessibilityValueChangedNotification;
       break;
     case ui::AXEventGenerator::Event::COLLAPSED:
-      if (node->GetRole() == ax::mojom::Role::kRow ||
-          node->GetRole() == ax::mojom::Role::kTreeItem) {
+      if (wrapper->GetRole() == ax::mojom::Role::kRow ||
+          wrapper->GetRole() == ax::mojom::Role::kTreeItem) {
         mac_notification = NSAccessibilityRowCollapsedNotification;
       } else {
         mac_notification = ui::NSAccessibilityExpandedChanged;
@@ -203,8 +206,8 @@
       return;
     }
     case ui::AXEventGenerator::Event::EXPANDED:
-      if (node->GetRole() == ax::mojom::Role::kRow ||
-          node->GetRole() == ax::mojom::Role::kTreeItem) {
+      if (wrapper->GetRole() == ax::mojom::Role::kRow ||
+          wrapper->GetRole() == ax::mojom::Role::kTreeItem) {
         mac_notification = NSAccessibilityRowExpandedNotification;
       } else {
         mac_notification = ui::NSAccessibilityExpandedChanged;
@@ -231,7 +234,7 @@
         // Unfortunately this produces an annoying boing sound with each live
         // announcement, but the alternative is almost no live region support.
         PostAnnouncementNotification(
-            base::SysUTF16ToNSString(node->GetTextContentUTF16()));
+            base::SysUTF16ToNSString(wrapper->GetTextContentUTF16()));
         return;
       }
 
@@ -241,10 +244,11 @@
       GetUIThreadTaskRunner({})->PostDelayedTask(
           FROM_HERE,
           base::BindOnce(
-              [](base::scoped_nsobject<BrowserAccessibilityCocoa> node) {
-                if (node && [node instanceActive]) {
+              [](base::scoped_nsobject<BrowserAccessibilityCocoa> wrapper) {
+                if (wrapper && [wrapper instanceActive]) {
                   NSAccessibilityPostNotification(
-                      node, ui::NSAccessibilityLiveRegionChangedNotification);
+                      wrapper,
+                      ui::NSAccessibilityLiveRegionChangedNotification);
                 }
               },
               std::move(retained_node)),
@@ -275,15 +279,16 @@
       mac_notification = ui::NSAccessibilityMenuItemSelectedNotification;
       break;
     case ui::AXEventGenerator::Event::RANGE_VALUE_CHANGED:
-      DCHECK(node->GetData().IsRangeValueSupported())
-          << "Range value changed but range values are not supported: " << node;
+      DCHECK(wrapper->GetData().IsRangeValueSupported())
+          << "Range value changed but range values are not supported: "
+          << wrapper;
       mac_notification = NSAccessibilityValueChangedNotification;
       break;
     case ui::AXEventGenerator::Event::ROW_COUNT_CHANGED:
       mac_notification = NSAccessibilityRowCountChangedNotification;
       break;
     case ui::AXEventGenerator::Event::SELECTED_CHILDREN_CHANGED:
-      if (ui::IsTableLike(node->GetRole())) {
+      if (ui::IsTableLike(wrapper->GetRole())) {
         mac_notification = NSAccessibilitySelectedRowsChangedNotification;
       } else {
         // VoiceOver does not read anything if selection changes on the
@@ -293,7 +298,7 @@
         BrowserAccessibility* container =
             focus ? focus->PlatformGetSelectionContainer() : nullptr;
 
-        if (focus && node == container &&
+        if (focus && wrapper == container &&
             container->HasState(ax::mojom::State::kMultiselectable) &&
             !IsInGeneratedEventBatch(
                 ui::AXEventGenerator::Event::ACTIVE_DESCENDANT_CHANGED) &&
@@ -314,16 +319,16 @@
       }
       break;
     case ui::AXEventGenerator::Event::SELECTED_VALUE_CHANGED:
-      DCHECK(ui::IsSelectElement(node->GetRole()));
+      DCHECK(ui::IsSelectElement(wrapper->GetRole()));
       mac_notification = NSAccessibilityValueChangedNotification;
       break;
     case ui::AXEventGenerator::Event::VALUE_IN_TEXT_FIELD_CHANGED:
-      DCHECK(node->IsTextField());
+      DCHECK(wrapper->IsTextField());
       mac_notification = NSAccessibilityValueChangedNotification;
       if (!text_edits_.empty()) {
         std::u16string deleted_text;
         std::u16string inserted_text;
-        int32_t node_id = node->GetId();
+        int32_t node_id = wrapper->GetId();
         const auto iterator = text_edits_.find(node_id);
         id edit_text_marker = nil;
         if (iterator != text_edits_.end()) {
@@ -412,7 +417,7 @@
       return;
   }
 
-  FireNativeMacNotification(mac_notification, node);
+  FireNativeMacNotification(mac_notification, wrapper);
 }
 
 void BrowserAccessibilityManagerMac::FireNativeMacNotification(
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.cc b/content/browser/accessibility/browser_accessibility_manager_win.cc
index fd73b8a9..ed36b5b 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_win.cc
@@ -165,44 +165,46 @@
 
 void BrowserAccessibilityManagerWin::FireGeneratedEvent(
     ui::AXEventGenerator::Event event_type,
-    BrowserAccessibility* node) {
+    const ui::AXNode* node) {
   BrowserAccessibilityManager::FireGeneratedEvent(event_type, node);
+  BrowserAccessibility* wrapper = GetFromAXNode(node);
+  DCHECK(wrapper);
   switch (event_type) {
     case ui::AXEventGenerator::Event::ACCESS_KEY_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_AccessKeyPropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_AccessKeyPropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::ACTIVE_DESCENDANT_CHANGED:
-      FireWinAccessibilityEvent(IA2_EVENT_ACTIVE_DESCENDANT_CHANGED, node);
+      FireWinAccessibilityEvent(IA2_EVENT_ACTIVE_DESCENDANT_CHANGED, wrapper);
       break;
     case ui::AXEventGenerator::Event::ALERT:
-      FireWinAccessibilityEvent(EVENT_SYSTEM_ALERT, node);
+      FireWinAccessibilityEvent(EVENT_SYSTEM_ALERT, wrapper);
       // Generated 'ALERT' events come from role=alert nodes in the tree.
       // These should just be treated as normal live region changed events,
       // since we don't want web pages to be performing system-wide alerts.
-      FireUiaAccessibilityEvent(UIA_LiveRegionChangedEventId, node);
+      FireUiaAccessibilityEvent(UIA_LiveRegionChangedEventId, wrapper);
       break;
     case ui::AXEventGenerator::Event::ATOMIC_CHANGED:
-      HandleAriaPropertiesChangedEvent(*node);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::BUSY_CHANGED:
-      HandleAriaPropertiesChangedEvent(*node);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::CHECKED_STATE_CHANGED:
       // https://www.w3.org/TR/core-aam-1.1/#mapping_state-property_table
       // SelectionItem.IsSelected is set according to the True or False value of
       // aria-checked for 'radio' and 'menuitemradio' roles.
-      if (ui::IsRadio(node->GetRole())) {
-        HandleSelectedStateChanged(uia_selection_events_, node,
-                                   IsUIANodeSelected(node));
+      if (ui::IsRadio(wrapper->GetRole())) {
+        HandleSelectedStateChanged(uia_selection_events_, wrapper,
+                                   IsUIANodeSelected(wrapper));
       }
-      FireUiaPropertyChangedEvent(UIA_ToggleToggleStatePropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      FireUiaPropertyChangedEvent(UIA_ToggleToggleStatePropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::CHILDREN_CHANGED: {
       // If this node is ignored, fire the event on the platform parent since
       // ignored nodes cannot raise events.
       BrowserAccessibility* target_node =
-          node->IsIgnored() ? node->PlatformGetParent() : node;
+          wrapper->IsIgnored() ? wrapper->PlatformGetParent() : wrapper;
       if (target_node) {
         FireWinAccessibilityEvent(EVENT_OBJECT_REORDER, target_node);
         FireUiaStructureChangedEvent(StructureChangeType_ChildrenReordered,
@@ -211,22 +213,22 @@
       break;
     }
     case ui::AXEventGenerator::Event::CLASS_NAME_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_ClassNamePropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_ClassNamePropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::COLLAPSED:
     case ui::AXEventGenerator::Event::EXPANDED:
       FireUiaPropertyChangedEvent(
-          UIA_ExpandCollapseExpandCollapseStatePropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+          UIA_ExpandCollapseExpandCollapseStatePropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::CONTROLS_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_ControllerForPropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_ControllerForPropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::DESCRIBED_BY_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_DescribedByPropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_DescribedByPropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::DESCRIPTION_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_FullDescriptionPropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_FullDescriptionPropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::DOCUMENT_SELECTION_CHANGED: {
       // Fire the event on the object where the focus of the selection is. This
@@ -256,13 +258,13 @@
           // Fire the event on the root object, which in the absence of a text
           // field ancestor is the closest UIA text provider (other than the
           // focused object) in which the selection has changed.
-          DCHECK(ui::IsPlatformDocument(node->GetRole()));
-          EnqueueSelectionChangedEvent(*node);
+          DCHECK(ui::IsPlatformDocument(wrapper->GetRole()));
+          EnqueueSelectionChangedEvent(*wrapper);
 
           // "IA2_EVENT_TEXT_CARET_MOVED" should only be fired when a visible
           // caret or a selection is present. In the case of a text field above,
           // this is implicitly true.
-          if (node->HasVisibleCaretOrSelection())
+          if (wrapper->HasVisibleCaretOrSelection())
             FireWinAccessibilityEvent(IA2_EVENT_TEXT_CARET_MOVED, focus_object);
         }
       }
@@ -270,62 +272,62 @@
     }
     // aria-dropeffect is deprecated in WAI-ARIA 1.1.
     case ui::AXEventGenerator::Event::DROPEFFECT_CHANGED:
-      HandleAriaPropertiesChangedEvent(*node);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::EDITABLE_TEXT_CHANGED:
-      EnqueueTextChangedEvent(*node);
+      EnqueueTextChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::ENABLED_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_IsEnabledPropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      FireUiaPropertyChangedEvent(UIA_IsEnabledPropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::FLOW_FROM_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_FlowsFromPropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_FlowsFromPropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::FLOW_TO_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_FlowsToPropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_FlowsToPropertyId, wrapper);
       break;
     // aria-grabbed is deprecated in WAI-ARIA 1.1.
     case ui::AXEventGenerator::Event::GRABBED_CHANGED:
-      HandleAriaPropertiesChangedEvent(*node);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::HASPOPUP_CHANGED:
-      HandleAriaPropertiesChangedEvent(*node);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::HIERARCHICAL_LEVEL_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_LevelPropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      FireUiaPropertyChangedEvent(UIA_LevelPropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::IGNORED_CHANGED:
-      if (node->IsIgnored()) {
-        FireWinAccessibilityEvent(EVENT_OBJECT_HIDE, node);
-        FireUiaStructureChangedEvent(StructureChangeType_ChildRemoved, node);
+      if (wrapper->IsIgnored()) {
+        FireWinAccessibilityEvent(EVENT_OBJECT_HIDE, wrapper);
+        FireUiaStructureChangedEvent(StructureChangeType_ChildRemoved, wrapper);
       }
-      HandleAriaPropertiesChangedEvent(*node);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::IMAGE_ANNOTATION_CHANGED:
-      FireWinAccessibilityEvent(EVENT_OBJECT_NAMECHANGE, node);
+      FireWinAccessibilityEvent(EVENT_OBJECT_NAMECHANGE, wrapper);
       break;
     case ui::AXEventGenerator::Event::INVALID_STATUS_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_IsDataValidForFormPropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      FireUiaPropertyChangedEvent(UIA_IsDataValidForFormPropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::ARIA_CURRENT_CHANGED:
       // TODO(accessibility) No UIA mapping yet exists for aria-current.
       // Request a mapping from API owners and implement.
-      FireWinAccessibilityEvent(IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED, node);
+      FireWinAccessibilityEvent(IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED, wrapper);
       break;
     case ui::AXEventGenerator::Event::KEY_SHORTCUTS_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_AcceleratorKeyPropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_AcceleratorKeyPropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::LABELED_BY_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_LabeledByPropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_LabeledByPropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::LANGUAGE_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_CulturePropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_CulturePropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::LIVE_REGION_CREATED:
-      FireUiaAccessibilityEvent(UIA_LiveRegionChangedEventId, node);
+      FireUiaAccessibilityEvent(UIA_LiveRegionChangedEventId, wrapper);
       break;
     case ui::AXEventGenerator::Event::LIVE_REGION_CHANGED:
       // This event is redundant with the IA2_EVENT_TEXT_INSERTED events;
@@ -339,144 +341,145 @@
       // events. Note: Firefox does not fire this event, but JAWS processes
       // Firefox live region events differently (utilizes MSAA's
       // EVENT_OBJECT_SHOW).
-      FireWinAccessibilityEvent(EVENT_OBJECT_LIVEREGIONCHANGED, node);
-      FireUiaAccessibilityEvent(UIA_LiveRegionChangedEventId, node);
+      FireWinAccessibilityEvent(EVENT_OBJECT_LIVEREGIONCHANGED, wrapper);
+      FireUiaAccessibilityEvent(UIA_LiveRegionChangedEventId, wrapper);
       break;
     case ui::AXEventGenerator::Event::LIVE_RELEVANT_CHANGED:
-      HandleAriaPropertiesChangedEvent(*node);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::LIVE_STATUS_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_LiveSettingPropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      FireUiaPropertyChangedEvent(UIA_LiveSettingPropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::LAYOUT_INVALIDATED:
-      FireUiaAccessibilityEvent(UIA_LayoutInvalidatedEventId, node);
+      FireUiaAccessibilityEvent(UIA_LayoutInvalidatedEventId, wrapper);
       break;
     case ui::AXEventGenerator::Event::MENU_POPUP_END:
-      FireWinAccessibilityEvent(EVENT_SYSTEM_MENUPOPUPEND, node);
-      FireUiaAccessibilityEvent(UIA_MenuClosedEventId, node);
+      FireWinAccessibilityEvent(EVENT_SYSTEM_MENUPOPUPEND, wrapper);
+      FireUiaAccessibilityEvent(UIA_MenuClosedEventId, wrapper);
       break;
     case ui::AXEventGenerator::Event::MENU_POPUP_START:
-      FireWinAccessibilityEvent(EVENT_SYSTEM_MENUPOPUPSTART, node);
-      FireUiaAccessibilityEvent(UIA_MenuOpenedEventId, node);
+      FireWinAccessibilityEvent(EVENT_SYSTEM_MENUPOPUPSTART, wrapper);
+      FireUiaAccessibilityEvent(UIA_MenuOpenedEventId, wrapper);
       break;
     case ui::AXEventGenerator::Event::MULTILINE_STATE_CHANGED:
-      HandleAriaPropertiesChangedEvent(*node);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::MULTISELECTABLE_STATE_CHANGED:
       FireUiaPropertyChangedEvent(UIA_SelectionCanSelectMultiplePropertyId,
-                                  node);
-      HandleAriaPropertiesChangedEvent(*node);
+                                  wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::NAME_CHANGED:
-      if (node->IsText()) {
-        EnqueueTextChangedEvent(*node);
+      if (wrapper->IsText()) {
+        EnqueueTextChangedEvent(*wrapper);
       } else {
-        FireUiaPropertyChangedEvent(UIA_NamePropertyId, node);
+        FireUiaPropertyChangedEvent(UIA_NamePropertyId, wrapper);
       }
       // Only fire name changes when the name comes from an attribute, otherwise
       // name changes are redundant with text removed/inserted events.
-      if (node->GetNameFrom() != ax::mojom::NameFrom::kContents)
-        FireWinAccessibilityEvent(EVENT_OBJECT_NAMECHANGE, node);
+      if (wrapper->GetNameFrom() != ax::mojom::NameFrom::kContents)
+        FireWinAccessibilityEvent(EVENT_OBJECT_NAMECHANGE, wrapper);
       break;
     case ui::AXEventGenerator::Event::OBJECT_ATTRIBUTE_CHANGED:
-      FireWinAccessibilityEvent(IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED, node);
+      FireWinAccessibilityEvent(IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED, wrapper);
       // TODO(crbug.com/1108871): Fire UIA event.
       break;
     case ui::AXEventGenerator::Event::PLACEHOLDER_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_HelpTextPropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_HelpTextPropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::POSITION_IN_SET_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_PositionInSetPropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      FireUiaPropertyChangedEvent(UIA_PositionInSetPropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::RANGE_VALUE_CHANGED:
-      DCHECK(node->GetData().IsRangeValueSupported());
-      FireWinAccessibilityEvent(EVENT_OBJECT_VALUECHANGE, node);
-      FireUiaPropertyChangedEvent(UIA_RangeValueValuePropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      DCHECK(wrapper->GetData().IsRangeValueSupported());
+      FireWinAccessibilityEvent(EVENT_OBJECT_VALUECHANGE, wrapper);
+      FireUiaPropertyChangedEvent(UIA_RangeValueValuePropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::RANGE_VALUE_MAX_CHANGED:
-      DCHECK(node->GetData().IsRangeValueSupported());
-      FireUiaPropertyChangedEvent(UIA_RangeValueMaximumPropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      DCHECK(wrapper->GetData().IsRangeValueSupported());
+      FireUiaPropertyChangedEvent(UIA_RangeValueMaximumPropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::RANGE_VALUE_MIN_CHANGED:
-      DCHECK(node->GetData().IsRangeValueSupported());
-      FireUiaPropertyChangedEvent(UIA_RangeValueMinimumPropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      DCHECK(wrapper->GetData().IsRangeValueSupported());
+      FireUiaPropertyChangedEvent(UIA_RangeValueMinimumPropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::RANGE_VALUE_STEP_CHANGED:
-      DCHECK(node->GetData().IsRangeValueSupported());
-      FireUiaPropertyChangedEvent(UIA_RangeValueSmallChangePropertyId, node);
-      FireUiaPropertyChangedEvent(UIA_RangeValueLargeChangePropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      DCHECK(wrapper->GetData().IsRangeValueSupported());
+      FireUiaPropertyChangedEvent(UIA_RangeValueSmallChangePropertyId, wrapper);
+      FireUiaPropertyChangedEvent(UIA_RangeValueLargeChangePropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::READONLY_CHANGED:
-      if (node->GetData().IsRangeValueSupported())
-        FireUiaPropertyChangedEvent(UIA_RangeValueIsReadOnlyPropertyId, node);
-      else if (ui::IsValuePatternSupported(node))
-        FireUiaPropertyChangedEvent(UIA_ValueIsReadOnlyPropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      if (wrapper->GetData().IsRangeValueSupported())
+        FireUiaPropertyChangedEvent(UIA_RangeValueIsReadOnlyPropertyId,
+                                    wrapper);
+      else if (ui::IsValuePatternSupported(wrapper))
+        FireUiaPropertyChangedEvent(UIA_ValueIsReadOnlyPropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::REQUIRED_STATE_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_IsRequiredForFormPropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      FireUiaPropertyChangedEvent(UIA_IsRequiredForFormPropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::ROLE_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_AriaRolePropertyId, node);
+      FireUiaPropertyChangedEvent(UIA_AriaRolePropertyId, wrapper);
       break;
     case ui::AXEventGenerator::Event::SCROLL_HORIZONTAL_POSITION_CHANGED:
-      FireWinAccessibilityEvent(EVENT_SYSTEM_SCROLLINGEND, node);
+      FireWinAccessibilityEvent(EVENT_SYSTEM_SCROLLINGEND, wrapper);
       FireUiaPropertyChangedEvent(UIA_ScrollHorizontalScrollPercentPropertyId,
-                                  node);
+                                  wrapper);
       break;
     case ui::AXEventGenerator::Event::SCROLL_VERTICAL_POSITION_CHANGED:
-      FireWinAccessibilityEvent(EVENT_SYSTEM_SCROLLINGEND, node);
+      FireWinAccessibilityEvent(EVENT_SYSTEM_SCROLLINGEND, wrapper);
       FireUiaPropertyChangedEvent(UIA_ScrollVerticalScrollPercentPropertyId,
-                                  node);
+                                  wrapper);
       break;
     case ui::AXEventGenerator::Event::SELECTED_CHANGED:
-      HandleSelectedStateChanged(ia2_selection_events_, node,
-                                 IsIA2NodeSelected(node));
-      HandleSelectedStateChanged(uia_selection_events_, node,
-                                 IsUIANodeSelected(node));
-      HandleAriaPropertiesChangedEvent(*node);
+      HandleSelectedStateChanged(ia2_selection_events_, wrapper,
+                                 IsIA2NodeSelected(wrapper));
+      HandleSelectedStateChanged(uia_selection_events_, wrapper,
+                                 IsUIANodeSelected(wrapper));
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::SELECTED_CHILDREN_CHANGED:
-      FireWinAccessibilityEvent(EVENT_OBJECT_SELECTIONWITHIN, node);
+      FireWinAccessibilityEvent(EVENT_OBJECT_SELECTIONWITHIN, wrapper);
       break;
     case ui::AXEventGenerator::Event::SELECTED_VALUE_CHANGED:
-      DCHECK(ui::IsSelectElement(node->GetRole()));
-      FireWinAccessibilityEvent(EVENT_OBJECT_VALUECHANGE, node);
-      FireUiaPropertyChangedEvent(UIA_ValueValuePropertyId, node);
+      DCHECK(ui::IsSelectElement(wrapper->GetRole()));
+      FireWinAccessibilityEvent(EVENT_OBJECT_VALUECHANGE, wrapper);
+      FireUiaPropertyChangedEvent(UIA_ValueValuePropertyId, wrapper);
       // By changing the value of a combo box, the document's text contents will
       // also have changed.
-      EnqueueTextChangedEvent(*node);
+      EnqueueTextChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::SET_SIZE_CHANGED:
-      FireUiaPropertyChangedEvent(UIA_SizeOfSetPropertyId, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      FireUiaPropertyChangedEvent(UIA_SizeOfSetPropertyId, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::SORT_CHANGED:
-      FireWinAccessibilityEvent(IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED, node);
-      HandleAriaPropertiesChangedEvent(*node);
+      FireWinAccessibilityEvent(IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED, wrapper);
+      HandleAriaPropertiesChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::SUBTREE_CREATED:
-      FireWinAccessibilityEvent(EVENT_OBJECT_SHOW, node);
-      FireUiaStructureChangedEvent(StructureChangeType_ChildAdded, node);
+      FireWinAccessibilityEvent(EVENT_OBJECT_SHOW, wrapper);
+      FireUiaStructureChangedEvent(StructureChangeType_ChildAdded, wrapper);
       break;
     case ui::AXEventGenerator::Event::TEXT_ATTRIBUTE_CHANGED:
-      FireWinAccessibilityEvent(IA2_EVENT_TEXT_ATTRIBUTE_CHANGED, node);
+      FireWinAccessibilityEvent(IA2_EVENT_TEXT_ATTRIBUTE_CHANGED, wrapper);
       break;
     case ui::AXEventGenerator::Event::VALUE_IN_TEXT_FIELD_CHANGED:
-      DCHECK(node->IsTextField());
-      FireWinAccessibilityEvent(EVENT_OBJECT_VALUECHANGE, node);
-      FireUiaPropertyChangedEvent(UIA_ValueValuePropertyId, node);
-      EnqueueTextChangedEvent(*node);
+      DCHECK(wrapper->IsTextField());
+      FireWinAccessibilityEvent(EVENT_OBJECT_VALUECHANGE, wrapper);
+      FireUiaPropertyChangedEvent(UIA_ValueValuePropertyId, wrapper);
+      EnqueueTextChangedEvent(*wrapper);
       break;
     case ui::AXEventGenerator::Event::WIN_IACCESSIBLE_STATE_CHANGED:
-      FireWinAccessibilityEvent(EVENT_OBJECT_STATECHANGE, node);
+      FireWinAccessibilityEvent(EVENT_OBJECT_STATECHANGE, wrapper);
       break;
 
     // Currently unused events on this platform.
diff --git a/content/browser/accessibility/browser_accessibility_manager_win.h b/content/browser/accessibility/browser_accessibility_manager_win.h
index 02280a9..ecaba74a 100644
--- a/content/browser/accessibility/browser_accessibility_manager_win.h
+++ b/content/browser/accessibility/browser_accessibility_manager_win.h
@@ -53,7 +53,7 @@
                       BrowserAccessibility* node,
                       int action_request_id) override;
   void FireGeneratedEvent(ui::AXEventGenerator::Event event_type,
-                          BrowserAccessibility* node) override;
+                          const ui::AXNode* node) override;
 
   void FireWinAccessibilityEvent(LONG win_event, BrowserAccessibility* node);
   void FireUiaAccessibilityEvent(LONG uia_event, BrowserAccessibility* node);
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index c51e43b..7bc6cad 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -3282,7 +3282,14 @@
   RunHtmlTest(FILE_PATH_LITERAL("node-changed-crash-in-editable-text.html"));
 }
 
-IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityNoSourceVideo) {
+// TODO(https://crbug.com/1366446): This test is failing on Android.
+#if BUILDFLAG(IS_ANDROID)
+#define MAYBE_AccessibilityNoSourceVideo DISABLED_AccessibilityNoSourceVideo
+#else
+#define MAYBE_AccessibilityNoSourceVideo AccessibilityNoSourceVideo
+#endif  // BUILDFLAG(IS_ANDROID)
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
+                       MAYBE_AccessibilityNoSourceVideo) {
 #if BUILDFLAG(IS_MAC)
   // The /blink test pass is different on macOS than on other platforms. See
   // https://crbug.com/1314896.
diff --git a/content/browser/accessibility/web_contents_accessibility_android.cc b/content/browser/accessibility/web_contents_accessibility_android.cc
index 4304bb9d..90e31b1 100644
--- a/content/browser/accessibility/web_contents_accessibility_android.cc
+++ b/content/browser/accessibility/web_contents_accessibility_android.cc
@@ -323,21 +323,13 @@
   }
 }
 
-bool WebContentsAccessibilityAndroid::ShouldRespectDisplayedPasswordText() {
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
-  if (obj.is_null())
-    return false;
-  return Java_WebContentsAccessibilityImpl_shouldRespectDisplayedPasswordText(
-      env, obj);
-}
-
-bool WebContentsAccessibilityAndroid::ShouldExposePasswordText() {
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
-  if (obj.is_null())
-    return false;
-  return Java_WebContentsAccessibilityImpl_shouldExposePasswordText(env, obj);
+void WebContentsAccessibilityAndroid::SetPasswordRules(
+    JNIEnv* env,
+    jboolean should_respect_displayed_password_text,
+    jboolean should_expose_password_text) {
+  should_respect_displayed_password_text_ =
+      should_respect_displayed_password_text;
+  should_expose_password_text_ = should_expose_password_text;
 }
 
 void WebContentsAccessibilityAndroid::HandleContentChanged(int32_t unique_id) {
@@ -859,8 +851,9 @@
       node->CanOpenPopup(), node->IsMultiLine(), node->AndroidInputType(),
       node->AndroidLiveRegionType(),
       GetCanonicalJNIString(env, node->GetContentInvalidErrorMessage()),
-      node->ClickableScore(),
-      GetCanonicalJNIString(env, node->GetCSSDisplay()));
+      node->ClickableScore(), GetCanonicalJNIString(env, node->GetCSSDisplay()),
+      base::android::ConvertUTF16ToJavaString(env, node->GetBrailleLabel()),
+      GetCanonicalJNIString(env, node->GetBrailleRoleDescription()));
 
   ScopedJavaLocalRef<jintArray> suggestion_starts_java;
   ScopedJavaLocalRef<jintArray> suggestion_ends_java;
diff --git a/content/browser/accessibility/web_contents_accessibility_android.h b/content/browser/accessibility/web_contents_accessibility_android.h
index 5e20cbb..b5da97dd 100644
--- a/content/browser/accessibility/web_contents_accessibility_android.h
+++ b/content/browser/accessibility/web_contents_accessibility_android.h
@@ -96,6 +96,9 @@
 
   void SetAllowImageDescriptions(JNIEnv* env,
                                  jboolean allow_image_descriptions);
+  void SetPasswordRules(JNIEnv* env,
+                        jboolean should_respect_displayed_password_text,
+                        jboolean should_expost_password_text);
 
   // Tree methods.
   jint GetRootId(JNIEnv* env);
@@ -287,11 +290,19 @@
   // Methods called from the BrowserAccessibilityManager
   // --------------------------------------------------------------------------
 
+  // State values that affect tree/node construction, so they must be called
+  // from the BrowserAccessibilityManagerAndroid. The value of these depends on
+  // user settings available in Java-side code, passed here through the JNI.
   bool should_allow_image_descriptions() const {
     return allow_image_descriptions_;
   }
-  bool ShouldRespectDisplayedPasswordText();
-  bool ShouldExposePasswordText();
+  bool should_respect_displayed_password_text() const {
+    return should_respect_displayed_password_text_;
+  }
+  bool should_expose_password_text() const {
+    return should_expose_password_text_;
+  }
+
   void HandlePageLoaded(int32_t unique_id);
   void HandleContentChanged(int32_t unique_id);
   void HandleFocusChanged(int32_t unique_id);
@@ -336,9 +347,17 @@
 
   bool frame_info_initialized_;
 
-  // Whether or not this instance should allow the image descriptions feature
-  // to be enabled, set from the Java-side code.
-  bool allow_image_descriptions_;
+  // True if this instance should allow image descriptions, false if the
+  // feature should be disabled (for example in CCT or WebView). Default false.
+  bool allow_image_descriptions_ = false;
+
+  // True if this instance should respect the displayed password text (available
+  // in the shadow DOM), false if it should return bullets. Default false.
+  bool should_respect_displayed_password_text_ = false;
+
+  // True if this instance should expose password text to AT (e.g. as a user is
+  // typing in a field), false if it should return bullets. Default true.
+  bool should_expose_password_text_ = true;
 
   float page_scale_ = 1.f;
 
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index 57580cc..ee7341b6 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -1576,14 +1576,15 @@
 }
 
 scoped_refptr<network::SharedURLLoaderFactory>
-ServiceWorkerContextWrapper::GetLoaderFactoryForUpdateCheck(const GURL& scope) {
+ServiceWorkerContextWrapper::GetLoaderFactoryForUpdateCheck(
+    const GURL& scope,
+    network::mojom::ClientSecurityStatePtr client_security_state) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   // TODO(https://crbug.com/1211361): Do we want to instrument this with
   // devtools? It is currently not recorded at all.
-  // TODO(https://crbug.com/1239551): pass in proper client security state
   return GetLoaderFactoryForBrowserInitiatedRequest(
       scope,
-      /*version_id=*/absl::nullopt, /*client_security_state=*/nullptr);
+      /*version_id=*/absl::nullopt, std::move(client_security_state));
 }
 
 scoped_refptr<network::SharedURLLoaderFactory>
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h
index 3092b241d7..f6d1a6e2 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.h
+++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -374,7 +374,8 @@
       scoped_refptr<network::SharedURLLoaderFactory> loader_factory);
   // Returns nullptr on failure.
   scoped_refptr<network::SharedURLLoaderFactory> GetLoaderFactoryForUpdateCheck(
-      const GURL& scope);
+      const GURL& scope,
+      network::mojom::ClientSecurityStatePtr client_security_state);
 
   // Returns nullptr on failure.
   // Note: This is currently only used for plzServiceWorker.
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc
index bf5eb9eb..8909f1a2 100644
--- a/content/browser/service_worker/service_worker_register_job.cc
+++ b/content/browser/service_worker/service_worker_register_job.cc
@@ -103,6 +103,16 @@
   DCHECK(context_);
   DCHECK(outside_fetch_client_settings_object_);
   internal_.registration = registration;
+
+  ServiceWorkerVersion* version = registration->GetNewestVersion();
+  if (version) {
+    scoped_refptr<PolicyContainerHost> policy_container_host =
+        version->policy_container_host();
+    if (policy_container_host) {
+      creator_policy_container_policies_ =
+          mojo::Clone(policy_container_host->policies());
+    }
+  }
 }
 
 ServiceWorkerRegisterJob::~ServiceWorkerRegisterJob() {
@@ -554,7 +564,14 @@
   SetPhase(UPDATE);
 
   scoped_refptr<network::SharedURLLoaderFactory> loader_factory =
-      context_->wrapper()->GetLoaderFactoryForUpdateCheck(scope_);
+      context_->wrapper()->GetLoaderFactoryForUpdateCheck(
+          scope_,
+          network::mojom::ClientSecurityState::New(
+              creator_policy_container_policies_.cross_origin_embedder_policy,
+              creator_policy_container_policies_.is_web_secure_context,
+              creator_policy_container_policies_.ip_address_space,
+              DerivePrivateNetworkRequestPolicy(
+                  creator_policy_container_policies_)));
   if (!loader_factory) {
     // We can't continue with update checking appropriately without
     // |loader_factory|. Null |loader_factory| means that the storage partition
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index c1e8a58f..6827eb9 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -238,6 +238,7 @@
     "java/src/org/chromium/content/browser/WindowEventObserver.java",
     "java/src/org/chromium/content/browser/WindowEventObserverManager.java",
     "java/src/org/chromium/content/browser/accessibility/AccessibilityActionAndEventTracker.java",
+    "java/src/org/chromium/content/browser/accessibility/AccessibilityAutofillHelper.java",
     "java/src/org/chromium/content/browser/accessibility/AccessibilityDelegate.java",
     "java/src/org/chromium/content/browser/accessibility/AccessibilityEventDispatcher.java",
     "java/src/org/chromium/content/browser/accessibility/AccessibilityHistogramRecorder.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityAutofillHelper.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityAutofillHelper.java
new file mode 100644
index 0000000..a380ba7
--- /dev/null
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityAutofillHelper.java
@@ -0,0 +1,63 @@
+// Copyright 2022 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.content.browser.accessibility;
+
+import android.os.Build;
+
+/**
+ * Helper class for Autofill state and password preferences for accessibility related code.
+ */
+public class AccessibilityAutofillHelper {
+    public static boolean shouldRespectDisplayedPasswordText() {
+        // Previous to O, shouldExposePasswordText() should be used to check a system setting
+        // that determines whether we should return the unobscured password or all dots,
+        // independent of what was displayed visually. Always return false here before Android O.
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return false;
+
+        // On Android O and higher, we should respect whatever is displayed in a password box and
+        // report that via accessibility APIs, whether that's the unobscured password, or all dots.
+        // However, we deviate from this rule if the only consumer of accessibility information is
+        // Autofill in order to allow third-party Autofill services to save the real, unmasked
+        // password.
+        return isAutofillOnlyPossibleAccessibilityConsumer();
+    }
+
+    public static boolean shouldExposePasswordText() {
+        // On Android P and higher, when no other accessibility services are running other than
+        // Autofill, we should always expose the actual password text so that third-party Autofill
+        // services can save it rather than obtain only the masking characters.
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P
+                && isAutofillOnlyPossibleAccessibilityConsumer()) {
+            return true;
+        }
+
+        // When additional services are running besides Autofill, we fall back to checking the
+        // user's system preference. The preference to check varies by OS version.
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+            return BrowserAccessibilityState.hasEnabledTextShowPassword();
+        }
+
+        return BrowserAccessibilityState.hasEnabledAccessibilitySpeakPassword();
+    }
+
+    public static boolean isAutofillOnlyPossibleAccessibilityConsumer() {
+        // The Android Autofill CompatibilityBridge, which is responsible for translating
+        // Accessibility information to Autofill events, directly hooks into the
+        // AccessibilityManager via an AccessibilityPolicy rather than by running an
+        // AccessibilityService. We can thus check whether it is the only consumer of Accessibility
+        // information by reading the names of active accessibility services from settings.
+        //
+        // Note that the CompatibilityBridge makes getEnabledAccessibilityServicesList return a mock
+        // service to indicate its presence. It is thus easier to read the setting directly than
+        // to filter out this service from the returned list. Furthermore, since Accessibility is
+        // only initialized if there is at least one actual service or if Autofill is enabled,
+        // there is no need to check that Autofill is enabled here.
+        //
+        // https://cs.android.com/android/platform/superproject/+/HEAD:frameworks/base/core/java/android/view/autofill/AutofillManager.java;l=2817;drc=dd7d52f9632a0dbb8b14b69520c5ea31e0b3b4a2
+
+        // Use the BrowserAccessibilityState to verify if >= 1 service(s) is/are running.
+        return !BrowserAccessibilityState.hasAnyAccessibilityServiceEnabled();
+    }
+}
\ No newline at end of file
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityState.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityState.java
index 89bb09d..c992086 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityState.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityState.java
@@ -62,10 +62,29 @@
     private static int sFlagsMask;
     private static int sCapabilitiesMask;
 
+    // Simple boolean that will be true when any accessibility service is running on the device.
+    private static boolean sHasAnyAccessibilityServiceEnabled;
+
     // Whether we determine that genuine assistive technology such as a screen reader
     // is running, based on the information from running accessibility services.
     private static boolean sScreenReader;
 
+    // Whether the user has enabled the Android-OS privacy setting for showing passwords, found in:
+    // Settings > Privacy > Show passwords. (Settings.System.TEXT_SHOW_PASSWORD).
+    private static boolean sTextShowPasswordEnabled;
+
+    /**
+     * Whether the user has enabled the Android-OS speak password when in accessibility mode,
+     * available on pre-Android O. (Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD).
+     *
+     * From Android docs:
+     * @deprecated The speaking of passwords is controlled by individual accessibility services.
+     * Apps should ignore this setting and provide complete information to accessibility
+     * at all times, which was the behavior when this value was {@code true}.
+     */
+    @Deprecated
+    private static boolean sAccessibilitySpeakPasswordEnabled;
+
     // The IDs of all running accessibility services.
     private static String[] sServiceIds;
 
@@ -88,12 +107,30 @@
         sListeners.add(listener);
     }
 
+    public static boolean hasAnyAccessibilityServiceEnabled() {
+        if (!sInitialized) updateAccessibilityServices();
+
+        return sHasAnyAccessibilityServiceEnabled;
+    }
+
     public static boolean screenReaderMode() {
         if (!sInitialized) updateAccessibilityServices();
 
         return sScreenReader;
     }
 
+    public static boolean hasEnabledTextShowPassword() {
+        if (!sInitialized) updateAccessibilityServices();
+
+        return sTextShowPasswordEnabled;
+    }
+
+    public static boolean hasEnabledAccessibilitySpeakPassword() {
+        if (!sInitialized) updateAccessibilityServices();
+
+        return sAccessibilitySpeakPasswordEnabled;
+    }
+
     private static class AnimatorDurationScaleObserver extends ContentObserver {
         public AnimatorDurationScaleObserver(Handler handler) {
             super(handler);
@@ -188,6 +225,7 @@
         sFeedbackTypeMask = 0;
         sFlagsMask = 0;
         sCapabilitiesMask = 0;
+        sHasAnyAccessibilityServiceEnabled = false;
 
         // Get the list of currently running accessibility services.
         Context context = ContextUtils.getApplicationContext();
@@ -205,6 +243,7 @@
             sFeedbackTypeMask |= service.feedbackType;
             sFlagsMask |= service.flags;
             sCapabilitiesMask |= service.getCapabilities();
+            sHasAnyAccessibilityServiceEnabled = true;
 
             String serviceId = service.getId();
             sServiceIds[i++] = serviceId;
@@ -218,6 +257,15 @@
             }
         }
 
+        // Update the user password show/speak preferences.
+        int textShowPasswordSetting = Settings.System.getInt(
+                context.getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD, 1);
+        sTextShowPasswordEnabled = textShowPasswordSetting == 1;
+
+        int accessibilitySpeakPasswordSetting = Settings.Secure.getInt(
+                context.getContentResolver(), Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0);
+        sAccessibilitySpeakPasswordEnabled = accessibilitySpeakPasswordSetting == 1;
+
         // Get the list of enabled accessibility services, from settings, in
         // case it's different.
         ArrayList<String> enabledServiceNames = new ArrayList<String>();
@@ -328,12 +376,25 @@
     @CalledByNative
     static void registerObservers() {
         ContentResolver contentResolver = ContextUtils.getApplicationContext().getContentResolver();
+
+        // We want to be notified whenever the user has updated the animator duration scale.
         contentResolver.registerContentObserver(
                 Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE), false,
                 new AnimatorDurationScaleObserver(getHandler()));
+
+        // We want to be notified whenever the currently enabled services changes.
         contentResolver.registerContentObserver(
                 Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES), false,
                 new AccessibilityServicesObserver(getHandler()));
+
+        // We want to be notified if the user changes their preferred password show/speak settings.
+        contentResolver.registerContentObserver(
+                Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD), false,
+                new AccessibilityServicesObserver(getHandler()));
+        contentResolver.registerContentObserver(
+                Settings.System.getUriFor(Settings.System.TEXT_SHOW_PASSWORD), false,
+                new AccessibilityServicesObserver(getHandler()));
+
         if (!sInitialized) updateAccessibilityServices();
     }
 
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
index 0d9b40e..9459cc4 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -48,7 +48,6 @@
 
 import android.annotation.SuppressLint;
 import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
@@ -57,7 +56,6 @@
 import android.graphics.RectF;
 import android.os.Build;
 import android.os.Bundle;
-import android.provider.Settings;
 import android.text.SpannableString;
 import android.text.style.LocaleSpan;
 import android.text.style.SuggestionSpan;
@@ -136,6 +134,9 @@
     public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 0x00000010;
 
     // Constants defined for AccessibilityNodeInfo Bundle extras keys.
+    public static final String EXTRAS_KEY_BRAILLE_LABEL = "AccessibilityNodeInfo.brailleLabel";
+    public static final String EXTRAS_KEY_BRAILLE_ROLE_DESCRIPTION =
+            "AccessibilityNodeInfo.brailleRoleDescription";
     public static final String EXTRAS_KEY_CHROME_ROLE = "AccessibilityNodeInfo.chromeRole";
     public static final String EXTRAS_KEY_CLICKABLE_SCORE = "AccessibilityNodeInfo.clickableScore";
     public static final String EXTRAS_KEY_CSS_DISPLAY = "AccessibilityNodeInfo.cssDisplay";
@@ -754,6 +755,11 @@
         WebContentsAccessibilityImplJni.get().setAXMode(mNativeObj, newScreenReaderEnabledState,
                 /* isAccessibilityEnabled= */ true);
 
+        // Update the state of how passwords are exposed based on user settings.
+        WebContentsAccessibilityImplJni.get().setPasswordRules(mNativeObj,
+                AccessibilityAutofillHelper.shouldRespectDisplayedPasswordText(),
+                AccessibilityAutofillHelper.shouldExposePasswordText());
+
         // Update the list of events we dispatch to enabled services.
         if (ContentFeatureList.isEnabled(ContentFeatureList.ON_DEMAND_ACCESSIBILITY_EVENTS)) {
             int serviceEventMask = BrowserAccessibilityState.getAccessibilityServiceEventTypeMask();
@@ -1784,10 +1790,17 @@
     private void setAccessibilityNodeInfoBaseAttributes(AccessibilityNodeInfoCompat node,
             int virtualViewId, int parentId, String className, String role, String roleDescription,
             String hint, String targetUrl, boolean canOpenPopup, boolean multiLine, int inputType,
-            int liveRegion, String errorMessage, int clickableScore, String display) {
+            int liveRegion, String errorMessage, int clickableScore, String display,
+            String brailleLabel, String brailleRoleDescription) {
         node.setClassName(className);
 
         Bundle bundle = node.getExtras();
+        if (!brailleLabel.isEmpty()) {
+            bundle.putCharSequence(EXTRAS_KEY_BRAILLE_LABEL, brailleLabel);
+        }
+        if (!brailleRoleDescription.isEmpty()) {
+            bundle.putCharSequence(EXTRAS_KEY_BRAILLE_ROLE_DESCRIPTION, brailleRoleDescription);
+        }
         bundle.putCharSequence(EXTRAS_KEY_CHROME_ROLE, role);
         bundle.putCharSequence(EXTRAS_KEY_ROLE_DESCRIPTION, roleDescription);
         bundle.putCharSequence(EXTRAS_KEY_HINT, hint);
@@ -2163,74 +2176,6 @@
         }
     }
 
-    boolean isCompatAutofillOnlyPossibleAccessibilityConsumer() {
-        // Compatibility Autofill is only available on Android P+.
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
-            return false;
-        }
-        // The Android Autofill CompatibilityBridge, which is responsible for translating
-        // Accessibility information to Autofill events, directly hooks into the
-        // AccessibilityManager via an AccessibilityPolicy rather than by running an
-        // AccessibilityService. We can thus check whether it is the only consumer of Accessibility
-        // information by reading the names of active accessibility services from settings.
-        //
-        // Note that the CompatibilityBridge makes getEnabledAccessibilityServicesList return a mock
-        // service to indicate its presence. It is thus easier to read the setting directly than
-        // to filter out this service from the returned list. Furthermore, since Accessibility is
-        // only initialized if there is at least one actual service or if Autofill is enabled,
-        // there is no need to check that Autofill is enabled here.
-        //
-        // https://cs.android.com/android/platform/superproject/+/HEAD:frameworks/base/core/java/android/view/autofill/AutofillManager.java;l=2817;drc=dd7d52f9632a0dbb8b14b69520c5ea31e0b3b4a2
-        String activeServices = Settings.Secure.getString(
-                mContext.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
-        if (activeServices != null && !activeServices.isEmpty()) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * On Android O and higher, we should respect whatever is displayed in a password box and
-     * report that via accessibility APIs, whether that's the unobscured password, or all dots.
-     * However, we deviate from this rule if the only consumer of accessibility information is
-     * Autofill in order to allow third-party Autofill services to save the real, unmasked password.
-     *
-     * Previous to O, shouldExposePasswordText() returns a system setting
-     * that determines whether we should return the unobscured password or all
-     * dots, independent of what was displayed visually.
-     */
-    @CalledByNative
-    boolean shouldRespectDisplayedPasswordText() {
-        if (isCompatAutofillOnlyPossibleAccessibilityConsumer()) {
-            return false;
-        }
-        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
-    }
-
-    /**
-     * Only relevant prior to Android O, see shouldRespectDisplayedPasswordText, unless the only
-     * Accessibility consumer is compatibility Autofill.
-     */
-    @CalledByNative
-    boolean shouldExposePasswordText() {
-        // Should always expose the actual password text to Autofill so that third-party Autofill
-        // services can save it rather than obtain only the masking characters.
-        if (isCompatAutofillOnlyPossibleAccessibilityConsumer()) {
-            return true;
-        }
-
-        ContentResolver contentResolver = mContext.getContentResolver();
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
-            return (Settings.System.getInt(contentResolver, Settings.System.TEXT_SHOW_PASSWORD, 1)
-                    == 1);
-        }
-
-        return (Settings.Secure.getInt(
-                        contentResolver, Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD, 0)
-                == 1);
-    }
-
     @NativeMethods
     interface Natives {
         long init(WebContentsAccessibilityImpl caller, WebContents webContents);
@@ -2280,6 +2225,8 @@
         void enable(long nativeWebContentsAccessibilityAndroid, boolean screenReaderMode);
         void setAXMode(long nativeWebContentsAccessibilityAndroid, boolean screenReaderMode,
                 boolean isAccessibilityEnabled);
+        void setPasswordRules(long nativeWebContentsAccessibilityAndroid,
+                boolean shouldRespectDisplayedPasswordText, boolean shouldExposePasswordText);
         boolean areInlineTextBoxesLoaded(long nativeWebContentsAccessibilityAndroid, int id);
         void loadInlineTextBoxes(long nativeWebContentsAccessibilityAndroid, int id);
         int[] getCharacterBoundingBoxes(
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java
index 42e43f6..7da5f3a 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java
@@ -246,6 +246,17 @@
 
     @Test
     @SmallTest
+    public void test_ariaBrailleLabel() {
+        performAriaTest("aria-braillelabel.html");
+    }
+    @Test
+    @SmallTest
+    public void test_ariaBrailleRoleDescription() {
+        performAriaTest("aria-brailleroledescription.html");
+    }
+
+    @Test
+    @SmallTest
     public void test_ariaBusy() {
         performAriaTest("aria-busy.html");
     }
diff --git a/content/test/data/accessibility/aria/aria-braillelabel-expected-android-external.txt b/content/test/data/accessibility/aria/aria-braillelabel-expected-android-external.txt
new file mode 100644
index 0000000..d4a7bc5
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-braillelabel-expected-android-external.txt
@@ -0,0 +1,2 @@
+WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
+++CheckBox checkable clickable actions:[CLICK, AX_FOCUS] bundle:[brailleLabel="aria braille label", chromeRole="checkBox", roleDescription="checkbox"]
\ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-braillelabel-expected-android.txt b/content/test/data/accessibility/aria/aria-braillelabel-expected-android.txt
new file mode 100644
index 0000000..8bbf768
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-braillelabel-expected-android.txt
@@ -0,0 +1,2 @@
+android.webkit.WebView focusable focused scrollable
+++android.widget.CheckBox role_description='checkbox' checkable clickable
\ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-brailleroledescription-expected-android-external.txt b/content/test/data/accessibility/aria/aria-brailleroledescription-expected-android-external.txt
new file mode 100644
index 0000000..94d9fd9
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-brailleroledescription-expected-android-external.txt
@@ -0,0 +1,4 @@
+WebView focusable focused scrollable actions:[CLEAR_FOCUS, AX_FOCUS] bundle:[chromeRole="rootWebArea"]
+++CheckBox checkable clickable actions:[CLICK, AX_FOCUS] bundle:[brailleRoleDescription="aria braille role description", chromeRole="checkBox", roleDescription="checkbox"]
+++CheckBox checkable clickable actions:[CLICK, AX_FOCUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
+++CheckBox checkable clickable actions:[CLICK, AX_FOCUS] bundle:[chromeRole="checkBox", roleDescription="checkbox"]
\ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-brailleroledescription-expected-android.txt b/content/test/data/accessibility/aria/aria-brailleroledescription-expected-android.txt
new file mode 100644
index 0000000..0cd7aae
--- /dev/null
+++ b/content/test/data/accessibility/aria/aria-brailleroledescription-expected-android.txt
@@ -0,0 +1,4 @@
+android.webkit.WebView focusable focused scrollable
+++android.widget.CheckBox role_description='checkbox' checkable clickable
+++android.widget.CheckBox role_description='checkbox' checkable clickable
+++android.widget.CheckBox role_description='checkbox' checkable clickable
\ No newline at end of file
diff --git a/device/fido/mac/credential_store.h b/device/fido/mac/credential_store.h
index 71e4f96..a225889 100644
--- a/device/fido/mac/credential_store.h
+++ b/device/fido/mac/credential_store.h
@@ -139,6 +139,9 @@
 
   bool DeleteCredentialById(base::span<const uint8_t> credential_id) const;
 
+  bool UpdateCredential(base::span<uint8_t> credential_id,
+                        const std::string& username);
+
   size_t CountCredentialsSync(base::Time created_not_before,
                               base::Time created_not_after);
 
diff --git a/device/fido/mac/credential_store.mm b/device/fido/mac/credential_store.mm
index 7070b24..e33ce4f 100644
--- a/device/fido/mac/credential_store.mm
+++ b/device/fido/mac/credential_store.mm
@@ -18,6 +18,7 @@
 #include "base/strings/sys_string_conversions.h"
 #include "components/device_event_log/device_event_log.h"
 #include "crypto/random.h"
+#include "device/fido/fido_parsing_utils.h"
 #include "device/fido/mac/credential_metadata.h"
 #include "device/fido/mac/keychain.h"
 #include "device/fido/mac/touch_id_context.h"
@@ -626,4 +627,54 @@
   return true;
 }
 
+bool TouchIdCredentialStore::UpdateCredential(
+    base::span<uint8_t> credential_id_span,
+    const std::string& username) {
+  std::vector<uint8_t> credential_id =
+      fido_parsing_utils::Materialize(credential_id_span);
+
+  absl::optional<std::list<Credential>> credentials = FindCredentialsImpl(
+      /*rp_id=*/absl::nullopt, {credential_id});
+  if (!credentials) {
+    FIDO_LOG(ERROR) << "no credentials found";
+    return false;
+  }
+  base::ScopedCFTypeRef<CFMutableDictionaryRef> params(
+      CFDictionaryCreateMutable(kCFAllocatorDefault, 0,
+                                &kCFTypeDictionaryKeyCallBacks,
+                                &kCFTypeDictionaryValueCallBacks));
+  bool found_credential = false;
+  for (Credential& credential : *credentials) {
+    if (credential.credential_id == credential_id) {
+      credential.metadata.user_name = username;
+      std::vector<uint8_t> sealed_metadata = SealCredentialMetadata(
+          config_.metadata_secret, credential.rp_id, credential.metadata);
+      CFDictionarySetValue(params, kSecAttrApplicationTag,
+                           [NSData dataWithBytes:sealed_metadata.data()
+                                          length:sealed_metadata.size()]);
+      found_credential = true;
+      break;
+    }
+  }
+  if (!found_credential) {
+    FIDO_LOG(ERROR) << "no credential with matching credential_id";
+    return false;
+  }
+  base::ScopedCFTypeRef<CFMutableDictionaryRef> query(CFDictionaryCreateMutable(
+      kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks,
+      &kCFTypeDictionaryValueCallBacks));
+  CFDictionarySetValue(query, kSecAttrAccessGroup,
+                       base::SysUTF8ToNSString(config_.keychain_access_group));
+  CFDictionarySetValue(query, kSecClass, kSecClassKey);
+  CFDictionarySetValue(query, kSecAttrApplicationLabel,
+                       [NSData dataWithBytes:credential_id.data()
+                                      length:credential_id.size()]);
+  OSStatus status = Keychain::GetInstance().ItemUpdate(query, params);
+  if (status != errSecSuccess) {
+    OSSTATUS_DLOG(ERROR, status) << "SecItemEdit failed";
+    return false;
+  }
+  return true;
+}
+
 }  // namespace device::fido::mac
diff --git a/device/fido/mac/fake_keychain.h b/device/fido/mac/fake_keychain.h
index 8fb21a95..fc60e2f 100644
--- a/device/fido/mac/fake_keychain.h
+++ b/device/fido/mac/fake_keychain.h
@@ -35,6 +35,9 @@
       CFErrorRef* error) override;
   OSStatus ItemCopyMatching(CFDictionaryRef query, CFTypeRef* result) override;
   OSStatus ItemDelete(CFDictionaryRef query) override;
+  OSStatus ItemUpdate(
+      CFDictionaryRef query,
+      base::ScopedCFTypeRef<CFMutableDictionaryRef> keychain_data) override;
 
  private:
   // items_ contains the keychain items created by `KeyCreateRandomKey`.
diff --git a/device/fido/mac/fake_keychain.mm b/device/fido/mac/fake_keychain.mm
index cf0e12b..abb125f5 100644
--- a/device/fido/mac/fake_keychain.mm
+++ b/device/fido/mac/fake_keychain.mm
@@ -174,6 +174,43 @@
   return errSecItemNotFound;
 }
 
+OSStatus FakeKeychain::ItemUpdate(
+    CFDictionaryRef query,
+    base::ScopedCFTypeRef<CFMutableDictionaryRef> attributes_to_update) {
+  DCHECK_EQ(base::mac::GetValueFromDictionary<CFStringRef>(query, kSecClass),
+            kSecClassKey);
+  DCHECK(CFEqual(base::mac::GetValueFromDictionary<CFStringRef>(
+                     query, kSecAttrAccessGroup),
+                 keychain_access_group_));
+  CFDataRef query_credential_id = base::mac::GetValueFromDictionary<CFDataRef>(
+      query, kSecAttrApplicationLabel);
+  DCHECK(query_credential_id);
+  for (auto it = items_.begin(); it != items_.end(); ++it) {
+    const base::ScopedCFTypeRef<CFDictionaryRef>& item = *it;
+    CFDataRef item_credential_id = base::mac::GetValueFromDictionary<CFDataRef>(
+        item, kSecAttrApplicationLabel);
+    DCHECK(item_credential_id);
+    if (!CFEqual(query_credential_id, item_credential_id)) {
+      continue;
+    }
+    base::ScopedCFTypeRef<CFMutableDictionaryRef> item_copy(
+        CFDictionaryCreateMutableCopy(kCFAllocatorDefault, /*capacity=*/0,
+                                      item));
+    size_t size = CFDictionaryGetCount(attributes_to_update.get());
+    std::vector<CFStringRef> keys(size, nullptr);
+    std::vector<CFDictionaryRef> values(size, nullptr);
+    CFDictionaryGetKeysAndValues(attributes_to_update.get(),
+                                 reinterpret_cast<const void**>(keys.data()),
+                                 reinterpret_cast<const void**>(values.data()));
+    for (size_t i = 0; i < size; ++i) {
+      CFDictionarySetValue(item_copy, keys[i], values[i]);
+    }
+    *it = base::ScopedCFTypeRef<CFDictionaryRef>(item_copy.release());
+    return errSecSuccess;
+  }
+  return errSecItemNotFound;
+}
+
 ScopedFakeKeychain::ScopedFakeKeychain(const std::string& keychain_access_group)
     : FakeKeychain(keychain_access_group) {
   SetInstanceOverride(this);
diff --git a/device/fido/mac/keychain.h b/device/fido/mac/keychain.h
index e1cc193..951a5ece 100644
--- a/device/fido/mac/keychain.h
+++ b/device/fido/mac/keychain.h
@@ -49,6 +49,10 @@
   virtual OSStatus ItemCopyMatching(CFDictionaryRef query, CFTypeRef* result);
   // ItemDelete wraps the |SecItemDelete| function.
   virtual OSStatus ItemDelete(CFDictionaryRef query);
+  // ItemDelete wraps the |SecItemUpdate| function.
+  virtual OSStatus ItemUpdate(
+      CFDictionaryRef query,
+      base::ScopedCFTypeRef<CFMutableDictionaryRef> keychain_data);
 
  protected:
   Keychain();
diff --git a/device/fido/mac/keychain.mm b/device/fido/mac/keychain.mm
index e026897..5d1cb805 100644
--- a/device/fido/mac/keychain.mm
+++ b/device/fido/mac/keychain.mm
@@ -67,6 +67,12 @@
   return SecItemDelete(query);
 }
 
+OSStatus Keychain::ItemUpdate(
+    CFDictionaryRef query,
+    base::ScopedCFTypeRef<CFMutableDictionaryRef> keychain_data) {
+  return SecItemUpdate(query, keychain_data);
+}
+
 }  // namespace mac
 }  // namespace fido
 }  // namespace device
diff --git a/docs/infra/new_builder.md b/docs/infra/new_builder.md
index 665a99b..9a191441 100644
--- a/docs/infra/new_builder.md
+++ b/docs/infra/new_builder.md
@@ -101,7 +101,7 @@
 (e.g. mac hardware, attached mobile devices, a specific GPU, etc.). Note that
 even if there's hardware currently available for the new builder, a resource
 request will still be needed if the footprint of the new builder equates to
-at least 10 VMs or 100 CPU cores.
+at least 5 VMs or 50 CPU cores.
 
 See [infradata docs][4] (internal) for information on how to register
 the hardware to be used by your builder.
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index 79b3906..f8cd9d4 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -84,6 +84,34 @@
   }
 }
 
+// Helper class to make a scoped variable that creates an error scope to ignore
+// validation errors on a device.
+class IgnoreValidationErrorsScope {
+ public:
+  explicit IgnoreValidationErrorsScope(const DawnProcTable& procs,
+                                       WGPUDevice device)
+      : procs_(procs), device_(device) {
+    procs_.devicePushErrorScope(device_, WGPUErrorFilter_Validation);
+    procs_.deviceReference(device_);
+  }
+  ~IgnoreValidationErrorsScope() {
+    procs_.devicePopErrorScope(
+        device_, [](WGPUErrorType, const char*, void*) {}, nullptr);
+    procs_.deviceRelease(device_);
+  }
+
+  IgnoreValidationErrorsScope(const IgnoreValidationErrorsScope&) = delete;
+  IgnoreValidationErrorsScope(IgnoreValidationErrorsScope&&) = delete;
+  IgnoreValidationErrorsScope& operator=(const IgnoreValidationErrorsScope&) =
+      delete;
+  IgnoreValidationErrorsScope& operator=(IgnoreValidationErrorsScope&&) =
+      delete;
+
+ private:
+  const DawnProcTable& procs_;
+  WGPUDevice device_;
+};
+
 }  // namespace
 
 class WebGPUDecoderImpl final : public WebGPUDecoder {
@@ -466,6 +494,8 @@
       }
 
       const bool is_initialized = representation->IsCleared();
+      auto ignore_validation_errors =
+          IgnoreValidationErrorsScope(procs, device);
       auto result =
           base::WrapUnique(new SharedImageRepresentationAndAccessSkiaFallback(
               std::move(shared_context_state), std::move(representation), procs,
@@ -477,6 +507,8 @@
     }
 
     ~SharedImageRepresentationAndAccessSkiaFallback() override {
+      auto ignore_validation_errors =
+          IgnoreValidationErrorsScope(procs_, device_);
       // If we have write access, flush any writes by uploading
       // into the SkSurface.
       if ((usage_ & kAllowedWritableMailboxTextureUsages) != 0) {
@@ -1705,6 +1737,7 @@
     // will be needed to make the texture black in the destroyed case.
     // TODO(crbug.com/1242712): Use the C++ WebGPU API.
     const auto& procs = dawn::native::GetProcs();
+    auto ignore_validation_errors = IgnoreValidationErrorsScope(procs, device);
     WGPUTextureView view = procs.textureCreateView(texture, nullptr);
 
     WGPURenderPassColorAttachment color_attachment = {};
diff --git a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
index 3723330..a4ba191 100644
--- a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
+++ b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
@@ -141,8 +141,10 @@
 #endif
 
     WebGPUTest::SetUp();
-    Initialize(GetParam());
-
+    if (!Initialize(GetParam())) {
+      GTEST_SKIP() << "Test failed to initialize.";
+    }
+    initialized_ = true;
     device_ = GetNewDevice();
 
     mock_buffer_map_callback =
@@ -240,6 +242,7 @@
     queue.Submit(1, &commands);
   }
 
+  bool initialized_ = false;
 #if BUILDFLAG(IS_MAC)
   bool mac_m1_ = false;
 #endif
@@ -247,8 +250,7 @@
 };
 
 TEST_P(WebGPUMailboxTest, AssociateMailboxCmd) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
@@ -368,8 +370,7 @@
 }
 
 TEST_P(WebGPUMailboxTest, DissociateMailboxCmd) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
@@ -435,16 +436,18 @@
 
 // Test that Associate and Dissociate mailbox may be used after the device is
 // destroyed. The test should not crash or produce unexpected validation errors.
-TEST_P(WebGPUMailboxTest,
-       DISABLED_AssociateDissociateMailboxAfterDeviceDestroy) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+TEST_P(WebGPUMailboxTest, AssociateDissociateMailboxAfterDeviceDestroy) {
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
     LOG(ERROR) << "Test skipped because WebGPUSharedImage isn't supported";
     return;
   }
+  if (!GPUTestBotConfig::CurrentConfigMatches("Mac")) {
+    LOG(ERROR) << "Test skipped due to crbug.com/1359106.";
+    return;
+  }
 
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox = sii->CreateSharedImage(
@@ -469,7 +472,7 @@
 
 // Test that ReserveTexture may be used after the device is destroyed.
 // The test should not crash or produce unexpected validation errors.
-TEST_P(WebGPUMailboxTest, DISABLED_ReserveTextureAfterDeviceDestroy) {
+TEST_P(WebGPUMailboxTest, ReserveTextureAfterDeviceDestroy) {
   if (!WebGPUSupported()) {
     LOG(ERROR) << "Test skipped because WebGPU isn't supported";
     return;
@@ -478,6 +481,10 @@
     LOG(ERROR) << "Test skipped because WebGPUSharedImage isn't supported";
     return;
   }
+  if (!GPUTestBotConfig::CurrentConfigMatches("Mac")) {
+    LOG(ERROR) << "Test skipped due to crbug.com/1359106.";
+    return;
+  }
 
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox = sii->CreateSharedImage(
@@ -502,15 +509,18 @@
 
 // Test that DissociateMailbox may be used after the device is destroyed.
 // The test should not crash or produce unexpected validation errors.
-TEST_P(WebGPUMailboxTest, DISABLED_DissociateMailboxAfterDeviceDestroy) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+TEST_P(WebGPUMailboxTest, DissociateMailboxAfterDeviceDestroy) {
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
     LOG(ERROR) << "Test skipped because WebGPUSharedImage isn't supported";
     return;
   }
+  if (!GPUTestBotConfig::CurrentConfigMatches("Mac")) {
+    LOG(ERROR) << "Test skipped due to crbug.com/1359106.";
+    return;
+  }
 
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox = sii->CreateSharedImage(
@@ -536,16 +546,18 @@
 // Test that DissociateMailboxForPresentAfterDeviceDestroy may be used after the
 // device is destroyed. The test should not crash or produce unexpected
 // validation errors.
-TEST_P(WebGPUMailboxTest,
-       DISABLED_DissociateMailboxForPresentAfterDeviceDestroy) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+TEST_P(WebGPUMailboxTest, DissociateMailboxForPresentAfterDeviceDestroy) {
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
     LOG(ERROR) << "Test skipped because WebGPUSharedImage isn't supported";
     return;
   }
+  if (!GPUTestBotConfig::CurrentConfigMatches("Mac")) {
+    LOG(ERROR) << "Test skipped due to crbug.com/1359106.";
+    return;
+  }
 
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox = sii->CreateSharedImage(
@@ -572,15 +584,18 @@
 
 // Test that DissociateMailbox may be used after the texture is destroyed.
 // The test should not crash or produce unexpected validation errors.
-TEST_P(WebGPUMailboxTest, DISABLED_DissociateMailboxAfterTextureDestroy) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+TEST_P(WebGPUMailboxTest, DissociateMailboxAfterTextureDestroy) {
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
     LOG(ERROR) << "Test skipped because WebGPUSharedImage isn't supported";
     return;
   }
+  if (!GPUTestBotConfig::CurrentConfigMatches("Mac")) {
+    LOG(ERROR) << "Test skipped due to crbug.com/1359106.";
+    return;
+  }
 
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox = sii->CreateSharedImage(
@@ -605,16 +620,18 @@
 
 // Test that DissociateMailboxForPresent may be used after the texture is
 // destroyed. The test should not crash or produce unexpected validation errors.
-TEST_P(WebGPUMailboxTest,
-       DISABLED_DissociateMailboxForPresentAfterTextureDestroy) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+TEST_P(WebGPUMailboxTest, DissociateMailboxForPresentAfterTextureDestroy) {
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
     LOG(ERROR) << "Test skipped because WebGPUSharedImage isn't supported";
     return;
   }
+  if (!GPUTestBotConfig::CurrentConfigMatches("Mac")) {
+    LOG(ERROR) << "Test skipped due to crbug.com/1359106.";
+    return;
+  }
 
   SharedImageInterface* sii = GetSharedImageInterface();
   Mailbox mailbox = sii->CreateSharedImage(
@@ -642,8 +659,7 @@
 // itself: we render to it using the Dawn device, then re-associate it to a
 // Dawn texture and read back the values that were written.
 TEST_P(WebGPUMailboxTest, WriteToMailboxThenReadFromIt) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
@@ -731,8 +747,7 @@
 // Test that an uninitialized shared image is lazily cleared by Dawn when it is
 // read.
 TEST_P(WebGPUMailboxTest, ReadUninitializedSharedImage) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
@@ -812,8 +827,7 @@
 // Test that an uninitialized shared image is lazily cleared by Dawn when it is
 // read.
 TEST_P(WebGPUMailboxTest, ReadWritableUninitializedSharedImage) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
@@ -907,8 +921,7 @@
 
 // Tests that using a shared image aftr it is dissociated produces an error.
 TEST_P(WebGPUMailboxTest, ErrorWhenUsingTextureAfterDissociate) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
@@ -998,8 +1011,7 @@
 // move-assignment would first move `representation` then `access`. Causing
 // incorrect member destruction order for the move-to object.
 TEST_P(WebGPUMailboxTest, UseA_UseB_DestroyA_DestroyB) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
@@ -1046,8 +1058,7 @@
 // devices tried to create shared images with the same (id, generation) (which
 // is possible because they can be on different Dawn wires) they would conflict.
 TEST_P(WebGPUMailboxTest, AssociateOnTwoDevicesAtTheSameTime) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
@@ -1103,8 +1114,7 @@
 // Test that passing a descriptor to ReserveTexture produces a client-side
 // WGPUTexture that correctly reflects said descriptor.
 TEST_P(WebGPUMailboxTest, ReflectionOfDescriptor) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!initialized_) {
     return;
   }
 
@@ -1181,8 +1191,7 @@
 // shared image backings rely on GL and need to be responsible for making the
 // context current.
 TEST_P(WebGPUMailboxTest, AssociateDissociateMailboxWhenNotCurrent) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!initialized_) {
     return;
   }
   if (!WebGPUSharedImageSupported()) {
diff --git a/gpu/command_buffer/tests/webgpu_test.cc b/gpu/command_buffer/tests/webgpu_test.cc
index 7602d11..918c9f5 100644
--- a/gpu/command_buffer/tests/webgpu_test.cc
+++ b/gpu/command_buffer/tests/webgpu_test.cc
@@ -82,9 +82,13 @@
   context_ = nullptr;
 }
 
-void WebGPUTest::Initialize(const Options& options) {
+bool WebGPUTest::Initialize(const Options& options) {
   if (!WebGPUSupported()) {
-    return;
+    []() {
+      // Wrap in lambda to avoid early return.
+      GTEST_SKIP() << "WebGPU not supported.";
+    }();
+    return false;
   }
 
   gpu::GpuPreferences gpu_preferences;
@@ -117,7 +121,10 @@
   ContextResult result =
       context_->Initialize(gpu_service_holder_->task_executor(), attributes,
                            options.shared_memory_limits, image_factory);
-  ASSERT_EQ(result, ContextResult::kSuccess);
+  if (result != ContextResult::kSuccess) {
+    ADD_FAILURE() << "Context failed to initialize";
+    return false;
+  }
 
   cmd_helper_ = std::make_unique<webgpu::WebGPUCmdHelper>(
       context_->GetCommandBufferForTest());
@@ -151,6 +158,7 @@
   while (!done) {
     RunPendingTasks();
   }
+  return true;
 }
 
 webgpu::WebGPUImplementation* WebGPUTest::webgpu() const {
@@ -201,6 +209,10 @@
 }
 
 void WebGPUTest::PollUntilIdle() {
+  if (!context_ || !gpu_service_holder_) {
+    // Never initialized. Test skipped or failed in setup.
+    return;
+  }
   webgpu()->FlushCommands();
   base::WaitableEvent wait;
   gpu_service_holder_->ScheduleGpuTask(
@@ -257,25 +269,19 @@
 }
 
 TEST_F(WebGPUTest, FlushNoCommands) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!Initialize(WebGPUTest::Options())) {
     return;
   }
 
-  Initialize(WebGPUTest::Options());
-
   webgpu()->FlushCommands();
 }
 
 // Referred from GLES2ImplementationTest/ReportLoss
 TEST_F(WebGPUTest, ReportLoss) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!Initialize(WebGPUTest::Options())) {
     return;
   }
 
-  Initialize(WebGPUTest::Options());
-
   GpuControlClient* webgpu_as_client = webgpu();
   int lost_count = 0;
   webgpu()->SetLostContextCallback(base::BindOnce(&CountCallback, &lost_count));
@@ -289,13 +295,10 @@
 
 // Referred from GLES2ImplementationTest/ReportLossReentrant
 TEST_F(WebGPUTest, ReportLossReentrant) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!Initialize(WebGPUTest::Options())) {
     return;
   }
 
-  Initialize(WebGPUTest::Options());
-
   GpuControlClient* webgpu_as_client = webgpu();
   int lost_count = 0;
   webgpu()->SetLostContextCallback(base::BindOnce(&CountCallback, &lost_count));
@@ -308,13 +311,10 @@
 }
 
 TEST_F(WebGPUTest, RequestAdapterAfterContextLost) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!Initialize(WebGPUTest::Options())) {
     return;
   }
 
-  Initialize(WebGPUTest::Options());
-
   webgpu()->OnGpuControlLostContext();
 
   bool called = false;
@@ -333,13 +333,10 @@
 }
 
 TEST_F(WebGPUTest, RequestDeviceAfterContextLost) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
+  if (!Initialize(WebGPUTest::Options())) {
     return;
   }
 
-  Initialize(WebGPUTest::Options());
-
   webgpu()->OnGpuControlLostContext();
 
   bool called = false;
@@ -360,11 +357,6 @@
 }
 
 TEST_F(WebGPUTest, RequestDeviceWitUnsupportedFeature) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
-    return;
-  }
-
 #if BUILDFLAG(IS_MAC)
   // Crashing on Mac M1. Currently missing stack trace. crbug.com/1271926
   // This must be checked before WebGPUTest::Initialize otherwise context
@@ -379,7 +371,9 @@
   gl_manager.Destroy();
 #endif
 
-  Initialize(WebGPUTest::Options());
+  if (!Initialize(WebGPUTest::Options())) {
+    return;
+  }
 
   // Create device with unsupported features, expect to fail to create and
   // return nullptr
@@ -416,11 +410,6 @@
 }
 
 TEST_F(WebGPUTest, SPIRVIsDisallowed) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
-    return;
-  }
-
   auto ExpectSPIRVDisallowedError = [](WGPUErrorType type, const char* message,
                                        void* userdata) {
     // We match on this string to make sure the shader module creation fails
@@ -432,7 +421,9 @@
 
   auto options = WebGPUTest::Options();
   options.enable_unsafe_webgpu = false;
-  Initialize(options);
+  if (!Initialize(options)) {
+    return;
+  }
   wgpu::Device device = GetNewDevice();
 
   // Make a invalid ShaderModuleDescriptor because it contains SPIR-V.
@@ -454,31 +445,25 @@
 }
 
 TEST_F(WebGPUTest, ExplicitFallbackAdapterIsDisallowed) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
-    return;
-  }
-
   auto options = WebGPUTest::Options();
   options.force_fallback_adapter = true;
   options.enable_unsafe_webgpu = false;
   // Initialize attempts to create an adapter.
-  Initialize(options);
+  if (!Initialize(options)) {
+    return;
+  }
 
   // No fallback adapter should be available.
   EXPECT_EQ(adapter_, nullptr);
 }
 
 TEST_F(WebGPUTest, ImplicitFallbackAdapterIsDisallowed) {
-  if (!WebGPUSupported()) {
-    LOG(ERROR) << "Test skipped because WebGPU isn't supported";
-    return;
-  }
-
   auto options = WebGPUTest::Options();
   options.enable_unsafe_webgpu = false;
   // Initialize attempts to create an adapter.
-  Initialize(options);
+  if (!Initialize(options)) {
+    return;
+  }
 
   if (adapter_) {
     wgpu::AdapterProperties properties;
diff --git a/gpu/command_buffer/tests/webgpu_test.h b/gpu/command_buffer/tests/webgpu_test.h
index 37e19b2..6bc30efd 100644
--- a/gpu/command_buffer/tests/webgpu_test.h
+++ b/gpu/command_buffer/tests/webgpu_test.h
@@ -56,7 +56,7 @@
   void SetUp() override;
   void TearDown() override;
 
-  void Initialize(const Options& options);
+  bool Initialize(const Options& options);
 
   webgpu::WebGPUImplementation* webgpu() const;
   webgpu::WebGPUCmdHelper* webgpu_cmds() const;
diff --git a/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Builder/properties.json b/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Builder/properties.json
index 69b92ff..452bddf 100644
--- a/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Builder/properties.json
+++ b/infra/config/generated/builders/ci/Dawn Mac x64 DEPS Builder/properties.json
@@ -117,10 +117,10 @@
       ]
     }
   },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git "a/infra/config/generated/builders/ci/GPU Mac Builder \050dbg\051/properties.json" "b/infra/config/generated/builders/ci/GPU Mac Builder \050dbg\051/properties.json"
index 795a131..67f81d58 100644
--- "a/infra/config/generated/builders/ci/GPU Mac Builder \050dbg\051/properties.json"
+++ "b/infra/config/generated/builders/ci/GPU Mac Builder \050dbg\051/properties.json"
@@ -1,8 +1,8 @@
 {
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json b/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json
index 807557a..0a83216 100644
--- a/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json
+++ b/infra/config/generated/builders/ci/ios-simulator-code-coverage/properties.json
@@ -8,10 +8,10 @@
     "export_coverage_to_zoss": true,
     "use_clang_coverage": true
   },
-  "$build/goma": {
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 58a00de..a97ed44e 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -54777,11 +54777,10 @@
     builders {
       name: "android-marshmallow-arm64-rel"
       swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builder:android-marshmallow-arm64-rel"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
       dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.try"
+      dimensions: "pool:luci.chromium.try.orchestrator"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
         cipd_version: "latest"
@@ -54818,6 +54817,10 @@
         seconds: 120
       }
       caches {
+        name: "unused_builder_cache"
+        path: "builder"
+      }
+      caches {
         name: "win_toolchain"
         path: "win_toolchain"
       }
diff --git a/infra/config/subprojects/chromium/ci/chromium.dawn.star b/infra/config/subprojects/chromium/ci/chromium.dawn.star
index 02c07e3..44374d2 100644
--- a/infra/config/subprojects/chromium/ci/chromium.dawn.star
+++ b/infra/config/subprojects/chromium/ci/chromium.dawn.star
@@ -5,7 +5,7 @@
 
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "goma", "reclient")
+load("//lib/builders.star", "reclient")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 
@@ -238,8 +238,6 @@
         short_name = "x64",
     ),
     cq_mirrors_console_view = "mirrors",
-    goma_backend = goma.backend.RBE_PROD,
-    reclient_instance = None,
 )
 
 # Note that the Mac testers are all thin Linux VMs, triggering jobs on the
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index a0aa73d..303ff293 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -1890,6 +1890,9 @@
     coverage_test_types = ["overall", "unit"],
     export_coverage_to_zoss = True,
     xcode = xcode.x14main,
+    goma_backend = None,
+    reclient_instance = reclient.instance.DEFAULT_TRUSTED,
+    reclient_jobs = reclient.jobs.DEFAULT,
 )
 
 fyi_coverage_builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.star b/infra/config/subprojects/chromium/ci/chromium.gpu.star
index 1cc07b9c..26835a36 100644
--- a/infra/config/subprojects/chromium/ci/chromium.gpu.star
+++ b/infra/config/subprojects/chromium/ci/chromium.gpu.star
@@ -6,7 +6,7 @@
 load("//lib/args.star", "args")
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "goma", "reclient", "sheriff_rotations")
+load("//lib/builders.star", "reclient", "sheriff_rotations")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
 load("//lib/structs.star", "structs")
@@ -157,8 +157,6 @@
     ),
     sheriff_rotations = args.ignore_default(None),
     tree_closing = False,
-    goma_backend = goma.backend.RBE_PROD,
-    reclient_instance = None,
 )
 
 ci.gpu.windows_builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
index 91d29b8..c96ea67 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -270,6 +270,7 @@
         "weetbix.retry_weak_exonerations": 100,
         "weetbix.enable_weetbix_exonerations": 100,
     },
+    use_orchestrator_pool = True,
 )
 
 try_.compilator_builder(
diff --git a/infra/inclusive_language_presubmit_exempt_dirs.txt b/infra/inclusive_language_presubmit_exempt_dirs.txt
index cd7f3383..cb69b63 100644
--- a/infra/inclusive_language_presubmit_exempt_dirs.txt
+++ b/infra/inclusive_language_presubmit_exempt_dirs.txt
@@ -588,7 +588,7 @@
 third_party/rust/autocfg/v1/crate 1 1
 third_party/rust/autocxx_bindgen/v0_60/crate/src 10 2
 third_party/rust/backtrace/v0_3/crate/.github/workflows 2 1
-third_party/rust/bindgen/v0_59/crate/src 10 2
+third_party/rust/bindgen/v0_60/crate/src 10 2
 third_party/rust/camino/v1/crate 2 1
 third_party/rust/cargo_metadata/v0_14/crate 1 1
 third_party/rust/cexpr/v0_6/crate/.github/workflows 2 1
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index db79f29..321d527 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -786,6 +786,17 @@
      flag_descriptions::kOmniboxNewImplementationName,
      flag_descriptions::kOmniboxNewImplementationDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(kIOSNewOmniboxImplementation)},
+    {"omnibox-on-focus-suggestions-contextual-web",
+     flag_descriptions::kOmniboxFocusTriggersContextualWebZeroSuggestName,
+     flag_descriptions::
+         kOmniboxFocusTriggersContextualWebZeroSuggestDescription,
+     flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(omnibox::kFocusTriggersContextualWebZeroSuggest)},
+    {"omnibox-on-focus-suggestions-srp",
+     flag_descriptions::kOmniboxFocusTriggersSRPZeroSuggestName,
+     flag_descriptions::kOmniboxFocusTriggersSRPZeroSuggestDescription,
+     flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(omnibox::kFocusTriggersSRPZeroSuggest)},
     {"omnibox-fuzzy-url-suggestions",
      flag_descriptions::kOmniboxFuzzyUrlSuggestionsName,
      flag_descriptions::kOmniboxFuzzyUrlSuggestionsDescription,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index e121ca79..77d691cb 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -548,6 +548,20 @@
 const char kOmniboxNewImplementationDescription[] =
     "Uses a textfield implementation that doesn't use UILabels internally";
 
+const char kOmniboxFocusTriggersContextualWebZeroSuggestName[] =
+    "Omnibox on-focus suggestions for the contextual Web";
+const char kOmniboxFocusTriggersContextualWebZeroSuggestDescription[] =
+    "Enables on-focus suggestions on the Open Web, that are contextual to the "
+    "current URL. Will only work if user is signed-in and syncing, or is "
+    "otherwise eligible to send the current page URL to the suggest server.";
+
+const char kOmniboxFocusTriggersSRPZeroSuggestName[] =
+    "Allow Omnibox contextual web on-focus suggestions on the SRP";
+const char kOmniboxFocusTriggersSRPZeroSuggestDescription[] =
+    "Enables on-focus suggestions on the Search Results page. Requires "
+    "on-focus suggestions for the contextual web to be enabled. Will only work "
+    "if user is signed-in and syncing.";
+
 const char kOmniboxPasteButtonName[] = "Omnibox paste to search button";
 const char kOmniboxPasteButtonDescription[] =
     "Add a paste button when showing clipboard suggestions in the omnibox. iOS "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index 0c0f289..9911d25 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -504,6 +504,16 @@
 extern const char kOmniboxNewImplementationName[];
 extern const char kOmniboxNewImplementationDescription[];
 
+// Title and description for the flag to fetch contextual zero-prefix
+// suggestions related to current page (on normal web pages).
+extern const char kOmniboxFocusTriggersContextualWebZeroSuggestName[];
+extern const char kOmniboxFocusTriggersContextualWebZeroSuggestDescription[];
+
+// Title and description for the flag to fetch contextual zero-prefix
+// suggestions on search results page.
+extern const char kOmniboxFocusTriggersSRPZeroSuggestName[];
+extern const char kOmniboxFocusTriggersSRPZeroSuggestDescription[];
+
 // Title and description for the flag to enable paste button on clipboard
 // suggestion.
 extern const char kOmniboxPasteButtonName[];
diff --git a/ios/chrome/browser/sync/sync_service_factory_unittest.cc b/ios/chrome/browser/sync/sync_service_factory_unittest.cc
index 45913b4..851fe971 100644
--- a/ios/chrome/browser/sync/sync_service_factory_unittest.cc
+++ b/ios/chrome/browser/sync/sync_service_factory_unittest.cc
@@ -67,7 +67,9 @@
     datatypes.Put(syncer::AUTOFILL_WALLET_METADATA);
     datatypes.Put(syncer::AUTOFILL_WALLET_OFFER);
     datatypes.Put(syncer::BOOKMARKS);
-    // TODO(crbug.com/1348294): Add CONTACT_INFO once it has a controller.
+    if (base::FeatureList::IsEnabled(syncer::kSyncEnableContactInfoDataType)) {
+      datatypes.Put(syncer::CONTACT_INFO);
+    }
     datatypes.Put(syncer::DEVICE_INFO);
     if (base::FeatureList::IsEnabled(syncer::kSyncEnableHistoryDataType)) {
       datatypes.Put(syncer::HISTORY);
diff --git a/ios/chrome/browser/ui/app_store_rating/BUILD.gn b/ios/chrome/browser/ui/app_store_rating/BUILD.gn
index a766fb5..6ebfbaa 100644
--- a/ios/chrome/browser/ui/app_store_rating/BUILD.gn
+++ b/ios/chrome/browser/ui/app_store_rating/BUILD.gn
@@ -20,7 +20,6 @@
     "//ios/chrome/browser/ui/default_promo:utils",
     "//ios/chrome/browser/ui/main:browser_interface_provider",
     "//ios/chrome/browser/ui/main:observing_scene_agent",
-    "//ios/chrome/browser/ui/main:scene",
     "//ios/chrome/browser/ui/promos_manager:promos",
   ]
 }
diff --git a/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm b/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm
index 21af617..6f2483e2 100644
--- a/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm
+++ b/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm
@@ -12,7 +12,6 @@
 #import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/ui/default_promo/default_browser_utils.h"
 #import "ios/chrome/browser/ui/main/browser_interface_provider.h"
-#import "ios/chrome/browser/ui/main/scene_delegate.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/commands/promos_manager_commands.h b/ios/chrome/browser/ui/commands/promos_manager_commands.h
index f6524cc..a853434 100644
--- a/ios/chrome/browser/ui/commands/promos_manager_commands.h
+++ b/ios/chrome/browser/ui/commands/promos_manager_commands.h
@@ -5,6 +5,8 @@
 #ifndef IOS_CHROME_BROWSER_UI_COMMANDS_PROMOS_MANAGER_COMMANDS_H_
 #define IOS_CHROME_BROWSER_UI_COMMANDS_PROMOS_MANAGER_COMMANDS_H_
 
+#import <StoreKit/StoreKit.h>
+
 #import "ios/chrome/browser/promos_manager/constants.h"
 
 // Commands to show app-wide promos.
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm
index 816bbe9..6ec81e3 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm
+++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_module_container.mm
@@ -220,7 +220,8 @@
     case ContentSuggestionsModuleTypeTrendingQueries:
       contentHeight += kTrendingQueriesContentHeight;
   }
-  if (!ShouldRemoveHeadersForModuleRefresh()) {
+  if (!ShouldRemoveHeadersForModuleRefresh() ||
+      self.type == ContentSuggestionsModuleTypeTrendingQueries) {
     contentHeight += ceilf(self.title.font.lineHeight);
   }
   return [self titleSpacing] + [self titleTopInset] + contentHeight;
diff --git a/ios/chrome/browser/ui/main/BUILD.gn b/ios/chrome/browser/ui/main/BUILD.gn
index 65ad852..96c7c03 100644
--- a/ios/chrome/browser/ui/main/BUILD.gn
+++ b/ios/chrome/browser/ui/main/BUILD.gn
@@ -170,6 +170,8 @@
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/snapshots",
     "//ios/chrome/browser/ui:feature_flags",
+    "//ios/chrome/browser/ui/app_store_rating",
+    "//ios/chrome/browser/ui/app_store_rating:features",
     "//ios/chrome/browser/ui/appearance",
     "//ios/chrome/browser/ui/authentication",
     "//ios/chrome/browser/ui/authentication/enterprise:enterprise_utils",
diff --git a/ios/chrome/browser/ui/main/scene_controller.mm b/ios/chrome/browser/ui/main/scene_controller.mm
index 4506e42..011566b 100644
--- a/ios/chrome/browser/ui/main/scene_controller.mm
+++ b/ios/chrome/browser/ui/main/scene_controller.mm
@@ -76,6 +76,8 @@
 #import "ios/chrome/browser/signin/constants.h"
 #import "ios/chrome/browser/signin/identity_manager_factory.h"
 #import "ios/chrome/browser/snapshots/snapshot_tab_helper.h"
+#import "ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.h"
+#import "ios/chrome/browser/ui/app_store_rating/features.h"
 #import "ios/chrome/browser/ui/appearance/appearance_customization.h"
 #import "ios/chrome/browser/ui/authentication/signed_in_accounts/signed_in_accounts_view_controller.h"
 #import "ios/chrome/browser/ui/authentication/signin/signin_coordinator.h"
@@ -905,6 +907,9 @@
     [self.sceneState
         addAgent:[[PromosManagerSceneAgent alloc]
                      initWithCommandDispatcher:mainCommandDispatcher]];
+  if (IsAppStoreRatingEnabled()) {
+    [self.sceneState addAgent:[[AppStoreRatingSceneAgent alloc] init]];
+  }
 }
 
 // Determines the mode (normal or incognito) the initial UI should be in.
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
index 9a72e45a..5897ce2 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_coordinator.mm
@@ -881,8 +881,9 @@
 }
 
 - (BOOL)isStartSurface {
-  return NewTabPageTabHelper::FromWebState(self.webState)
-      ->ShouldShowStartSurface();
+  NewTabPageTabHelper* NTPHelper =
+      NewTabPageTabHelper::FromWebState(self.webState);
+  return NTPHelper && NTPHelper->ShouldShowStartSurface();
 }
 
 - (void)handleFeedTopSectionClosed {
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
index f6a146e..a08fbc76 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
@@ -9,6 +9,7 @@
 #import "base/mac/foundation_util.h"
 #import "base/metrics/histogram_macros.h"
 #import "base/time/time.h"
+#import "components/omnibox/common/omnibox_features.h"
 #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_tile_layout_util.h"
 #import "ios/chrome/browser/ui/elements/self_sizing_table_view.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_constants.h"
@@ -445,6 +446,7 @@
 
 - (BOOL)tableView:(UITableView*)tableView
     shouldHighlightRowAtIndexPath:(NSIndexPath*)indexPath {
+  // TODO(crbug.com/1365374): Handle Carousel's highlight.
   return YES;
 }
 
@@ -459,6 +461,7 @@
   // early. See b/5813291.
   if (row >= self.currentResult[indexPath.section].suggestions.count)
     return;
+  // TODO(crbug.com/1365374): Handle Carousel's selection.
   [self.delegate
       autocompleteResultConsumer:self
              didSelectSuggestion:self.currentResult[indexPath.section]
@@ -525,7 +528,14 @@
 
 - (NSInteger)tableView:(UITableView*)tableView
     numberOfRowsInSection:(NSInteger)section {
-  return self.currentResult[section].suggestions.count;
+  switch (self.currentResult[section].displayStyle) {
+    case SuggestionGroupDisplayStyleDefault:
+      return self.currentResult[section].suggestions.count;
+    case SuggestionGroupDisplayStyleCarousel:
+      DCHECK(base::FeatureList::IsEnabled(omnibox::kMostVisitedTiles));
+      // The carousel displays suggestions on one row.
+      return 1;
+  }
 }
 
 - (BOOL)tableView:(UITableView*)tableView
@@ -566,20 +576,32 @@
         cellForRowAtIndexPath:(NSIndexPath*)indexPath {
   DCHECK_LT((NSUInteger)indexPath.row,
             self.currentResult[indexPath.section].suggestions.count);
-  OmniboxPopupRowCell* cell = [self.tableView
-      dequeueReusableCellWithIdentifier:OmniboxPopupRowCellReuseIdentifier
-                           forIndexPath:indexPath];
-  cell.faviconRetriever = self.faviconRetriever;
-  cell.imageRetriever = self.imageRetriever;
-  [cell setupWithAutocompleteSuggestion:self.currentResult[indexPath.section]
-                                            .suggestions[indexPath.row]
-                              incognito:self.incognito];
-  cell.showsSeparator =
-      (NSUInteger)indexPath.row <
-      self.currentResult[indexPath.section].suggestions.count - 1;
-  cell.delegate = self;
 
-  return cell;
+  switch (self.currentResult[indexPath.section].displayStyle) {
+    case SuggestionGroupDisplayStyleDefault: {
+      OmniboxPopupRowCell* cell = [self.tableView
+          dequeueReusableCellWithIdentifier:OmniboxPopupRowCellReuseIdentifier
+                               forIndexPath:indexPath];
+      cell.faviconRetriever = self.faviconRetriever;
+      cell.imageRetriever = self.imageRetriever;
+      [cell
+          setupWithAutocompleteSuggestion:self.currentResult[indexPath.section]
+                                              .suggestions[indexPath.row]
+                                incognito:self.incognito];
+      cell.showsSeparator =
+          (NSUInteger)indexPath.row <
+          self.currentResult[indexPath.section].suggestions.count - 1;
+      cell.delegate = self;
+      return cell;
+    }
+    case SuggestionGroupDisplayStyleCarousel: {
+      DCHECK(base::FeatureList::IsEnabled(omnibox::kMostVisitedTiles));
+      UITableViewCell* cell = [[UITableViewCell alloc] init];
+      cell.backgroundColor = UIColor.blackColor;
+      // TODO(crbug.com/1365374): Replace with OmniboxPopupCarouselCell.
+      return cell;
+    }
+  }
 }
 
 #pragma mark - Internal API methods
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift
index d9b0ed4..a9e62b5 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift
@@ -63,61 +63,84 @@
 
   @ObservedObject var uiConfiguration: OverflowMenuUIConfiguration
 
-  /// Tracks the list's current offset, to see when it scrolls.
-  @State var listOffset: CGFloat = 0
+  /// Tracks the list's current offset, to see when it scrolls. When the offset
+  /// is `nil`, scroll tracking is not set up yet. This is necessary because
+  /// in RTL languages, the scroll view has to manually scroll to the right edge
+  /// of the list first.
+  @State var listOffset: CGFloat? = nil
 
   var body: some View {
-    GeometryReader { geometry in
-      ScrollViewReader { proxy in
-        ScrollView(.horizontal, showsIndicators: false) {
-          let spacing = destinationSpacing(forScreenWidth: geometry.size.width)
-          let layoutParameters: OverflowMenuDestinationView.LayoutParameters =
-            sizeCategory >= .accessibilityMedium
-            ? .horizontal(itemWidth: geometry.size.width - Constants.largeTextSizeSpace)
-            : .vertical(
-              iconSpacing: spacing.iconSpacing,
-              iconPadding: spacing.iconPadding)
-          let alignment: VerticalAlignment = sizeCategory >= .accessibilityMedium ? .center : .top
+    VStack {
+      Spacer(minLength: Constants.topMargin)
+      GeometryReader { geometry in
+        scrollView(in: geometry)
+          .coordinateSpace(name: Constants.coordinateSpaceName)
+          .accessibilityIdentifier(kPopupMenuToolsMenuTableViewId)
+      }
+    }
+    .animation(nil)
+    .background(uiConfiguration.highlightDestinationsRow ? Color.blueHalo : Color.clear)
+    .animation(.linear(duration: kMaterialDuration3))
+    .onPreferenceChange(ScrollViewLeadingOffset.self) { newOffset in
+      // Only alert the handler if scroll tracking has started.
+      if let listOffset = listOffset,
+        newOffset != listOffset
+      {
+        metricsHandler?.popupMenuScrolledHorizontally()
+      }
+      // Only update the offset if scroll tracking has started or the newOffset
+      // is approximately 0 (this starts scroll tracking). In RTL mode, the
+      // offset is not exactly 0, so a strict comparison won't work.
+      if listOffset != nil || (listOffset == nil && abs(newOffset) < 1e-9) {
+        listOffset = newOffset
+      }
+    }
+  }
 
-          ZStack {
-            VStack {
-              Spacer(minLength: Constants.topMargin)
-              LazyHStack(alignment: alignment, spacing: 0) {
-                // Make sure the space to the first icon is constant, so add extra
-                // spacing before the first item.
-                Spacer().frame(width: Constants.iconInitialSpace - spacing.iconSpacing)
-                ForEach(destinations) { destination in
-                  OverflowMenuDestinationView(
-                    destination: destination, layoutParameters: layoutParameters,
-                    metricsHandler: metricsHandler
-                  ).id(destination.destinationName)
-                }
-              }
-            }
-            GeometryReader { innerGeometry in
-              let offset = innerGeometry.frame(in: .named(Constants.coordinateSpaceName)).minX
-              Color.clear
-                .preference(key: ScrollViewLeadingOffset.self, value: offset)
+  @ViewBuilder
+  private func scrollView(in geometry: GeometryProxy) -> some View {
+    ScrollViewReader { proxy in
+      ScrollView(.horizontal, showsIndicators: false) {
+        let spacing = destinationSpacing(forScreenWidth: geometry.size.width)
+        let layoutParameters: OverflowMenuDestinationView.LayoutParameters =
+          sizeCategory >= .accessibilityMedium
+          ? .horizontal(itemWidth: geometry.size.width - Constants.largeTextSizeSpace)
+          : .vertical(
+            iconSpacing: spacing.iconSpacing,
+            iconPadding: spacing.iconPadding)
+        let alignment: VerticalAlignment = sizeCategory >= .accessibilityMedium ? .center : .top
+
+        ZStack {
+          HStack(alignment: alignment, spacing: 0) {
+            // Make sure the space to the first icon is constant, so add extra
+            // spacing before the first item.
+            Spacer().frame(width: Constants.iconInitialSpace - spacing.iconSpacing)
+            ForEach(destinations) { destination in
+              OverflowMenuDestinationView(
+                destination: destination, layoutParameters: layoutParameters,
+                metricsHandler: metricsHandler
+              ).id(destination.destinationName)
             }
           }
-        }
-        .animation(nil)
-        .background(uiConfiguration.highlightDestinationsRow ? Color.blueHalo : Color.clear)
-        .animation(.linear(duration: kMaterialDuration3))
-        .coordinateSpace(name: Constants.coordinateSpaceName)
-        .accessibilityIdentifier(kPopupMenuToolsMenuTableViewId)
-        .onAppear {
-          if layoutDirection == .rightToLeft {
-            proxy.scrollTo(destinations.last?.destinationName)
+
+          GeometryReader { innerGeometry in
+            let frame = innerGeometry.frame(in: .named(Constants.coordinateSpaceName))
+            let parentWidth = geometry.size.width
+
+            // When the view is RTL, the offset should be calculated from the
+            // right edge.
+            let offset = layoutDirection == .leftToRight ? frame.minX : parentWidth - frame.maxX
+
+            Color.clear
+              .preference(key: ScrollViewLeadingOffset.self, value: offset)
           }
-          uiConfiguration.destinationListScreenFrame = geometry.frame(in: .global)
         }
       }
-      .onPreferenceChange(ScrollViewLeadingOffset.self) { value in
-        if value != listOffset {
-          metricsHandler?.popupMenuScrolledHorizontally()
+      .onAppear {
+        if layoutDirection == .rightToLeft {
+          proxy.scrollTo(destinations.first?.destinationName)
         }
-        listOffset = value
+        uiConfiguration.destinationListScreenFrame = geometry.frame(in: .global)
       }
     }
   }
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
index 8d74db0c..16f5b72 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.mm
@@ -66,7 +66,7 @@
   // But for very small devices (like the SE), this is too big.
   UIWindow* currentWindow = chrome_test_util::GetAnyKeyWindow();
   if (currentWindow.rootViewController.view.frame.size.height < 600)
-    menu_scroll_displacement = 300;
+    menu_scroll_displacement = 250;
   return grey_scrollInDirection(kGREYDirectionDown, menu_scroll_displacement);
 }
 
diff --git a/ios/web_view/public/cwv_trusted_vault_utils.h b/ios/web_view/public/cwv_trusted_vault_utils.h
index 44364421..705d345 100644
--- a/ios/web_view/public/cwv_trusted_vault_utils.h
+++ b/ios/web_view/public/cwv_trusted_vault_utils.h
@@ -14,7 +14,8 @@
 // Possible states of the trusted vault. Keep in sync with
 // syncer::TrustedVaultDeviceRegistrationStateForUMA.
 typedef NS_ENUM(NSInteger, CWVTrustedVaultState) {
-  // DEPRECATED, use `CWVTrustedVaultStateAlreadyRegisteredV0`.
+  // TODO(crbug.com/1362716): DEPRECATED, use
+  // `CWVTrustedVaultStateAlreadyRegisteredV0`.
   CWVTrustedVaultStateAlreadyRegistered = 0,
   CWVTrustedVaultStateAlreadyRegisteredV0 = 0,
   CWVTrustedVaultStateLocalKeysAreStale = 1,
diff --git a/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java b/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java
index cfd7c991..66a2955 100644
--- a/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java
+++ b/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java
@@ -8,7 +8,6 @@
 import android.media.AudioFormat;
 import android.media.AudioManager;
 import android.media.AudioTrack;
-import android.os.Build;
 
 import androidx.annotation.VisibleForTesting;
 
@@ -154,11 +153,7 @@
             case 6:
                 return AudioFormat.CHANNEL_OUT_5POINT1;
             case 8:
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-                    return AudioFormat.CHANNEL_OUT_7POINT1_SURROUND;
-                } else {
-                    return AudioFormat.CHANNEL_OUT_7POINT1;
-                }
+                return AudioFormat.CHANNEL_OUT_7POINT1_SURROUND;
             default:
                 return AudioFormat.CHANNEL_OUT_DEFAULT;
         }
diff --git a/media/base/android/java/src/org/chromium/media/DisplayCompat.java b/media/base/android/java/src/org/chromium/media/DisplayCompat.java
index da97c798..3a369aaa 100644
--- a/media/base/android/java/src/org/chromium/media/DisplayCompat.java
+++ b/media/base/android/java/src/org/chromium/media/DisplayCompat.java
@@ -17,7 +17,6 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -51,31 +50,25 @@
     public static ModeCompat[] getSupportedModes(
             @NonNull Context context, @NonNull Display display) {
         Point physicalDisplaySize = getPhysicalDisplaySize(context, display);
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            // Display.Mode class and display.getSupportedModes() exist
-            Display.Mode[] supportedModes = display.getSupportedModes();
-            ArrayList<ModeCompat> supportedModesCompat = new ArrayList<>(supportedModes.length);
-            boolean nativeModeExists = false;
-            for (int i = 0; i < supportedModes.length; i++) {
-                if (physicalSizeEquals(supportedModes[i], physicalDisplaySize)) {
-                    // Current mode has native resolution, flag it accordingly
-                    supportedModesCompat.add(i, new ModeCompat(supportedModes[i], true));
-                    nativeModeExists = true;
-                } else {
-                    supportedModesCompat.add(i, new ModeCompat(supportedModes[i], false));
-                }
+        // Display.Mode class and display.getSupportedModes() exist
+        Display.Mode[] supportedModes = display.getSupportedModes();
+        ArrayList<ModeCompat> supportedModesCompat = new ArrayList<>(supportedModes.length);
+        boolean nativeModeExists = false;
+        for (int i = 0; i < supportedModes.length; i++) {
+            if (physicalSizeEquals(supportedModes[i], physicalDisplaySize)) {
+                // Current mode has native resolution, flag it accordingly
+                supportedModesCompat.add(i, new ModeCompat(supportedModes[i], true));
+                nativeModeExists = true;
+            } else {
+                supportedModesCompat.add(i, new ModeCompat(supportedModes[i], false));
             }
-            if (!nativeModeExists) {
-                // If no mode with physicalDisplaySize dimension exists, add the mode with the
-                // native display resolution
-                supportedModesCompat.add(new ModeCompat(physicalDisplaySize));
-            }
-            return supportedModesCompat.toArray(new ModeCompat[0]);
-        } else {
-            // previous to Android M Display.Mode and Display.getSupportedModes() did not exist,
-            // hence the only supported mode is the native display resolution
-            return new ModeCompat[] {new ModeCompat(physicalDisplaySize)};
         }
+        if (!nativeModeExists) {
+            // If no mode with physicalDisplaySize dimension exists, add the mode with the
+            // native display resolution
+            supportedModesCompat.add(new ModeCompat(physicalDisplaySize));
+        }
+        return supportedModesCompat.toArray(new ModeCompat[0]);
     }
 
     /**
@@ -136,7 +129,6 @@
      * @param mode a Display.Mode object
      * @param size a Point object representing the size in horizontal and vertical direction
      */
-    @RequiresApi(Build.VERSION_CODES.M)
     private static boolean physicalSizeEquals(Display.Mode mode, Point size) {
         return (mode.getPhysicalWidth() == size.x && mode.getPhysicalHeight() == size.y)
                 || (mode.getPhysicalWidth() == size.y && mode.getPhysicalHeight() == size.x);
@@ -197,15 +189,9 @@
             // size from the framework API. Note that this might not be the actual physical
             // display size but the, possibly down-scaled, UI size.
             displaySize = new Point();
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-                Display.Mode mode = display.getMode();
-                displaySize.x = mode.getPhysicalWidth();
-                displaySize.y = mode.getPhysicalHeight();
-            } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
-                display.getRealSize(displaySize);
-            } else {
-                display.getSize(displaySize);
-            }
+            Display.Mode mode = display.getMode();
+            displaySize.x = mode.getPhysicalWidth();
+            displaySize.y = mode.getPhysicalHeight();
         }
         return displaySize;
     }
@@ -254,7 +240,6 @@
          *
          * @param mode a Display.Mode object
          */
-        @RequiresApi(Build.VERSION_CODES.M)
         ModeCompat(@NonNull Display.Mode mode, boolean isNative) {
             if (mode == null) {
                 throw new NullPointerException("Display.Mode == null, can't wrap a null reference");
@@ -290,7 +275,6 @@
          * @return the wrapped Display.Mode object or null if there was no matching mode for the
          * native resolution.
          */
-        @RequiresApi(Build.VERSION_CODES.M)
         @Nullable
         public Display.Mode toMode() {
             return mMode;
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
index 8c8b04f..f860fc8 100644
--- a/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
+++ b/media/base/android/java/src/org/chromium/media/MediaCodecUtil.java
@@ -311,10 +311,6 @@
                 // https://developer.android.com/reference/android/media/MediaCodecInfo.CodecProfileLevel.html
                 try {
                     CodecCapabilities codecCapabilities = info.getCapabilitiesForType(mime);
-                    if (mime.endsWith("vp9") && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
-                        addVp9CodecProfileLevels(profileLevels, codecCapabilities);
-                        continue;
-                    }
                     for (CodecProfileLevel profileLevel : codecCapabilities.profileLevels) {
                         profileLevels.addCodecProfileLevel(mime, profileLevel);
                     }
@@ -529,14 +525,12 @@
             case HWEncoder.QcomVp8:
             case HWEncoder.QcomH264:
             case HWEncoder.ExynosH264:
-                return Build.VERSION_CODES.LOLLIPOP;
+            case HWEncoder.HisiH264:
             case HWEncoder.ExynosVp8:
             case HWEncoder.ExynosVp9:
-                return Build.VERSION_CODES.M;
+                return Build.VERSION_CODES.N;
             case HWEncoder.MediatekH264:
                 return Build.VERSION_CODES.O_MR1;
-            case HWEncoder.HisiH264:
-                return Build.VERSION_CODES.N;
             case HWEncoder.SpreadtrumH264:
                 return Build.VERSION_CODES.R;
         }
@@ -604,8 +598,7 @@
         // MediaCodec.setOutputSurface().  http://crbug.com/683401
         // Huawei P9 lite will, eventually, get the decoder into a bad state if SetSurface is called
         // enough times (https://crbug.com/792261).
-        return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
-                && !Build.HARDWARE.equalsIgnoreCase("hi6210sft")
+        return !Build.HARDWARE.equalsIgnoreCase("hi6210sft")
                 && !Build.HARDWARE.equalsIgnoreCase("hi6250");
     }
 
diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
index 068a42be..2d0b3c0 100644
--- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
+++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
@@ -7,9 +7,6 @@
 import android.annotation.SuppressLint;
 import android.media.MediaCrypto;
 import android.media.MediaDrm;
-import android.os.Build;
-
-import androidx.annotation.RequiresApi;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
@@ -263,7 +260,6 @@
         return mSchemeUUID.equals(WIDEVINE_UUID);
     }
 
-    @RequiresApi(Build.VERSION_CODES.M)
     private MediaDrmBridge(UUID schemeUUID, boolean requiresMediaCrypto, long nativeMediaDrmBridge,
             long nativeMediaDrmStorageBridge) throws android.media.UnsupportedSchemeException {
         mSchemeUUID = schemeUUID;
@@ -279,10 +275,8 @@
         mProvisioningPending = false;
 
         mMediaDrm.setOnEventListener(new EventListener());
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            mMediaDrm.setOnExpirationUpdateListener(new ExpirationUpdateListener(), null);
-            mMediaDrm.setOnKeyStatusChangeListener(new KeyStatusChangeListener(), null);
-        }
+        mMediaDrm.setOnExpirationUpdateListener(new ExpirationUpdateListener(), null);
+        mMediaDrm.setOnKeyStatusChangeListener(new KeyStatusChangeListener(), null);
 
         if (isWidevine()) {
             mMediaDrm.setPropertyString(PRIVACY_MODE, ENABLE);
@@ -488,7 +482,6 @@
      * origins, e.g. certificates, licenses.
      */
     private boolean setOrigin(String origin) {
-        assert Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
         Log.d(TAG, "Set origin: %s", origin);
 
         if (!isWidevine()) {
@@ -974,7 +967,6 @@
      * Load persistent license from storage.
      */
     @CalledByNative
-    @RequiresApi(Build.VERSION_CODES.M)
     private void loadSession(byte[] emeId, final long promiseId) {
         Log.d(TAG, "loadSession()");
         assert !mProvisioningPending;
@@ -996,7 +988,6 @@
      * Load session back to memory with MediaDrm. Load persistent storage
      * before calling this. It will fail if persistent storage isn't loaded.
      */
-    @RequiresApi(Build.VERSION_CODES.M)
     private void loadSessionWithLoadedStorage(SessionId sessionId, final long promiseId) {
         byte[] drmId = null;
         try {
@@ -1353,21 +1344,10 @@
         }
     }
 
-    @RequiresApi(Build.VERSION_CODES.M)
     private void onSessionMessage(final SessionId sessionId, final MediaDrm.KeyRequest request) {
         if (!isNativeMediaDrmBridgeValid()) return;
 
-        int requestType = MediaDrm.KeyRequest.REQUEST_TYPE_INITIAL;
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            requestType = request.getRequestType();
-        } else {
-            // Prior to M, getRequestType() is not supported. Do our best guess here: Assume
-            // requests with a URL are renewals and all others are initial requests.
-            requestType = request.getDefaultUrl().isEmpty()
-                    ? MediaDrm.KeyRequest.REQUEST_TYPE_INITIAL
-                    : MediaDrm.KeyRequest.REQUEST_TYPE_RENEWAL;
-        }
-
+        int requestType = request.getRequestType();
         MediaDrmBridgeJni.get().onSessionMessage(mNativeMediaDrmBridge, MediaDrmBridge.this,
                 sessionId.emeId(), requestType, request.getData());
     }
@@ -1425,23 +1405,12 @@
                     if (request != null) {
                         onSessionMessage(sessionId, request);
                     } else {
-                        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
-                            onSessionKeysChange(sessionId,
-                                    getDummyKeysInfo(MediaDrm.KeyStatus.STATUS_INTERNAL_ERROR)
-                                            .toArray(),
-                                    false, false);
-                        }
                         Log.e(TAG, "EventListener: getKeyRequest failed.");
                         return;
                     }
                     break;
                 case MediaDrm.EVENT_KEY_EXPIRED:
                     Log.d(TAG, "MediaDrm.EVENT_KEY_EXPIRED");
-                    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
-                        onSessionKeysChange(sessionId,
-                                getDummyKeysInfo(MediaDrm.KeyStatus.STATUS_EXPIRED).toArray(),
-                                false, sessionInfo.keyType() == MediaDrm.KEY_TYPE_RELEASE);
-                    }
                     break;
                 case MediaDrm.EVENT_VENDOR_DEFINED:
                     Log.d(TAG, "MediaDrm.EVENT_VENDOR_DEFINED");
@@ -1454,7 +1423,6 @@
         }
     }
 
-    @RequiresApi(Build.VERSION_CODES.M)
     private class KeyStatusChangeListener implements MediaDrm.OnKeyStatusChangeListener {
         private List<KeyStatus> getKeysInfo(List<MediaDrm.KeyStatus> keyInformation) {
             List<KeyStatus> keysInfo = new ArrayList<KeyStatus>();
@@ -1488,7 +1456,6 @@
         }
     }
 
-    @RequiresApi(Build.VERSION_CODES.M)
     private class ExpirationUpdateListener implements MediaDrm.OnExpirationUpdateListener {
         @Override
         public void onExpirationUpdate(
@@ -1529,12 +1496,6 @@
             Log.d(TAG, "Key successfully %s for session %s", mIsKeyRelease ? "released" : "added",
                     mSessionId.toHexString());
             onPromiseResolved(mPromiseId);
-
-            if (!mIsKeyRelease && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
-                onSessionKeysChange(mSessionId,
-                        getDummyKeysInfo(MediaDrm.KeyStatus.STATUS_USABLE).toArray(), true,
-                        mIsKeyRelease);
-            }
         }
     }
 
diff --git a/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java b/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java
index 54a8fcd..e15d0ea 100644
--- a/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java
+++ b/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java
@@ -7,7 +7,6 @@
 import android.annotation.SuppressLint;
 import android.media.MediaPlayer;
 import android.net.Uri;
-import android.os.Build;
 import android.os.ParcelFileDescriptor;
 import android.text.TextUtils;
 import android.util.Base64;
@@ -79,8 +78,6 @@
     @SuppressLint("NewApi")
     @CalledByNative
     protected void setPlaybackRate(double speed) {
-        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) return;
-
         try {
             MediaPlayer player = getLocalPlayer();
             player.setPlaybackParams(player.getPlaybackParams().setSpeed((float) speed));
diff --git a/media/base/mac/video_frame_mac.cc b/media/base/mac/video_frame_mac.cc
index 5351847..a0adb8e 100644
--- a/media/base/mac/video_frame_mac.cc
+++ b/media/base/mac/video_frame_mac.cc
@@ -11,6 +11,7 @@
 
 #include "base/logging.h"
 #include "media/base/video_frame.h"
+#include "media/base/video_util.h"
 #include "ui/gfx/gpu_memory_buffer.h"
 #include "ui/gfx/mac/io_surface.h"
 
@@ -34,33 +35,44 @@
 }  // namespace
 
 MEDIA_EXPORT base::ScopedCFTypeRef<CVPixelBufferRef>
-WrapVideoFrameInCVPixelBuffer(const VideoFrame& frame) {
+WrapVideoFrameInCVPixelBuffer(scoped_refptr<VideoFrame> frame) {
   base::ScopedCFTypeRef<CVPixelBufferRef> pixel_buffer;
-
-  // If the frame is backed by a pixel buffer, just return that buffer.
-  if (frame.CvPixelBuffer()) {
-    pixel_buffer.reset(frame.CvPixelBuffer(), base::scoped_policy::RETAIN);
+  if (!frame)
     return pixel_buffer;
-  }
+  const gfx::Rect& visible_rect = frame->visible_rect();
+  bool crop_needed = visible_rect != gfx::Rect(frame->coded_size());
 
-  // If the frame has a GMB, yank out its IOSurface if possible.
-  if (frame.GetGpuMemoryBuffer()) {
-    gfx::GpuMemoryBufferHandle handle =
-        frame.GetGpuMemoryBuffer()->CloneHandle();
-    if (handle.type == gfx::GpuMemoryBufferType::IO_SURFACE_BUFFER) {
-      gfx::ScopedIOSurface io_surface = handle.io_surface;
-      if (io_surface) {
-        const CVReturn cv_return = CVPixelBufferCreateWithIOSurface(
-            nullptr, io_surface, nullptr, pixel_buffer.InitializeInto());
-        if (cv_return == kCVReturnSuccess) {
-          VLOG(3) << "Returning IOSurface-based CVPixelBuffer.";
+  if (!crop_needed) {
+    // If the frame is backed by a pixel buffer, just return that buffer.
+    if (frame->CvPixelBuffer()) {
+      pixel_buffer.reset(frame->CvPixelBuffer(), base::scoped_policy::RETAIN);
+      return pixel_buffer;
+    }
+
+    // If the frame has a GMB, yank out its IOSurface if possible.
+    if (frame->HasGpuMemoryBuffer()) {
+      auto handle = frame->GetGpuMemoryBuffer()->CloneHandle();
+      if (handle.type == gfx::GpuMemoryBufferType::IO_SURFACE_BUFFER) {
+        gfx::ScopedIOSurface io_surface = handle.io_surface;
+        if (io_surface) {
+          CVReturn cv_return = CVPixelBufferCreateWithIOSurface(
+              nullptr, io_surface, nullptr, pixel_buffer.InitializeInto());
+          if (cv_return != kCVReturnSuccess) {
+            DLOG(ERROR) << "CVPixelBufferCreateWithIOSurface failed: "
+                        << cv_return;
+            pixel_buffer.reset();
+          }
           return pixel_buffer;
         }
-        pixel_buffer.reset();
       }
     }
   }
 
+  // If the frame is backed by a GPU buffer, but needs cropping, map it and
+  // and handle like a software frame. There is no memcpy here.
+  if (frame->HasGpuMemoryBuffer())
+    frame = ConvertToMemoryMappedFrame(std::move(frame));
+
   VLOG(3) << "Returning RAM based CVPixelBuffer.";
 
   // VideoFrame only supports YUV formats and most of them are 'YVU' ordered,
@@ -68,7 +80,7 @@
   // represent I420 and NV12 frames. In addition, VideoFrame does not carry
   // colorimetric information, so this function assumes standard video range
   // and ITU Rec 709 primaries.
-  const VideoPixelFormat video_frame_format = frame.format();
+  const VideoPixelFormat video_frame_format = frame->format();
   OSType cv_format;
   if (video_frame_format == PIXEL_FORMAT_I420) {
     cv_format = kCVPixelFormatType_420YpCbCr8Planar;
@@ -81,7 +93,6 @@
 
   int num_planes = VideoFrame::NumPlanes(video_frame_format);
   DCHECK_LE(num_planes, kMaxPlanes);
-  const gfx::Rect& visible_rect = frame.visible_rect();
 
   // Build arrays for each plane's data pointer, dimensions and byte alignment.
   void* plane_ptrs[kMaxPlanes];
@@ -89,12 +100,12 @@
   size_t plane_heights[kMaxPlanes];
   size_t plane_bytes_per_row[kMaxPlanes];
   for (int plane_i = 0; plane_i < num_planes; ++plane_i) {
-    plane_ptrs[plane_i] = const_cast<uint8_t*>(frame.visible_data(plane_i));
+    plane_ptrs[plane_i] = const_cast<uint8_t*>(frame->visible_data(plane_i));
     gfx::Size plane_size =
         VideoFrame::PlaneSize(video_frame_format, plane_i, visible_rect.size());
     plane_widths[plane_i] = plane_size.width();
     plane_heights[plane_i] = plane_size.height();
-    plane_bytes_per_row[plane_i] = frame.stride(plane_i);
+    plane_bytes_per_row[plane_i] = frame->stride(plane_i);
   }
 
   // CVPixelBufferCreateWithPlanarBytes needs a dummy plane descriptor or the
@@ -110,7 +121,7 @@
       kCFAllocatorDefault, visible_rect.width(), visible_rect.height(),
       cv_format, descriptor, 0, num_planes, plane_ptrs, plane_widths,
       plane_heights, plane_bytes_per_row, &CvPixelBufferReleaseCallback,
-      const_cast<VideoFrame*>(&frame), nullptr, pixel_buffer.InitializeInto());
+      frame.get(), nullptr, pixel_buffer.InitializeInto());
   if (result != kCVReturnSuccess) {
     DLOG(ERROR) << " CVPixelBufferCreateWithPlanarBytes failed: " << result;
     return base::ScopedCFTypeRef<CVPixelBufferRef>(nullptr);
@@ -119,7 +130,7 @@
   // The CVPixelBuffer now references the data of the frame, so increment its
   // reference count manually. The release callback set on the pixel buffer will
   // release the frame.
-  frame.AddRef();
+  frame->AddRef();
 
   // Apply required colorimetric attachments.
   CVBufferSetAttachment(pixel_buffer, kCVImageBufferColorPrimariesKey,
diff --git a/media/base/mac/video_frame_mac.h b/media/base/mac/video_frame_mac.h
index 86c770aa..2d316e2 100644
--- a/media/base/mac/video_frame_mac.h
+++ b/media/base/mac/video_frame_mac.h
@@ -8,6 +8,7 @@
 #include <CoreVideo/CVPixelBuffer.h>
 
 #include "base/mac/scoped_cftyperef.h"
+#include "base/memory/ref_counted.h"
 #include "media/base/media_export.h"
 
 namespace media {
@@ -23,7 +24,7 @@
 // (the visible rect's size does not match the coded size) are not supported.
 // If an unsupported frame is specified, null is returned.
 MEDIA_EXPORT base::ScopedCFTypeRef<CVPixelBufferRef>
-WrapVideoFrameInCVPixelBuffer(const VideoFrame& frame);
+WrapVideoFrameInCVPixelBuffer(scoped_refptr<VideoFrame> frame);
 
 }  // namespace media
 
diff --git a/media/base/mac/video_frame_mac_unittests.cc b/media/base/mac/video_frame_mac_unittests.cc
index 986ea0b..8ccb45e1 100644
--- a/media/base/mac/video_frame_mac_unittests.cc
+++ b/media/base/mac/video_frame_mac_unittests.cc
@@ -40,7 +40,7 @@
                                        size, kTimestamp);
   ASSERT_TRUE(frame.get());
 
-  auto pb = WrapVideoFrameInCVPixelBuffer(*frame);
+  auto pb = WrapVideoFrameInCVPixelBuffer(frame);
   ASSERT_TRUE(pb.get());
 
   const gfx::Size coded_size = frame->coded_size();
@@ -77,7 +77,7 @@
     auto frame = VideoFrame::CreateFrame(format_pair.chrome, size,
                                          gfx::Rect(size), size, kTimestamp);
     ASSERT_TRUE(frame.get());
-    auto pb = WrapVideoFrameInCVPixelBuffer(*frame);
+    auto pb = WrapVideoFrameInCVPixelBuffer(frame);
     if (format_pair.corevideo) {
       EXPECT_EQ(format_pair.corevideo, CVPixelBufferGetPixelFormatType(pb));
     } else {
@@ -99,7 +99,7 @@
       base::BindOnce(&Increment, &instances_destroyed));
   ASSERT_TRUE(wrapper_frame.get());
 
-  auto pb = WrapVideoFrameInCVPixelBuffer(*wrapper_frame);
+  auto pb = WrapVideoFrameInCVPixelBuffer(wrapper_frame);
   ASSERT_TRUE(pb.get());
 
   wrapper_frame = nullptr;
@@ -156,7 +156,7 @@
   ASSERT_TRUE(frame.get());
   FillFrameWithPredictableValues(*frame);
 
-  auto pb = WrapVideoFrameInCVPixelBuffer(*frame);
+  auto pb = WrapVideoFrameInCVPixelBuffer(frame);
   ASSERT_TRUE(pb.get());
   EXPECT_EQ(kCVPixelFormatType_420YpCbCr8Planar,
             CVPixelBufferGetPixelFormatType(pb));
diff --git a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
index e4e7653..8d17bcc 100644
--- a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
+++ b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
@@ -31,7 +31,6 @@
 import android.view.Surface;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.RequiresApi;
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
@@ -53,7 +52,6 @@
  * and their capabilities, using android.hardware.camera2.CameraManager.
  **/
 @JNINamespace("media")
-@RequiresApi(Build.VERSION_CODES.M)
 public class VideoCaptureCamera2 extends VideoCapture {
     // Inner class to extend a CameraDevice state change listener.
     private class CrStateListener extends CameraDevice.StateCallback {
diff --git a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureFactory.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureFactory.java
index 3bcd9d2..94448bc 100644
--- a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureFactory.java
+++ b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureFactory.java
@@ -4,12 +4,6 @@
 
 package org.chromium.media;
 
-import android.Manifest;
-import android.content.pm.PackageManager;
-import android.os.Build;
-
-import org.chromium.base.ContextUtils;
-import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 
@@ -30,24 +24,7 @@
 
         private static int getNumberOfCameras() {
             if (sNumberOfSystemCameras == -1) {
-                // getNumberOfCameras() would not fail due to lack of permission, but the
-                // following operations on camera would. "No permission" isn't a fatal
-                // error in WebView, specially for those applications which have no purpose
-                // to use a camera, but "load page" requires it. So, output a warning log
-                // and carry on pretending the system has no camera(s).  This optimization
-                // applies only to pre-M on Android because that is when runtime permissions
-                // were introduced.
-                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M
-                        && ContextUtils.getApplicationContext().getPackageManager().checkPermission(
-                                   Manifest.permission.CAMERA,
-                                   ContextUtils.getApplicationContext().getPackageName())
-                                != PackageManager.PERMISSION_GRANTED) {
-                    sNumberOfSystemCameras = 0;
-                    Log.w(TAG, "Missing android.permission.CAMERA permission, "
-                                    + "no system camera available.");
-                } else {
-                    sNumberOfSystemCameras = VideoCaptureCamera2.getNumberOfCameras();
-                }
+                sNumberOfSystemCameras = VideoCaptureCamera2.getNumberOfCameras();
             }
             return sNumberOfSystemCameras;
         }
diff --git a/media/cast/encoding/h264_vt_encoder.cc b/media/cast/encoding/h264_vt_encoder.cc
index d358997..e64f9c7 100644
--- a/media/cast/encoding/h264_vt_encoder.cc
+++ b/media/cast/encoding/h264_vt_encoder.cc
@@ -377,7 +377,7 @@
   // compression session's pixel buffer pool. This will eliminate a copy of the
   // frame into memory visible by the hardware encoder. The VideoFrame's
   // lifetime is extended for the lifetime of the returned CVPixelBuffer.
-  auto pixel_buffer = media::WrapVideoFrameInCVPixelBuffer(*video_frame);
+  auto pixel_buffer = media::WrapVideoFrameInCVPixelBuffer(video_frame);
   if (!pixel_buffer) {
     DLOG(ERROR) << "WrapVideoFrameInCVPixelBuffer failed.";
     return false;
diff --git a/media/gpu/mac/vt_video_encode_accelerator_mac.cc b/media/gpu/mac/vt_video_encode_accelerator_mac.cc
index ce70829..678971b 100644
--- a/media/gpu/mac/vt_video_encode_accelerator_mac.cc
+++ b/media/gpu/mac/vt_video_encode_accelerator_mac.cc
@@ -307,10 +307,12 @@
   DCHECK(compression_session_);
   DCHECK(frame);
 
-  // TODO(emircan): See if we can eliminate a copy here by using
-  // CVPixelBufferPool for the allocation of incoming VideoFrames.
-  base::ScopedCFTypeRef<CVPixelBufferRef> pixel_buffer =
-      WrapVideoFrameInCVPixelBuffer(*frame);
+  auto pixel_buffer = WrapVideoFrameInCVPixelBuffer(frame);
+  if (!pixel_buffer) {
+    DLOG(ERROR) << "WrapVideoFrameInCVPixelBuffer failed.";
+    NotifyError(kPlatformFailureError);
+    return;
+  }
   base::ScopedCFTypeRef<CFDictionaryRef> frame_props =
       video_toolbox::DictionaryWithKeyValue(
           kVTEncodeFrameOptionKey_ForceKeyFrame,
diff --git a/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java b/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java
index eb0a798..5b911a7 100644
--- a/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java
+++ b/media/midi/java/src/org/chromium/midi/MidiDeviceAndroid.java
@@ -6,9 +6,6 @@
 
 import android.media.midi.MidiDevice;
 import android.media.midi.MidiDeviceInfo;
-import android.os.Build;
-
-import androidx.annotation.RequiresApi;
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
@@ -17,7 +14,6 @@
 /**
  * A class implementing midi::MidiDeviceAndroid functionality.
  */
-@RequiresApi(Build.VERSION_CODES.M)
 class MidiDeviceAndroid {
     /**
      * The underlying device.
diff --git a/media/midi/java/src/org/chromium/midi/MidiInputPortAndroid.java b/media/midi/java/src/org/chromium/midi/MidiInputPortAndroid.java
index df9aafa..017250ee 100644
--- a/media/midi/java/src/org/chromium/midi/MidiInputPortAndroid.java
+++ b/media/midi/java/src/org/chromium/midi/MidiInputPortAndroid.java
@@ -7,9 +7,6 @@
 import android.media.midi.MidiDevice;
 import android.media.midi.MidiOutputPort;
 import android.media.midi.MidiReceiver;
-import android.os.Build;
-
-import androidx.annotation.RequiresApi;
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
@@ -23,7 +20,6 @@
  * A MidiInputPortAndroid provides data to the associated midi::MidiInputPortAndroid object.
  */
 @JNINamespace("midi")
-@RequiresApi(Build.VERSION_CODES.M)
 class MidiInputPortAndroid {
     /**
      * The underlying port.
diff --git a/media/midi/java/src/org/chromium/midi/MidiManagerAndroid.java b/media/midi/java/src/org/chromium/midi/MidiManagerAndroid.java
index aab497d..c9341a2 100644
--- a/media/midi/java/src/org/chromium/midi/MidiManagerAndroid.java
+++ b/media/midi/java/src/org/chromium/midi/MidiManagerAndroid.java
@@ -9,11 +9,8 @@
 import android.media.midi.MidiDevice;
 import android.media.midi.MidiDeviceInfo;
 import android.media.midi.MidiManager;
-import android.os.Build;
 import android.os.Handler;
 
-import androidx.annotation.RequiresApi;
-
 import org.chromium.base.ContextUtils;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
@@ -29,7 +26,6 @@
  * A Java class implementing midi::MidiManagerAndroid functionality.
  */
 @JNINamespace("midi")
-@RequiresApi(Build.VERSION_CODES.M)
 class MidiManagerAndroid {
     /**
      * Set true when this instance is successfully initialized.
diff --git a/media/midi/java/src/org/chromium/midi/MidiOutputPortAndroid.java b/media/midi/java/src/org/chromium/midi/MidiOutputPortAndroid.java
index 33e5e4ae..205c94d 100644
--- a/media/midi/java/src/org/chromium/midi/MidiOutputPortAndroid.java
+++ b/media/midi/java/src/org/chromium/midi/MidiOutputPortAndroid.java
@@ -6,9 +6,6 @@
 
 import android.media.midi.MidiDevice;
 import android.media.midi.MidiInputPort;
-import android.os.Build;
-
-import androidx.annotation.RequiresApi;
 
 import org.chromium.base.Log;
 import org.chromium.base.annotations.CalledByNative;
@@ -22,7 +19,6 @@
 // Note "OutputPort" is named in the Web MIDI manner. It corresponds to MidiInputPort class in the
 // Android API.
 @JNINamespace("midi")
-@RequiresApi(Build.VERSION_CODES.M)
 class MidiOutputPortAndroid {
     /**
      * The underlying port.
diff --git a/mojo/core/embedder/features.cc b/mojo/core/embedder/features.cc
index c9909f6d..ecb53af 100644
--- a/mojo/core/embedder/features.cc
+++ b/mojo/core/embedder/features.cc
@@ -11,8 +11,9 @@
 
 #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_MAC)
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
-const base::Feature kMojoLinuxChannelSharedMem{
-    "MojoLinuxChannelSharedMem", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kMojoLinuxChannelSharedMem,
+             "MojoLinuxChannelSharedMem",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 const base::FeatureParam<int> kMojoLinuxChannelSharedMemPages{
     &kMojoLinuxChannelSharedMem, "MojoLinuxChannelSharedMemPages", 4};
 const base::FeatureParam<bool> kMojoLinuxChannelSharedMemEfdZeroOnWake{
@@ -21,17 +22,20 @@
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
         // BUILDFLAG(IS_ANDROID)
 
-const base::Feature kMojoPosixUseWritev{"MojoPosixUseWritev",
-                                        base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kMojoPosixUseWritev,
+             "MojoPosixUseWritev",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_MAC)
 
-const base::Feature kMojoInlineMessagePayloads{
-    "MojoInlineMessagePayloads", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kMojoInlineMessagePayloads,
+             "MojoInlineMessagePayloads",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kMojoAvoidRandomPipeId{"MojoAvoidRandomPipeId",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kMojoAvoidRandomPipeId,
+             "MojoAvoidRandomPipeId",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kMojoIpcz{"MojoIpcz", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kMojoIpcz, "MojoIpcz", base::FEATURE_DISABLED_BY_DEFAULT);
 
 }  // namespace core
 }  // namespace mojo
diff --git a/mojo/core/embedder/features.h b/mojo/core/embedder/features.h
index e8baabb..79a2ab2c 100644
--- a/mojo/core/embedder/features.h
+++ b/mojo/core/embedder/features.h
@@ -16,7 +16,7 @@
 #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_MAC)
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
 COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES)
-extern const base::Feature kMojoLinuxChannelSharedMem;
+BASE_DECLARE_FEATURE(kMojoLinuxChannelSharedMem);
 
 COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES)
 extern const base::FeatureParam<int> kMojoLinuxChannelSharedMemPages;
@@ -27,18 +27,17 @@
         // BUILDFLAG(IS_ANDROID)
 
 COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES)
-extern const base::Feature kMojoPosixUseWritev;
+BASE_DECLARE_FEATURE(kMojoPosixUseWritev);
 
 #endif  // BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_MAC)
 
 COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES)
-extern const base::Feature kMojoInlineMessagePayloads;
+BASE_DECLARE_FEATURE(kMojoInlineMessagePayloads);
 
 COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES)
-extern const base::Feature kMojoAvoidRandomPipeId;
+BASE_DECLARE_FEATURE(kMojoAvoidRandomPipeId);
 
-COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES)
-extern const base::Feature kMojoIpcz;
+COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES) BASE_DECLARE_FEATURE(kMojoIpcz);
 
 }  // namespace core
 }  // namespace mojo
diff --git a/mojo/public/cpp/bindings/features.cc b/mojo/public/cpp/bindings/features.cc
index 25a77bef..a55687b 100644
--- a/mojo/public/cpp/bindings/features.cc
+++ b/mojo/public/cpp/bindings/features.cc
@@ -19,15 +19,17 @@
 // regress in performance due to high-priority messages seeing increased
 // latency. Ideally we'd address these cases by giving the affected bindings
 // higher-priority TaskRunners.
-const base::Feature kTaskPerMessage{"MojoTaskPerMessage",
-                                    base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kTaskPerMessage,
+             "MojoTaskPerMessage",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables measurement of MessageChannel unread message counts. When enabled, a
 // small random selection of Connectors enable the unread message count quota
 // on their associated message pipe, and record the highest unread message count
 // seen during the Connector's lifetime.
-const base::Feature kMojoRecordUnreadMessageCount{
-    "MojoRecordUnreadMessageCount", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kMojoRecordUnreadMessageCount,
+             "MojoRecordUnreadMessageCount",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 }  // namespace features
 }  // namespace mojo
diff --git a/mojo/public/cpp/bindings/features.h b/mojo/public/cpp/bindings/features.h
index 30a5346..f6839257 100644
--- a/mojo/public/cpp/bindings/features.h
+++ b/mojo/public/cpp/bindings/features.h
@@ -11,11 +11,10 @@
 namespace mojo {
 namespace features {
 
-COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE)
-extern const base::Feature kTaskPerMessage;
+COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE) BASE_DECLARE_FEATURE(kTaskPerMessage);
 
 COMPONENT_EXPORT(MOJO_CPP_BINDINGS_BASE)
-extern const base::Feature kMojoRecordUnreadMessageCount;
+BASE_DECLARE_FEATURE(kMojoRecordUnreadMessageCount);
 
 }  // namespace features
 }  // namespace mojo
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 7b16319..7d6db89 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1060,7 +1060,7 @@
     ":ios_cronet_buildflags",
     ":net_deps",
     "//build:chromeos_buildflags",
-    "//net/data/ssl/ev_roots:gen_ev_root_store_inc",
+    "//net/data/ssl/chrome_root_store:gen_root_store_inc",
     "//net/http:transport_security_state_generated_files",
   ]
 
diff --git a/net/cert/ev_root_ca_metadata.cc b/net/cert/ev_root_ca_metadata.cc
index 01d0baa..1e033952 100644
--- a/net/cert/ev_root_ca_metadata.cc
+++ b/net/cert/ev_root_ca_metadata.cc
@@ -41,7 +41,7 @@
   const base::StringPiece policy_oids[kMaxOIDsPerCA];
 };
 
-#include "net/data/ssl/ev_roots/chrome-ev-root-store-inc.cc"
+#include "net/data/ssl/chrome_root_store/chrome-ev-roots-inc.cc"
 
 #endif  // defined(PLATFORM_USES_CHROMIUM_EV_METADATA)
 }  // namespace
diff --git a/net/cert/internal/system_trust_store_unittest.cc b/net/cert/internal/system_trust_store_unittest.cc
index dc3ba8d8..1a78d1f 100644
--- a/net/cert/internal/system_trust_store_unittest.cc
+++ b/net/cert/internal/system_trust_store_unittest.cc
@@ -19,7 +19,7 @@
 namespace net {
 
 #if BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED)
-#include "net/data/ssl/chrome_root_store/chrome-root-store-test-data-inc.cc"
+#include "net/data/ssl/chrome_root_store/chrome-root-store-test-data-inc.cc"  // nogncheck
 
 TEST(SystemTrustStoreChrome, SystemDistrustOverridesChromeTrust) {
   CertificateList certs = CreateCertificateListFromFile(
diff --git a/net/data/ssl/chrome_root_store/BUILD.gn b/net/data/ssl/chrome_root_store/BUILD.gn
index 1bfe4ed..985b93a3 100644
--- a/net/data/ssl/chrome_root_store/BUILD.gn
+++ b/net/data/ssl/chrome_root_store/BUILD.gn
@@ -11,13 +11,18 @@
     "root_store.certs",
     "root_store.textproto",
   ]
-  outputs = [ "${target_gen_dir}/chrome-root-store-inc.cc" ]
+  outputs = [
+    "${target_gen_dir}/chrome-root-store-inc.cc",
+    "${target_gen_dir}/chrome-ev-roots-inc.cc",
+  ]
   args = [
     "--root-store=" + rebase_path("root_store.textproto", root_build_dir),
     "--certs=" + rebase_path("root_store.certs", root_build_dir),
-    "--write-cpp=" + rebase_path("${target_gen_dir}/chrome-root-store-inc.cc",
-                                 root_build_dir),
-    "--cpp-output-format=root",
+    "--write-cpp-root-store=" +
+        rebase_path("${target_gen_dir}/chrome-root-store-inc.cc",
+                    root_build_dir),
+    "--write-cpp-ev-roots=" +
+        rebase_path("${target_gen_dir}/chrome-ev-roots-inc.cc", root_build_dir),
   ]
 }
 
@@ -32,9 +37,8 @@
   args = [
     "--root-store=" + rebase_path("test_store.textproto", root_build_dir),
     "--certs=" + rebase_path("test_store.certs", root_build_dir),
-    "--write-cpp=" +
+    "--write-cpp-root-store=" +
         rebase_path("${target_gen_dir}/chrome-root-store-test-data-inc.cc",
                     root_build_dir),
-    "--cpp-output-format=root",
   ]
 }
diff --git a/net/data/ssl/ev_roots/BUILD.gn b/net/data/ssl/ev_roots/BUILD.gn
deleted file mode 100644
index c3a9bf41..0000000
--- a/net/data/ssl/ev_roots/BUILD.gn
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2021 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-import("//build/compiled_action.gni")
-
-# Generate C++ include file for the Chrome root store.
-compiled_action("gen_ev_root_store_inc") {
-  tool = "//net/tools/root_store_tool:root_store_tool"
-
-  inputs = [
-    "ev_roots.certs",
-    "ev_roots.textproto",
-  ]
-  outputs = [ "${target_gen_dir}/chrome-ev-root-store-inc.cc" ]
-  args = [
-    "--root-store=" + rebase_path("ev_roots.textproto", root_build_dir),
-    "--certs=" + rebase_path("ev_roots.certs", root_build_dir),
-    "--write-cpp=" +
-        rebase_path("${target_gen_dir}/chrome-ev-root-store-inc.cc",
-                    root_build_dir),
-    "--cpp-output-format=ev",
-  ]
-}
diff --git a/net/data/ssl/ev_roots/ev_roots.certs b/net/data/ssl/ev_roots/ev_roots.certs
deleted file mode 100644
index 16f07d1..0000000
--- a/net/data/ssl/ev_roots/ev_roots.certs
+++ /dev/null
@@ -1,6069 +0,0 @@
-# This file contains certificates referenced by ev_roots.textproto. Although
-# only the PEM files are processed, to aid maintenance, each entry should be
-# prefixed with its SHA-256 hash and kept in the same order as the textproto
-# file.
-
-# 55926084ec963a64b96e2abe01ce0ba86a64fbfebcc7aab5afc155b37fd76066
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 6271844772424770508 (0x570a119742c4e3cc)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=IT, L=Milan, O=Actalis S.p.A./03358520967, CN=Actalis Authentication Root CA
-        Validity
-            Not Before: Sep 22 11:22:02 2011 GMT
-            Not After : Sep 22 11:22:02 2030 GMT
-        Subject: C=IT, L=Milan, O=Actalis S.p.A./03358520967, CN=Actalis Authentication Root CA
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:a7:c6:c4:a5:29:a4:2c:ef:e5:18:c5:b0:50:a3:
-                    6f:51:3b:9f:0a:5a:c9:c2:48:38:0a:c2:1c:a0:18:
-                    7f:91:b5:87:b9:40:3f:dd:1d:68:1f:08:83:d5:2d:
-                    1e:88:a0:f8:8f:56:8f:6d:99:02:92:90:16:d5:5f:
-                    08:6c:89:d7:e1:ac:bc:20:c2:b1:e0:83:51:8a:69:
-                    4d:00:96:5a:6f:2f:c0:44:7e:a3:0e:e4:91:cd:58:
-                    ee:dc:fb:c7:1e:45:47:dd:27:b9:08:01:9f:a6:21:
-                    1d:f5:41:2d:2f:4c:fd:28:ad:e0:8a:ad:22:b4:56:
-                    65:8e:86:54:8f:93:43:29:de:39:46:78:a3:30:23:
-                    ba:cd:f0:7d:13:57:c0:5d:d2:83:6b:48:4c:c4:ab:
-                    9f:80:5a:5b:3a:bd:c9:a7:22:3f:80:27:33:5b:0e:
-                    b7:8a:0c:5d:07:37:08:cb:6c:d2:7a:47:22:44:35:
-                    c5:cc:cc:2e:8e:dd:2a:ed:b7:7d:66:0d:5f:61:51:
-                    22:55:1b:e3:46:e3:e3:3d:d0:35:62:9a:db:af:14:
-                    c8:5b:a1:cc:89:1b:e1:30:26:fc:a0:9b:1f:81:a7:
-                    47:1f:04:eb:a3:39:92:06:9f:99:d3:bf:d3:ea:4f:
-                    50:9c:19:fe:96:87:1e:3c:65:f6:a3:18:24:83:86:
-                    10:e7:54:3e:a8:3a:76:24:4f:81:21:c5:e3:0f:02:
-                    f8:93:94:47:20:bb:fe:d4:0e:d3:68:b9:dd:c4:7a:
-                    84:82:e3:53:54:79:dd:db:9c:d2:f2:07:9b:2e:b6:
-                    bc:3e:ed:85:6d:ef:25:11:f2:97:1a:42:61:f7:4a:
-                    97:e8:8b:b1:10:07:fa:65:81:b2:a2:39:cf:f7:3c:
-                    ff:18:fb:c6:f1:5a:8b:59:e2:02:ac:7b:92:d0:4e:
-                    14:4f:59:45:f6:0c:5e:28:5f:b0:e8:3f:45:cf:cf:
-                    af:9b:6f:fb:84:d3:77:5a:95:6f:ac:94:84:9e:ee:
-                    bc:c0:4a:8f:4a:93:f8:44:21:e2:31:45:61:50:4e:
-                    10:d8:e3:35:7c:4c:19:b4:de:05:bf:a3:06:9f:c8:
-                    b5:cd:e4:1f:d7:17:06:0d:7a:95:74:55:0d:68:1a:
-                    fc:10:1b:62:64:9d:6d:e0:95:a0:c3:94:07:57:0d:
-                    14:e6:bd:05:fb:b8:9f:e6:df:8b:e2:c6:e7:7e:96:
-                    f6:53:c5:80:34:50:28:58:f0:12:50:71:17:30:ba:
-                    e6:78:63:bc:f4:b2:ad:9b:2b:b2:fe:e1:39:8c:5e:
-                    ba:0b:20:94:de:7b:83:b8:ff:e3:56:8d:b7:11:e9:
-                    3b:8c:f2:b1:c1:5d:9d:a4:0b:4c:2b:d9:b2:18:f5:
-                    b5:9f:4b
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                52:D8:88:3A:C8:9F:78:66:ED:89:F3:7B:38:70:94:C9:02:02:36:D0
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Authority Key Identifier: 
-                keyid:52:D8:88:3A:C8:9F:78:66:ED:89:F3:7B:38:70:94:C9:02:02:36:D0
-
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-    Signature Algorithm: sha256WithRSAEncryption
-         0b:7b:72:87:c0:60:a6:49:4c:88:58:e6:1d:88:f7:14:64:48:
-         a6:d8:58:0a:0e:4f:13:35:df:35:1d:d4:ed:06:31:c8:81:3e:
-         6a:d5:dd:3b:1a:32:ee:90:3d:11:d2:2e:f4:8e:c3:63:2e:23:
-         66:b0:67:be:6f:b6:c0:13:39:60:aa:a2:34:25:93:75:52:de:
-         a7:9d:ad:0e:87:89:52:71:6a:16:3c:19:1d:83:f8:9a:29:65:
-         be:f4:3f:9a:d9:f0:f3:5a:87:21:71:80:4d:cb:e0:38:9b:3f:
-         bb:fa:e0:30:4d:cf:86:d3:65:10:19:18:d1:97:02:b1:2b:72:
-         42:68:ac:a0:bd:4e:5a:da:18:bf:6b:98:81:d0:fd:9a:be:5e:
-         15:48:cd:11:15:b9:c0:29:5c:b4:e8:88:f7:3e:36:ae:b7:62:
-         fd:1e:62:de:70:78:10:1c:48:5b:da:bc:a4:38:ba:67:ed:55:
-         3e:5e:57:df:d4:03:40:4c:81:a4:d2:4f:63:a7:09:42:09:14:
-         fc:00:a9:c2:80:73:4f:2e:c0:40:d9:11:7b:48:ea:7a:02:c0:
-         d3:eb:28:01:26:58:74:c1:c0:73:22:6d:93:95:fd:39:7d:bb:
-         2a:e3:f6:82:e3:2c:97:5f:4e:1f:91:94:fa:fe:2c:a3:d8:76:
-         1a:b8:4d:b2:38:4f:9b:fa:1d:48:60:79:26:e2:f3:fd:a9:d0:
-         9a:e8:70:8f:49:7a:d6:e5:bd:0a:0e:db:2d:f3:8d:bf:eb:e3:
-         a4:7d:cb:c7:95:71:e8:da:a3:7c:c5:c2:f8:74:92:04:1b:86:
-         ac:a4:22:53:40:b6:ac:fe:4c:76:cf:fb:94:32:c0:35:9f:76:
-         3f:6e:e5:90:6e:a0:a6:26:a2:b8:2c:be:d1:2b:85:fd:a7:68:
-         c8:ba:01:2b:b1:6c:74:1d:b8:73:95:e7:ee:b7:c7:25:f0:00:
-         4c:00:b2:7e:b6:0b:8b:1c:f3:c0:50:9e:25:b9:e0:08:de:36:
-         66:ff:37:a5:d1:bb:54:64:2c:c9:27:b5:4b:92:7e:65:ff:d3:
-         2d:e1:b9:4e:bc:7f:a4:41:21:90:41:77:a6:39:1f:ea:9e:e3:
-         9f:d0:66:6f:05:ec:aa:76:7e:bf:6b:16:a0:eb:b5:c7:fc:92:
-         54:2f:2b:11:27:25:37:78:4c:51:6a:b0:f3:cc:58:5d:14:f1:
-         6a:48:15:ff:c2:07:b6:b1:8d:0f:8e:5c:50:46:b3:3d:bf:01:
-         98:4f:b2:59:54:47:3e:34:7b:78:6d:56:93:2e:73:ea:66:28:
-         78:cd:1d:14:bf:a0:8f:2f:2e:b8:2e:8e:f2:14:8a:cc:e9:b5:
-         7c:fb:6c:9d:0c:a5:e1:96
------BEGIN CERTIFICATE-----
-MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
-BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
-MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
-IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
-SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
-ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
-UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
-4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
-KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
-gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
-rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
-51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
-be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
-KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
-v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
-fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
-jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
-ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
-ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
-e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
-jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
-WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
-SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
-pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
-X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
-fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
-K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
-ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
-LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
-LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
------END CERTIFICATE-----
-
-# 0376ab1d54c5f9803ce4b2e201a0ee7eef7b57b636e8a93c9b8d4860c96f5fa7
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 8608355977964138876 (0x7777062726a9b17c)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=US, O=AffirmTrust, CN=AffirmTrust Commercial
-        Validity
-            Not Before: Jan 29 14:06:06 2010 GMT
-            Not After : Dec 31 14:06:06 2030 GMT
-        Subject: C=US, O=AffirmTrust, CN=AffirmTrust Commercial
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:f6:1b:4f:67:07:2b:a1:15:f5:06:22:cb:1f:01:
-                    b2:e3:73:45:06:44:49:2c:bb:49:25:14:d6:ce:c3:
-                    b7:ab:2c:4f:c6:41:32:94:57:fa:12:a7:5b:0e:e2:
-                    8f:1f:1e:86:19:a7:aa:b5:2d:b9:5f:0d:8a:c2:af:
-                    85:35:79:32:2d:bb:1c:62:37:f2:b1:5b:4a:3d:ca:
-                    cd:71:5f:e9:42:be:94:e8:c8:de:f9:22:48:64:c6:
-                    e5:ab:c6:2b:6d:ad:05:f0:fa:d5:0b:cf:9a:e5:f0:
-                    50:a4:8b:3b:47:a5:23:5b:7a:7a:f8:33:3f:b8:ef:
-                    99:97:e3:20:c1:d6:28:89:cf:94:fb:b9:45:ed:e3:
-                    40:17:11:d4:74:f0:0b:31:e2:2b:26:6a:9b:4c:57:
-                    ae:ac:20:3e:ba:45:7a:05:f3:bd:9b:69:15:ae:7d:
-                    4e:20:63:c4:35:76:3a:07:02:c9:37:fd:c7:47:ee:
-                    e8:f1:76:1d:73:15:f2:97:a4:b5:c8:7a:79:d9:42:
-                    aa:2b:7f:5c:fe:ce:26:4f:a3:66:81:35:af:44:ba:
-                    54:1e:1c:30:32:65:9d:e6:3c:93:5e:50:4e:7a:e3:
-                    3a:d4:6e:cc:1a:fb:f9:d2:37:ae:24:2a:ab:57:03:
-                    22:28:0d:49:75:7f:b7:28:da:75:bf:8e:e3:dc:0e:
-                    79:31
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                9D:93:C6:53:8B:5E:CA:AF:3F:9F:1E:0F:E5:99:95:BC:24:F6:94:8F
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-    Signature Algorithm: sha256WithRSAEncryption
-         58:ac:f4:04:0e:cd:c0:0d:ff:0a:fd:d4:ba:16:5f:29:bd:7b:
-         68:99:58:49:d2:b4:1d:37:4d:7f:27:7d:46:06:5d:43:c6:86:
-         2e:3e:73:b2:26:7d:4f:93:a9:b6:c4:2a:9a:ab:21:97:14:b1:
-         de:8c:d3:ab:89:15:d8:6b:24:d4:f1:16:ae:d8:a4:5c:d4:7f:
-         51:8e:ed:18:01:b1:93:63:bd:bc:f8:61:80:9a:9e:b1:ce:42:
-         70:e2:a9:7d:06:25:7d:27:a1:fe:6f:ec:b3:1e:24:da:e3:4b:
-         55:1a:00:3b:35:b4:3b:d9:d7:5d:30:fd:81:13:89:f2:c2:06:
-         2b:ed:67:c4:8e:c9:43:b2:5c:6b:15:89:02:bc:62:fc:4e:f2:
-         b5:33:aa:b2:6f:d3:0a:a2:50:e3:f6:3b:e8:2e:44:c2:db:66:
-         38:a9:33:56:48:f1:6d:1b:33:8d:0d:8c:3f:60:37:9d:d3:ca:
-         6d:7e:34:7e:0d:9f:72:76:8b:1b:9f:72:fd:52:35:41:45:02:
-         96:2f:1c:b2:9a:73:49:21:b1:49:47:45:47:b4:ef:6a:34:11:
-         c9:4d:9a:cc:59:b7:d6:02:9e:5a:4e:65:b5:94:ae:1b:df:29:
-         b0:16:f1:bf:00:9e:07:3a:17:64:b5:04:b5:23:21:99:0a:95:
-         3b:97:7c:ef
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
-dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
-cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
-Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
-ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
-MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
-yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
-VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
-nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
-KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
-XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
-vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
-Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
-N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
-nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
------END CERTIFICATE-----
-
-# 0a81ec5a929777f145904af38d5d509f66b5e2c58fcdb531058b0e17f3f0b41b
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 8957382827206547757 (0x7c4f04391cd4992d)
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=US, O=AffirmTrust, CN=AffirmTrust Networking
-        Validity
-            Not Before: Jan 29 14:08:24 2010 GMT
-            Not After : Dec 31 14:08:24 2030 GMT
-        Subject: C=US, O=AffirmTrust, CN=AffirmTrust Networking
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:b4:84:cc:33:17:2e:6b:94:6c:6b:61:52:a0:eb:
-                    a3:cf:79:94:4c:e5:94:80:99:cb:55:64:44:65:8f:
-                    67:64:e2:06:e3:5c:37:49:f6:2f:9b:84:84:1e:2d:
-                    f2:60:9d:30:4e:cc:84:85:e2:2c:cf:1e:9e:fe:36:
-                    ab:33:77:35:44:d8:35:96:1a:3d:36:e8:7a:0e:d8:
-                    d5:47:a1:6a:69:8b:d9:fc:bb:3a:ae:79:5a:d5:f4:
-                    d6:71:bb:9a:90:23:6b:9a:b7:88:74:87:0c:1e:5f:
-                    b9:9e:2d:fa:ab:53:2b:dc:bb:76:3e:93:4c:08:08:
-                    8c:1e:a2:23:1c:d4:6a:ad:22:ba:99:01:2e:6d:65:
-                    cb:be:24:66:55:24:4b:40:44:b1:1b:d7:e1:c2:85:
-                    c0:de:10:3f:3d:ed:b8:fc:f1:f1:23:53:dc:bf:65:
-                    97:6f:d9:f9:40:71:8d:7d:bd:95:d4:ce:be:a0:5e:
-                    27:23:de:fd:a6:d0:26:0e:00:29:eb:3c:46:f0:3d:
-                    60:bf:3f:50:d2:dc:26:41:51:9e:14:37:42:04:a3:
-                    70:57:a8:1b:87:ed:2d:fa:7b:ee:8c:0a:e3:a9:66:
-                    89:19:cb:41:f9:dd:44:36:61:cf:e2:77:46:c8:7d:
-                    f6:f4:92:81:36:fd:db:34:f1:72:7e:f3:0c:16:bd:
-                    b4:15
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                07:1F:D2:E7:9C:DA:C2:6E:A2:40:B4:B0:7A:50:10:50:74:C4:C8:BD
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-    Signature Algorithm: sha1WithRSAEncryption
-         89:57:b2:16:7a:a8:c2:fd:d6:d9:9b:9b:34:c2:9c:b4:32:14:
-         4d:a7:a4:df:ec:be:a7:be:f8:43:db:91:37:ce:b4:32:2e:50:
-         55:1a:35:4e:76:43:71:20:ef:93:77:4e:15:70:2e:87:c3:c1:
-         1d:6d:dc:cb:b5:27:d4:2c:56:d1:52:53:3a:44:d2:73:c8:c4:
-         1b:05:65:5a:62:92:9c:ee:41:8d:31:db:e7:34:ea:59:21:d5:
-         01:7a:d7:64:b8:64:39:cd:c9:ed:af:ed:4b:03:48:a7:a0:99:
-         01:80:dc:65:a3:36:ae:65:59:48:4f:82:4b:c8:65:f1:57:1d:
-         e5:59:2e:0a:3f:6c:d8:d1:f5:e5:09:b4:6c:54:00:0a:e0:15:
-         4d:87:75:6d:b7:58:96:5a:dd:6d:d2:00:a0:f4:9b:48:be:c3:
-         37:a4:ba:36:e0:7c:87:85:97:1a:15:a2:de:2e:a2:5b:bd:af:
-         18:f9:90:50:cd:70:59:f8:27:67:47:cb:c7:a0:07:3a:7d:d1:
-         2c:5d:6c:19:3a:66:b5:7d:fd:91:6f:82:b1:be:08:93:db:14:
-         47:f1:a2:37:c7:45:9e:3c:c7:77:af:64:a8:93:df:f6:69:83:
-         82:60:f2:49:42:34:ed:5a:00:54:85:1c:16:36:92:0c:5c:fa:
-         a6:ad:bf:db
------BEGIN CERTIFICATE-----
-MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
-dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
-MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
-cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
-AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
-YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
-kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
-QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
-6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
-yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
-QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
-KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
-tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
-QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
-Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
-olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
-x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
------END CERTIFICATE-----
-
-# 70a73f7f376b60074248904534b11482d5bf0e698ecc498df52577ebf2e93b9a
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 7893706540734352110 (0x6d8c1446b1a60aee)
-    Signature Algorithm: sha384WithRSAEncryption
-        Issuer: C=US, O=AffirmTrust, CN=AffirmTrust Premium
-        Validity
-            Not Before: Jan 29 14:10:36 2010 GMT
-            Not After : Dec 31 14:10:36 2040 GMT
-        Subject: C=US, O=AffirmTrust, CN=AffirmTrust Premium
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:c4:12:df:a9:5f:fe:41:dd:dd:f5:9f:8a:e3:f6:
-                    ac:e1:3c:78:9a:bc:d8:f0:7f:7a:a0:33:2a:dc:8d:
-                    20:5b:ae:2d:6f:e7:93:d9:36:70:6a:68:cf:8e:51:
-                    a3:85:5b:67:04:a0:10:24:6f:5d:28:82:c1:97:57:
-                    d8:48:29:13:b6:e1:be:91:4d:df:85:0c:53:18:9a:
-                    1e:24:a2:4f:8f:f0:a2:85:0b:cb:f4:29:7f:d2:a4:
-                    58:ee:26:4d:c9:aa:a8:7b:9a:d9:fa:38:de:44:57:
-                    15:e5:f8:8c:c8:d9:48:e2:0d:16:27:1d:1e:c8:83:
-                    85:25:b7:ba:aa:55:41:cc:03:22:4b:2d:91:8d:8b:
-                    e6:89:af:66:c7:e9:ff:2b:e9:3c:ac:da:d2:b3:c3:
-                    e1:68:9c:89:f8:7a:00:56:de:f4:55:95:6c:fb:ba:
-                    64:dd:62:8b:df:0b:77:32:eb:62:cc:26:9a:9b:bb:
-                    aa:62:83:4c:b4:06:7a:30:c8:29:bf:ed:06:4d:97:
-                    b9:1c:c4:31:2b:d5:5f:bc:53:12:17:9c:99:57:29:
-                    66:77:61:21:31:07:2e:25:49:9d:18:f2:ee:f3:2b:
-                    71:8c:b5:ba:39:07:49:77:fc:ef:2e:92:90:05:8d:
-                    2d:2f:77:7b:ef:43:bf:35:bb:9a:d8:f9:73:a7:2c:
-                    f2:d0:57:ee:28:4e:26:5f:8f:90:68:09:2f:b8:f8:
-                    dc:06:e9:2e:9a:3e:51:a7:d1:22:c4:0a:a7:38:48:
-                    6c:b3:f9:ff:7d:ab:86:57:e3:ba:d6:85:78:77:ba:
-                    43:ea:48:7f:f6:d8:be:23:6d:1e:bf:d1:36:6c:58:
-                    5c:f1:ee:a4:19:54:1a:f5:03:d2:76:e6:e1:8c:bd:
-                    3c:b3:d3:48:4b:e2:c8:f8:7f:92:a8:76:46:9c:42:
-                    65:3e:a4:1e:c1:07:03:5a:46:2d:b8:97:f3:b7:d5:
-                    b2:55:21:ef:ba:dc:4c:00:97:fb:14:95:27:33:bf:
-                    e8:43:47:46:d2:08:99:16:60:3b:9a:7e:d2:e6:ed:
-                    38:ea:ec:01:1e:3c:48:56:49:09:c7:4c:37:00:9e:
-                    88:0e:c0:73:e1:6f:66:e9:72:47:30:3e:10:e5:0b:
-                    03:c9:9a:42:00:6c:c5:94:7e:61:c4:8a:df:7f:82:
-                    1a:0b:59:c4:59:32:77:b3:bc:60:69:56:39:fd:b4:
-                    06:7b:2c:d6:64:36:d9:bd:48:ed:84:1f:7e:a5:22:
-                    8f:2a:b8:42:f4:82:b7:d4:53:90:78:4e:2d:1a:fd:
-                    81:6f:44:d7:3b:01:74:96:42:e0:00:e2:2e:6b:ea:
-                    c5:ee:72:ac:bb:bf:fe:ea:aa:a8:f8:dc:f6:b2:79:
-                    8a:b6:67
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                9D:C0:67:A6:0C:22:D9:26:F5:45:AB:A6:65:52:11:27:D8:45:AC:63
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-    Signature Algorithm: sha384WithRSAEncryption
-         b3:57:4d:10:62:4e:3a:e4:ac:ea:b8:1c:af:32:23:c8:b3:49:
-         5a:51:9c:76:28:8d:79:aa:57:46:17:d5:f5:52:f6:b7:44:e8:
-         08:44:bf:18:84:d2:0b:80:cd:c5:12:fd:00:55:05:61:87:41:
-         dc:b5:24:9e:3c:c4:d8:c8:fb:70:9e:2f:78:96:83:20:36:de:
-         7c:0f:69:13:88:a5:75:36:98:08:a6:c6:df:ac:ce:e3:58:d6:
-         b7:3e:de:ba:f3:eb:34:40:d8:a2:81:f5:78:3f:2f:d5:a5:fc:
-         d9:a2:d4:5e:04:0e:17:ad:fe:41:f0:e5:b2:72:fa:44:82:33:
-         42:e8:2d:58:f7:56:8c:62:3f:ba:42:b0:9c:0c:5c:7e:2e:65:
-         26:5c:53:4f:00:b2:78:7e:a1:0d:99:2d:8d:b8:1d:8e:a2:c4:
-         b0:fd:60:d0:30:a4:8e:c8:04:62:a9:c4:ed:35:de:7a:97:ed:
-         0e:38:5e:92:2f:93:70:a5:a9:9c:6f:a7:7d:13:1d:7e:c6:08:
-         48:b1:5e:67:eb:51:08:25:e9:e6:25:6b:52:29:91:9c:d2:39:
-         73:08:57:de:99:06:b4:5b:9d:10:06:e1:c2:00:a8:b8:1c:4a:
-         02:0a:14:d0:c1:41:ca:fb:8c:35:21:7d:82:38:f2:a9:54:91:
-         19:35:93:94:6d:6a:3a:c5:b2:d0:bb:89:86:93:e8:9b:c9:0f:
-         3a:a7:7a:b8:a1:f0:78:46:fa:fc:37:2f:e5:8a:84:f3:df:fe:
-         04:d9:a1:68:a0:2f:24:e2:09:95:06:d5:95:ca:e1:24:96:eb:
-         7c:f6:93:05:bb:ed:73:e9:2d:d1:75:39:d7:e7:24:db:d8:4e:
-         5f:43:8f:9e:d0:14:39:bf:55:70:48:99:57:31:b4:9c:ee:4a:
-         98:03:96:30:1f:60:06:ee:1b:23:fe:81:60:23:1a:47:62:85:
-         a5:cc:19:34:80:6f:b3:ac:1a:e3:9f:f0:7b:48:ad:d5:01:d9:
-         67:b6:a9:72:93:ea:2d:66:b5:b2:b8:e4:3d:3c:b2:ef:4c:8c:
-         ea:eb:07:bf:ab:35:9a:55:86:bc:18:a6:b5:a8:5e:b4:83:6c:
-         6b:69:40:d3:9f:dc:f1:c3:69:6b:b9:e1:6d:09:f4:f1:aa:50:
-         76:0a:7a:7d:7a:17:a1:55:96:42:99:31:09:dd:60:11:8d:05:
-         30:7e:e6:8e:46:d1:9d:14:da:c7:17:e4:05:96:8c:c4:24:b5:
-         1b:cf:14:07:b2:40:f8:a3:9e:41:86:bc:04:d0:6b:96:c8:2a:
-         80:34:fd:bf:ef:06:a3:dd:58:c5:85:3d:3e:8f:fe:9e:29:e0:
-         b6:b8:09:68:19:1c:18:43
------BEGIN CERTIFICATE-----
-MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
-BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
-dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
-A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
-cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
-qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
-JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
-+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
-s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
-HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
-70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
-V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
-qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
-5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
-C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
-OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
-FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
-KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
-Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
-8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
-MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
-0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
-u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
-u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
-YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
-GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
-RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
-KeC2uAloGRwYQw==
------END CERTIFICATE-----
-
-# bd71fdf6da97e4cf62d1647add2581b07d79adf8397eb4ecba9c5e8488821423
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 8401224907861490260 (0x7497258ac73f7a54)
-    Signature Algorithm: ecdsa-with-SHA384
-        Issuer: C=US, O=AffirmTrust, CN=AffirmTrust Premium ECC
-        Validity
-            Not Before: Jan 29 14:20:24 2010 GMT
-            Not After : Dec 31 14:20:24 2040 GMT
-        Subject: C=US, O=AffirmTrust, CN=AffirmTrust Premium ECC
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub: 
-                    04:0d:30:5e:1b:15:9d:03:d0:a1:79:35:b7:3a:3c:
-                    92:7a:ca:15:1c:cd:62:f3:9c:26:5c:07:3d:e5:54:
-                    fa:a3:d6:cc:12:ea:f4:14:5f:e8:8e:19:ab:2f:2e:
-                    48:e6:ac:18:43:78:ac:d0:37:c3:bd:b2:cd:2c:e6:
-                    47:e2:1a:e6:63:b8:3d:2e:2f:78:c4:4f:db:f4:0f:
-                    a4:68:4c:55:72:6b:95:1d:4e:18:42:95:78:cc:37:
-                    3c:91:e2:9b:65:2b:29
-                ASN1 OID: secp384r1
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                9A:AF:29:7A:C0:11:35:35:26:51:30:00:C3:6A:FE:40:D5:AE:D6:3C
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-    Signature Algorithm: ecdsa-with-SHA384
-         30:64:02:30:17:09:f3:87:88:50:5a:af:c8:c0:42:bf:47:5f:
-         f5:6c:6a:86:e0:c4:27:74:e4:38:53:d7:05:7f:1b:34:e3:c6:
-         2f:b3:ca:09:3c:37:9d:d7:e7:b8:46:f1:fd:a1:e2:71:02:30:
-         42:59:87:43:d4:51:df:ba:d3:09:32:5a:ce:88:7e:57:3d:9c:
-         5f:42:6b:f5:07:2d:b5:f0:82:93:f9:59:6f:ae:64:fa:58:e5:
-         8b:1e:e3:63:be:b5:81:cd:6f:02:8c:79
------BEGIN CERTIFICATE-----
-MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
-VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
-cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
-BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
-VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
-0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
-ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
-A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
-aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
-flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
------END CERTIFICATE-----
-
-# 8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            06:6c:9f:cf:99:bf:8c:0a:39:e2:f0:78:8a:43:e6:96:36:5b:ca
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=US, O=Amazon, CN=Amazon Root CA 1
-        Validity
-            Not Before: May 26 00:00:00 2015 GMT
-            Not After : Jan 17 00:00:00 2038 GMT
-        Subject: C=US, O=Amazon, CN=Amazon Root CA 1
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:b2:78:80:71:ca:78:d5:e3:71:af:47:80:50:74:
-                    7d:6e:d8:d7:88:76:f4:99:68:f7:58:21:60:f9:74:
-                    84:01:2f:ac:02:2d:86:d3:a0:43:7a:4e:b2:a4:d0:
-                    36:ba:01:be:8d:db:48:c8:07:17:36:4c:f4:ee:88:
-                    23:c7:3e:eb:37:f5:b5:19:f8:49:68:b0:de:d7:b9:
-                    76:38:1d:61:9e:a4:fe:82:36:a5:e5:4a:56:e4:45:
-                    e1:f9:fd:b4:16:fa:74:da:9c:9b:35:39:2f:fa:b0:
-                    20:50:06:6c:7a:d0:80:b2:a6:f9:af:ec:47:19:8f:
-                    50:38:07:dc:a2:87:39:58:f8:ba:d5:a9:f9:48:67:
-                    30:96:ee:94:78:5e:6f:89:a3:51:c0:30:86:66:a1:
-                    45:66:ba:54:eb:a3:c3:91:f9:48:dc:ff:d1:e8:30:
-                    2d:7d:2d:74:70:35:d7:88:24:f7:9e:c4:59:6e:bb:
-                    73:87:17:f2:32:46:28:b8:43:fa:b7:1d:aa:ca:b4:
-                    f2:9f:24:0e:2d:4b:f7:71:5c:5e:69:ff:ea:95:02:
-                    cb:38:8a:ae:50:38:6f:db:fb:2d:62:1b:c5:c7:1e:
-                    54:e1:77:e0:67:c8:0f:9c:87:23:d6:3f:40:20:7f:
-                    20:80:c4:80:4c:3e:3b:24:26:8e:04:ae:6c:9a:c8:
-                    aa:0d
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                84:18:CC:85:34:EC:BC:0C:94:94:2E:08:59:9C:C7:B2:10:4E:0A:08
-    Signature Algorithm: sha256WithRSAEncryption
-         98:f2:37:5a:41:90:a1:1a:c5:76:51:28:20:36:23:0e:ae:e6:
-         28:bb:aa:f8:94:ae:48:a4:30:7f:1b:fc:24:8d:4b:b4:c8:a1:
-         97:f6:b6:f1:7a:70:c8:53:93:cc:08:28:e3:98:25:cf:23:a4:
-         f9:de:21:d3:7c:85:09:ad:4e:9a:75:3a:c2:0b:6a:89:78:76:
-         44:47:18:65:6c:8d:41:8e:3b:7f:9a:cb:f4:b5:a7:50:d7:05:
-         2c:37:e8:03:4b:ad:e9:61:a0:02:6e:f5:f2:f0:c5:b2:ed:5b:
-         b7:dc:fa:94:5c:77:9e:13:a5:7f:52:ad:95:f2:f8:93:3b:de:
-         8b:5c:5b:ca:5a:52:5b:60:af:14:f7:4b:ef:a3:fb:9f:40:95:
-         6d:31:54:fc:42:d3:c7:46:1f:23:ad:d9:0f:48:70:9a:d9:75:
-         78:71:d1:72:43:34:75:6e:57:59:c2:02:5c:26:60:29:cf:23:
-         19:16:8e:88:43:a5:d4:e4:cb:08:fb:23:11:43:e8:43:29:72:
-         62:a1:a9:5d:5e:08:d4:90:ae:b8:d8:ce:14:c2:d0:55:f2:86:
-         f6:c4:93:43:77:66:61:c0:b9:e8:41:d7:97:78:60:03:6e:4a:
-         72:ae:a5:d1:7d:ba:10:9e:86:6c:1b:8a:b9:59:33:f8:eb:c4:
-         90:be:f1:b9
------BEGIN CERTIFICATE-----
-MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF
-ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
-b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL
-MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
-b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj
-ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM
-9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw
-IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6
-VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L
-93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm
-jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA
-A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI
-U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs
-N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv
-o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU
-5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy
-rqXRfboQnoZsG4q5WTP468SQvvG5
------END CERTIFICATE-----
-
-# 1ba5b2aa8c65401a82960118f80bec4f62304d83cec4713a19c39c011ea46db4
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            06:6c:9f:d2:96:35:86:9f:0a:0f:e5:86:78:f8:5b:26:bb:8a:37
-    Signature Algorithm: sha384WithRSAEncryption
-        Issuer: C=US, O=Amazon, CN=Amazon Root CA 2
-        Validity
-            Not Before: May 26 00:00:00 2015 GMT
-            Not After : May 26 00:00:00 2040 GMT
-        Subject: C=US, O=Amazon, CN=Amazon Root CA 2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:ad:96:9f:2d:9c:4a:4c:4a:81:79:51:99:ec:8a:
-                    cb:6b:60:51:13:bc:4d:6d:06:fc:b0:08:8d:dd:19:
-                    10:6a:c7:26:0c:35:d8:c0:6f:20:84:e9:94:b1:9b:
-                    85:03:c3:5b:db:4a:e8:c8:f8:90:76:d9:5b:4f:e3:
-                    4c:e8:06:36:4d:cc:9a:ac:3d:0c:90:2b:92:d4:06:
-                    19:60:ac:37:44:79:85:81:82:ad:5a:37:e0:0d:cc:
-                    9d:a6:4c:52:76:ea:43:9d:b7:04:d1:50:f6:55:e0:
-                    d5:d2:a6:49:85:e9:37:e9:ca:7e:ae:5c:95:4d:48:
-                    9a:3f:ae:20:5a:6d:88:95:d9:34:b8:52:1a:43:90:
-                    b0:bf:6c:05:b9:b6:78:b7:ea:d0:e4:3a:3c:12:53:
-                    62:ff:4a:f2:7b:be:35:05:a9:12:34:e3:f3:64:74:
-                    62:2c:3d:00:49:5a:28:fe:32:44:bb:87:dd:65:27:
-                    02:71:3b:da:4a:f7:1f:da:cd:f7:21:55:90:4f:0f:
-                    ec:ae:82:e1:9f:6b:d9:45:d3:bb:f0:5f:87:ed:3c:
-                    2c:39:86:da:3f:de:ec:72:55:eb:79:a3:ad:db:dd:
-                    7c:b0:ba:1c:ce:fc:de:4f:35:76:cf:0f:f8:78:1f:
-                    6a:36:51:46:27:61:5b:e9:9e:cf:f0:a2:55:7d:7c:
-                    25:8a:6f:2f:b4:c5:cf:84:2e:2b:fd:0d:51:10:6c:
-                    fb:5f:1b:bc:1b:7e:c5:ae:3b:98:01:31:92:ff:0b:
-                    57:f4:9a:b2:b9:57:e9:ab:ef:0d:76:d1:f0:ee:f4:
-                    ce:86:a7:e0:6e:e9:b4:69:a1:df:69:f6:33:c6:69:
-                    2e:97:13:9e:a5:87:b0:57:10:81:37:c9:53:b3:bb:
-                    7f:f6:92:d1:9c:d0:18:f4:92:6e:da:83:4f:a6:63:
-                    99:4c:a5:fb:5e:ef:21:64:7a:20:5f:6c:64:85:15:
-                    cb:37:e9:62:0c:0b:2a:16:dc:01:2e:32:da:3e:4b:
-                    f5:9e:3a:f6:17:40:94:ef:9e:91:08:86:fa:be:63:
-                    a8:5a:33:ec:cb:74:43:95:f9:6c:69:52:36:c7:29:
-                    6f:fc:55:03:5c:1f:fb:9f:bd:47:eb:e7:49:47:95:
-                    0b:4e:89:22:09:49:e0:f5:61:1e:f1:bf:2e:8a:72:
-                    6e:80:59:ff:57:3a:f9:75:32:a3:4e:5f:ec:ed:28:
-                    62:d9:4d:73:f2:cc:81:17:60:ed:cd:eb:dc:db:a7:
-                    ca:c5:7e:02:bd:f2:54:08:54:fd:b4:2d:09:2c:17:
-                    54:4a:98:d1:54:e1:51:67:08:d2:ed:6e:7e:6f:3f:
-                    d2:2d:81:59:29:66:cb:90:39:95:11:1e:74:27:fe:
-                    dd:eb:af
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                B0:0C:F0:4C:30:F4:05:58:02:48:FD:33:E5:52:AF:4B:84:E3:66:52
-    Signature Algorithm: sha384WithRSAEncryption
-         aa:a8:80:8f:0e:78:a3:e0:a2:d4:cd:e6:f5:98:7a:3b:ea:00:
-         03:b0:97:0e:93:bc:5a:a8:f6:2c:8c:72:87:a9:b1:fc:7f:73:
-         fd:63:71:78:a5:87:59:cf:30:e1:0d:10:b2:13:5a:6d:82:f5:
-         6a:e6:80:9f:a0:05:0b:68:e4:47:6b:c7:6a:df:b6:fd:77:32:
-         72:e5:18:fa:09:f4:a0:93:2c:5d:d2:8c:75:85:76:65:90:0c:
-         03:79:b7:31:23:63:ad:78:83:09:86:68:84:ca:ff:f9:cf:26:
-         9a:92:79:e7:cd:4b:c5:e7:61:a7:17:cb:f3:a9:12:93:93:6b:
-         a7:e8:2f:53:92:c4:60:58:b0:cc:02:51:18:5b:85:8d:62:59:
-         63:b6:ad:b4:de:9a:fb:26:f7:00:27:c0:5d:55:37:74:99:c9:
-         50:7f:e3:59:2e:44:e3:2c:25:ee:ec:4c:32:77:b4:9f:1a:e9:
-         4b:5d:20:c5:da:fd:1c:87:16:c6:43:e8:d4:bb:26:9a:45:70:
-         5e:a9:0b:37:53:e2:46:7b:27:fd:e0:46:f2:89:b7:cc:42:b6:
-         cb:28:26:6e:d9:a5:c9:3a:c8:41:13:60:f7:50:8c:15:ae:b2:
-         6d:1a:15:1a:57:78:e6:92:2a:d9:65:90:82:3f:6c:02:af:ae:
-         12:3a:27:96:36:04:d7:1d:a2:80:63:a9:9b:f1:e5:ba:b4:7c:
-         14:b0:4e:c9:b1:1f:74:5f:38:f6:51:ea:9b:fa:2c:a2:11:d4:
-         a9:2d:27:1a:45:b1:af:b2:4e:71:0d:c0:58:46:d6:69:06:cb:
-         53:cb:b3:fe:6b:41:cd:41:7e:7d:4c:0f:7c:72:79:7a:59:cd:
-         5e:4a:0e:ac:9b:a9:98:73:79:7c:b4:f4:cc:b9:b8:07:0c:b2:
-         74:5c:b8:c7:6f:88:a1:90:a7:f4:aa:f9:bf:67:3a:f4:1a:15:
-         62:1e:b7:9f:be:3d:b1:29:af:67:a1:12:f2:58:10:19:53:03:
-         30:1b:b8:1a:89:f6:9c:bd:97:03:8e:a3:09:f3:1d:8b:21:f1:
-         b4:df:e4:1c:d1:9f:65:02:06:ea:5c:d6:13:b3:84:ef:a2:a5:
-         5c:8c:77:29:a7:68:c0:6b:ae:40:d2:a8:b4:ea:cd:f0:8d:4b:
-         38:9c:19:9a:1b:28:54:b8:89:90:ef:ca:75:81:3e:1e:f2:64:
-         24:c7:18:af:4e:ff:47:9e:07:f6:35:65:a4:d3:0a:56:ff:f5:
-         17:64:6c:ef:a8:22:25:49:93:b6:df:00:17:da:58:7e:5d:ee:
-         c5:1b:b0:d1:d1:5f:21:10:c7:f9:f3:ba:02:0a:27:07:c5:f1:
-         d6:c7:d3:e0:fb:09:60:6c
------BEGIN CERTIFICATE-----
-MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF
-ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6
-b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL
-MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv
-b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK
-gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ
-W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg
-1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K
-8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r
-2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me
-z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR
-8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj
-mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz
-7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6
-+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI
-0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB
-Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm
-UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2
-LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
-+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS
-k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl
-7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm
-btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl
-urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+
-fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63
-n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE
-76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H
-9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT
-4PsJYGw=
------END CERTIFICATE-----
-
-# 18ce6cfe7bf14e60b2e347b8dfe868cb31d02ebb3ada271569f50343b46db3a4
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            06:6c:9f:d5:74:97:36:66:3f:3b:0b:9a:d9:e8:9e:76:03:f2:4a
-    Signature Algorithm: ecdsa-with-SHA256
-        Issuer: C=US, O=Amazon, CN=Amazon Root CA 3
-        Validity
-            Not Before: May 26 00:00:00 2015 GMT
-            Not After : May 26 00:00:00 2040 GMT
-        Subject: C=US, O=Amazon, CN=Amazon Root CA 3
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (256 bit)
-                pub: 
-                    04:29:97:a7:c6:41:7f:c0:0d:9b:e8:01:1b:56:c6:
-                    f2:52:a5:ba:2d:b2:12:e8:d2:2e:d7:fa:c9:c5:d8:
-                    aa:6d:1f:73:81:3b:3b:98:6b:39:7c:33:a5:c5:4e:
-                    86:8e:80:17:68:62:45:57:7d:44:58:1d:b3:37:e5:
-                    67:08:eb:66:de
-                ASN1 OID: prime256v1
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                AB:B6:DB:D7:06:9E:37:AC:30:86:07:91:70:C7:9C:C4:19:B1:78:C0
-    Signature Algorithm: ecdsa-with-SHA256
-         30:46:02:21:00:e0:85:92:a3:17:b7:8d:f9:2b:06:a5:93:ac:
-         1a:98:68:61:72:fa:e1:a1:d0:fb:1c:78:60:a6:43:99:c5:b8:
-         c4:02:21:00:9c:02:ef:f1:94:9c:b3:96:f9:eb:c6:2a:f8:b6:
-         2c:fe:3a:90:14:16:d7:8c:63:24:48:1c:df:30:7d:d5:68:3b
------BEGIN CERTIFICATE-----
-MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5
-MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
-Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
-A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
-Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl
-ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr
-ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr
-BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM
-YyRIHN8wfdVoOw==
------END CERTIFICATE-----
-
-# e35d28419ed02025cfa69038cd623962458da5c695fbdea3c22b0bfb25897092
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            06:6c:9f:d7:c1:bb:10:4c:29:43:e5:71:7b:7b:2c:c8:1a:c1:0e
-    Signature Algorithm: ecdsa-with-SHA384
-        Issuer: C=US, O=Amazon, CN=Amazon Root CA 4
-        Validity
-            Not Before: May 26 00:00:00 2015 GMT
-            Not After : May 26 00:00:00 2040 GMT
-        Subject: C=US, O=Amazon, CN=Amazon Root CA 4
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub: 
-                    04:d2:ab:8a:37:4f:a3:53:0d:fe:c1:8a:7b:4b:a8:
-                    7b:46:4b:63:b0:62:f6:2d:1b:db:08:71:21:d2:00:
-                    e8:63:bd:9a:27:fb:f0:39:6e:5d:ea:3d:a5:c9:81:
-                    aa:a3:5b:20:98:45:5d:16:db:fd:e8:10:6d:e3:9c:
-                    e0:e3:bd:5f:84:62:f3:70:64:33:a0:cb:24:2f:70:
-                    ba:88:a1:2a:a0:75:f8:81:ae:62:06:c4:81:db:39:
-                    6e:29:b0:1e:fa:2e:5c
-                ASN1 OID: secp384r1
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                D3:EC:C7:3A:65:6E:CC:E1:DA:76:9A:56:FB:9C:F3:86:6D:57:E5:81
-    Signature Algorithm: ecdsa-with-SHA384
-         30:65:02:30:3a:8b:21:f1:bd:7e:11:ad:d0:ef:58:96:2f:d6:
-         eb:9d:7e:90:8d:2b:cf:66:55:c3:2c:e3:28:a9:70:0a:47:0e:
-         f0:37:59:12:ff:2d:99:94:28:4e:2a:4f:35:4d:33:5a:02:31:
-         00:ea:75:00:4e:3b:c4:3a:94:12:91:c9:58:46:9d:21:13:72:
-         a7:88:9c:8a:e4:4c:4a:db:96:d4:ac:8b:6b:6b:49:12:53:33:
-         ad:d7:e4:be:24:fc:b5:0a:76:d4:a5:bc:10
------BEGIN CERTIFICATE-----
-MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5
-MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g
-Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG
-A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg
-Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi
-9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk
-M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB
-MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw
-CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW
-1KyLa2tJElMzrdfkviT8tQp21KW8EA==
------END CERTIFICATE-----
-
-# 57de0583efd2b26e0361da99da9df4648def7ee8441c3b728afa9bcde0f9b26a
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 1977337328857672817 (0x1b70e9d2ffae6c71)
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = ES, CN = Autoridad de Certificacion Firmaprofesional CIF A62634068
-        Validity
-            Not Before: Sep 23 15:22:07 2014 GMT
-            Not After : May  5 15:22:07 2036 GMT
-        Subject: C = ES, CN = Autoridad de Certificacion Firmaprofesional CIF A62634068
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:ca:96:6b:8e:ea:f8:fb:f1:a2:35:e0:7f:4c:da:
-                    e0:c3:52:d7:7d:b6:10:c8:02:5e:b3:43:2a:c4:4f:
-                    6a:b2:ca:1c:5d:28:9a:78:11:1a:69:59:57:af:b5:
-                    20:42:e4:8b:0f:e6:df:5b:a6:03:92:2f:f5:11:e4:
-                    62:d7:32:71:38:d9:04:0c:71:ab:3d:51:7e:0f:07:
-                    df:63:05:5c:e9:bf:94:6f:c1:29:82:c0:b4:da:51:
-                    b0:c1:3c:bb:ad:37:4a:5c:ca:f1:4b:36:0e:24:ab:
-                    bf:c3:84:77:fd:a8:50:f4:b1:e7:c6:2f:d2:2d:59:
-                    8d:7a:0a:4e:96:69:52:02:aa:36:98:ec:fc:fa:14:
-                    83:0c:37:1f:c9:92:37:7f:d7:81:2d:e5:c4:b9:e0:
-                    3e:34:fe:67:f4:3e:66:d1:d3:f4:40:cf:5e:62:34:
-                    0f:70:06:3e:20:18:5a:ce:f7:72:1b:25:6c:93:74:
-                    14:93:a3:73:b1:0e:aa:87:10:23:59:5f:20:05:19:
-                    47:ed:68:8e:92:12:ca:5d:fc:d6:2b:b2:92:3c:20:
-                    cf:e1:5f:af:20:be:a0:76:7f:76:e5:ec:1a:86:61:
-                    33:3e:e7:7b:b4:3f:a0:0f:8e:a2:b9:6a:6f:b9:87:
-                    26:6f:41:6c:88:a6:50:fd:6a:63:0b:f5:93:16:1b:
-                    19:8f:b2:ed:9b:9b:c9:90:f5:01:0c:df:19:3d:0f:
-                    3e:38:23:c9:2f:8f:0c:d1:02:fe:1b:55:d6:4e:d0:
-                    8d:3c:af:4f:a4:f3:fe:af:2a:d3:05:9d:79:08:a1:
-                    cb:57:31:b4:9c:c8:90:b2:67:f4:18:16:93:3a:fc:
-                    47:d8:d1:78:96:31:1f:ba:2b:0c:5f:5d:99:ad:63:
-                    89:5a:24:20:76:d8:df:fd:ab:4e:a6:22:aa:9d:5e:
-                    e6:27:8a:7d:68:29:a3:e7:8a:b8:da:11:bb:17:2d:
-                    99:9d:13:24:46:f7:c5:e2:d8:9f:8e:7f:c7:8f:74:
-                    6d:5a:b2:e8:72:f5:ac:ee:24:10:ad:2f:14:da:ff:
-                    2d:9a:46:71:47:be:42:df:bb:01:db:f4:7f:d3:28:
-                    8f:31:59:5b:d3:c9:02:a6:b4:52:ca:6e:97:fb:43:
-                    c5:08:26:6f:8a:f4:bb:fd:9f:28:aa:0d:d5:45:f3:
-                    13:3a:1d:d8:c0:78:8f:41:67:3c:1e:94:64:ae:7b:
-                    0b:c5:e8:d9:01:88:39:1a:97:86:64:41:d5:3b:87:
-                    0c:6e:fa:0f:c6:bd:48:14:bf:39:4d:d4:9e:41:b6:
-                    8f:96:1d:63:96:93:d9:95:06:78:31:68:9e:37:06:
-                    3b:80:89:45:61:39:23:c7:1b:44:a3:15:e5:1c:f8:
-                    92:30:bb
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                65:CD:EB:AB:35:1E:00:3E:7E:D5:74:C0:1C:B4:73:47:0E:1A:64:2F
-            X509v3 Basic Constraints: critical
-                CA:TRUE, pathlen:1
-            X509v3 Certificate Policies: 
-                Policy: X509v3 Any Policy
-                  CPS: http://www.firmaprofesional.com/cps
-                  User Notice:
-                    Explicit Text: 
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-    Signature Algorithm: sha256WithRSAEncryption
-    Signature Value:
-        74:87:28:02:2b:77:1f:66:89:64:ed:8f:74:2e:46:1c:bb:a8:
-        f8:f8:0b:1d:83:b6:3a:a7:e8:45:8a:07:b7:e0:3e:20:cb:e1:
-        08:db:13:08:f8:28:a1:35:b2:80:b3:0b:51:c0:d3:56:9a:8d:
-        33:45:49:af:49:f0:e0:3d:07:7a:45:13:5a:ff:c8:97:d8:d3:
-        18:2c:7d:96:f8:dd:a2:65:43:70:93:90:15:ba:90:df:e8:19:
-        b0:db:2c:8a:60:0f:b7:6f:94:07:1e:1d:a6:c9:85:f6:bd:34:
-        f8:40:78:62:10:70:3a:be:7d:4b:39:81:a9:10:d4:96:41:bb:
-        f8:5f:1c:0b:1d:08:f2:b1:b0:89:7a:f2:f7:a0:e0:c4:8f:8b:
-        78:b5:3b:58:a5:23:8e:4f:55:fe:36:3b:e0:0c:b7:ca:2a:30:
-        41:20:b4:80:cd:ae:fc:76:66:73:a8:ae:6e:e1:7c:da:03:e8:
-        94:20:e6:22:a3:d0:1f:90:5d:20:53:14:26:57:da:54:97:df:
-        16:44:10:01:1e:88:66:8f:72:38:93:dd:20:b7:34:be:d7:f1:
-        ee:63:8e:47:79:28:06:fc:f3:59:45:25:60:22:33:1b:a3:5f:
-        a8:ba:2a:da:1a:3d:cd:40:ea:8c:ee:05:15:95:d5:a5:2c:20:
-        2f:a7:98:28:ee:45:fc:f1:b8:88:00:2c:8f:42:da:51:d5:9c:
-        e5:13:68:71:45:43:8b:9e:0b:21:3c:4b:5c:05:dc:1a:9f:98:
-        8e:da:bd:22:9e:72:cd:ad:0a:cb:cc:a3:67:9b:28:74:c4:9b:
-        d7:1a:3c:04:58:a6:82:9d:ad:c7:7b:6f:ff:80:96:e9:f8:8d:
-        6a:bd:18:90:1d:ff:49:1a:90:52:37:93:2f:3c:02:5d:82:76:
-        0b:51:e7:16:c7:57:f8:38:f9:a7:cd:9b:22:54:ef:63:b0:15:
-        6d:53:65:03:4a:5e:4a:a0:b2:a7:8e:49:00:59:38:d5:c7:f4:
-        80:64:f5:6e:95:50:b8:11:7e:15:70:38:4a:b0:7f:d0:c4:32:
-        70:c0:19:ff:c9:38:2d:14:2c:66:f4:42:44:e6:55:76:1b:80:
-        15:57:ff:c0:a7:a7:aa:39:aa:d8:d3:70:d0:2e:ba:eb:94:6a:
-        fa:5f:34:86:e7:62:b5:fd:8a:f0:30:85:94:c9:af:24:02:2f:
-        6f:d6:dd:67:fe:e3:b0:55:4f:04:98:4f:a4:41:56:e2:93:d0:
-        6a:e8:d6:f3:fb:65:e0:ce:75:c4:31:59:0c:ee:82:c8:0c:60:
-        33:4a:19:ba:84:67:27:0f:bc:42:5d:bd:24:54:0d:ec:1d:70:
-        06:5f:a4:bc:fa:20:7c:55
------BEGIN CERTIFICATE-----
-MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE
-BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
-cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1
-MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
-Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
-MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
-thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
-cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
-L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
-NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
-X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
-m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
-Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
-EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
-KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
-6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
-OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc
-tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd
-IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j
-b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC
-AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw
-ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m
-iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF
-Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ
-hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P
-Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE
-EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV
-1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t
-CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR
-5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw
-f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9
-ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK
-GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV
------END CERTIFICATE-----
-
-# edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 2 (0x2)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=NO, O=Buypass AS-983163327, CN=Buypass Class 3 Root CA
-        Validity
-            Not Before: Oct 26 08:28:58 2010 GMT
-            Not After : Oct 26 08:28:58 2040 GMT
-        Subject: C=NO, O=Buypass AS-983163327, CN=Buypass Class 3 Root CA
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:a5:da:0a:95:16:50:e3:95:f2:5e:9d:76:31:06:
-                    32:7a:9b:f1:10:76:b8:00:9a:b5:52:36:cd:24:47:
-                    b0:9f:18:64:bc:9a:f6:fa:d5:79:d8:90:62:4c:22:
-                    2f:de:38:3d:d6:e0:a8:e9:1c:2c:db:78:11:e9:8e:
-                    68:51:15:72:c7:f3:33:87:e4:a0:5d:0b:5c:e0:57:
-                    07:2a:30:f5:cd:c4:37:77:28:4d:18:91:e6:bf:d5:
-                    52:fd:71:2d:70:3e:e7:c6:c4:8a:e3:f0:28:0b:f4:
-                    76:98:a1:8b:87:55:b2:3a:13:fc:b7:3e:27:37:8e:
-                    22:e3:a8:4f:2a:ef:60:bb:3d:b7:39:c3:0e:01:47:
-                    99:5d:12:4f:db:43:fa:57:a1:ed:f9:9d:be:11:47:
-                    26:5b:13:98:ab:5d:16:8a:b0:37:1c:57:9d:45:ff:
-                    88:96:36:bf:bb:ca:07:7b:6f:87:63:d7:d0:32:6a:
-                    d6:5d:6c:0c:f1:b3:6e:39:e2:6b:31:2e:39:00:27:
-                    14:de:38:c0:ec:19:66:86:12:e8:9d:72:16:13:64:
-                    52:c7:a9:37:1c:fd:82:30:ed:84:18:1d:f4:ae:5c:
-                    ff:70:13:00:eb:b1:f5:33:7a:4b:d6:55:f8:05:8d:
-                    4b:69:b0:f5:b3:28:36:5c:14:c4:51:73:4d:6b:0b:
-                    f1:34:07:db:17:39:d7:dc:28:7b:6b:f5:9f:f3:2e:
-                    c1:4f:17:2a:10:f3:cc:ca:e8:eb:fd:6b:ab:2e:9a:
-                    9f:2d:82:6e:04:d4:52:01:93:2d:3d:86:fc:7e:fc:
-                    df:ef:42:1d:a6:6b:ef:b9:20:c6:f7:bd:a0:a7:95:
-                    fd:a7:e6:89:24:d8:cc:8c:34:6c:e2:23:2f:d9:12:
-                    1a:21:b9:55:91:6f:0b:91:79:19:0c:ad:40:88:0b:
-                    70:e2:7a:d2:0e:d8:68:48:bb:82:13:39:10:58:e9:
-                    d8:2a:07:c6:12:db:58:db:d2:3b:55:10:47:05:15:
-                    67:62:7e:18:63:a6:46:3f:09:0e:54:32:5e:bf:0d:
-                    62:7a:27:ef:80:e8:db:d9:4b:06:5a:37:5a:25:d0:
-                    08:12:77:d4:6f:09:50:97:3d:c8:1d:c3:df:8c:45:
-                    30:56:c6:d3:64:ab:66:f3:c0:5e:96:9c:c3:c4:ef:
-                    c3:7c:6b:8b:3a:79:7f:b3:49:cf:3d:e2:89:9f:a0:
-                    30:4b:85:b9:9c:94:24:79:8f:7d:6b:a9:45:68:0f:
-                    2b:d0:f1:da:1c:cb:69:b8:ca:49:62:6d:c8:d0:63:
-                    62:dd:60:0f:58:aa:8f:a1:bc:05:a5:66:a2:cf:1b:
-                    76:b2:84:64:b1:4c:39:52:c0:30:ba:f0:8c:4b:02:
-                    b0:b6:b7
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                47:B8:CD:FF:E5:6F:EE:F8:B2:EC:2F:4E:0E:F9:25:B0:8E:3C:6B:C3
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-    Signature Algorithm: sha256WithRSAEncryption
-         00:20:23:41:35:04:90:c2:40:62:60:ef:e2:35:4c:d7:3f:ac:
-         e2:34:90:b8:a1:6f:76:fa:16:16:a4:48:37:2c:e9:90:c2:f2:
-         3c:f8:0a:9f:d8:81:e5:bb:5b:da:25:2c:a4:a7:55:71:24:32:
-         f6:c8:0b:f2:bc:6a:f8:93:ac:b2:07:c2:5f:9f:db:cc:c8:8a:
-         aa:be:6a:6f:e1:49:10:cc:31:d7:80:bb:bb:c8:d8:a2:0e:64:
-         57:ea:a2:f5:c2:a9:31:15:d2:20:6a:ec:fc:22:01:28:cf:86:
-         b8:80:1e:a9:cc:11:a5:3c:f2:16:b3:47:9d:fc:d2:80:21:c4:
-         cb:d0:47:70:41:a1:ca:83:19:08:2c:6d:f2:5d:77:9c:8a:14:
-         13:d4:36:1c:92:f0:e5:06:37:dc:a6:e6:90:9b:38:8f:5c:6b:
-         1b:46:86:43:42:5f:3e:01:07:53:54:5d:65:7d:f7:8a:73:a1:
-         9a:54:5a:1f:29:43:14:27:c2:85:0f:b5:88:7b:1a:3b:94:b7:
-         1d:60:a7:b5:9c:e7:29:69:57:5a:9b:93:7a:43:30:1b:03:d7:
-         62:c8:40:a6:aa:fc:64:e4:4a:d7:91:53:01:a8:20:88:6e:9c:
-         5f:44:b9:cb:60:81:34:ec:6f:d3:7d:da:48:5f:eb:b4:90:bc:
-         2d:a9:1c:0b:ac:1c:d5:a2:68:20:80:04:d6:fc:b1:8f:2f:bb:
-         4a:31:0d:4a:86:1c:eb:e2:36:29:26:f5:da:d8:c4:f2:75:61:
-         cf:7e:ae:76:63:4a:7a:40:65:93:87:f8:1e:80:8c:86:e5:86:
-         d6:8f:0e:fc:53:2c:60:e8:16:61:1a:a2:3e:43:7b:cd:39:60:
-         54:6a:f5:f2:89:26:01:68:83:48:a2:33:e8:c9:04:91:b2:11:
-         34:11:3e:ea:d0:43:19:1f:03:93:90:0c:ff:51:3d:57:f4:41:
-         6e:e1:cb:a0:be:eb:c9:63:cd:6d:cc:e4:f8:36:aa:68:9d:ed:
-         bd:5d:97:70:44:0d:b6:0e:35:dc:e1:0c:5d:bb:a0:51:94:cb:
-         7e:16:eb:11:2f:a3:92:45:c8:4c:71:d9:bc:c9:99:52:57:46:
-         2f:50:cf:bd:35:69:f4:3d:15:ce:06:a5:2c:0f:3e:f6:81:ba:
-         94:bb:c3:bb:bf:65:78:d2:86:79:ff:49:3b:1a:83:0c:f0:de:
-         78:ec:c8:f2:4d:4c:1a:de:82:29:f8:c1:5a:da:ed:ee:e6:27:
-         5e:e8:45:d0:9d:1c:51:a8:68:ab:44:e3:d0:8b:6a:e3:f8:3b:
-         bb:dc:4d:d7:64:f2:51:be:e6:aa:ab:5a:e9:31:ee:06:bc:73:
-         bf:13:62:0a:9f:c7:b9:97
------BEGIN CERTIFICATE-----
-MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
-MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
-Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
-TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
-HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
-BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
-ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
-N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
-tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
-0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
-/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
-KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
-zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
-O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
-34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
-K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
-Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
-QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
-cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
-IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
-HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
-O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
-033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
-dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
-kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
-3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
-u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
-4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
------END CERTIFICATE-----
-
-# 657cfe2fa73faa38462571f332a2363a46fce7020951710702cdfbb6eeda3305
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            11:00:34:b6:4e:c6:36:2d:36
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = RO, O = CERTSIGN SA, OU = certSIGN ROOT CA G2
-        Validity
-            Not Before: Feb  6 09:27:35 2017 GMT
-            Not After : Feb  6 09:27:35 2042 GMT
-        Subject: C = RO, O = CERTSIGN SA, OU = certSIGN ROOT CA G2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (4096 bit)
-                Modulus:
-                    00:c0:c5:75:19:91:7d:44:74:74:87:fe:0e:3b:96:
-                    dc:d8:01:16:cc:ee:63:91:e7:0b:6f:ce:3b:0a:69:
-                    1a:7c:c2:e3:af:82:8e:86:d7:5e:8f:57:eb:d3:21:
-                    59:fd:39:37:42:30:be:50:ea:b6:0f:a9:88:d8:2e:
-                    2d:69:21:e7:d1:37:18:4e:7d:91:d5:16:5f:6b:5b:
-                    00:c2:39:43:0d:36:85:52:b9:53:65:0f:1d:42:e5:
-                    8f:cf:05:d3:ee:dc:0c:1a:d9:b8:8b:78:22:67:e4:
-                    69:b0:68:c5:3c:e4:6c:5a:46:e7:cd:c7:fa:ef:c4:
-                    ec:4b:bd:6a:a4:ac:fd:cc:28:51:ef:92:b4:29:ab:
-                    ab:35:9a:4c:e4:c4:08:c6:26:cc:f8:69:9f:e4:9c:
-                    f0:29:d3:5c:f9:c6:16:25:9e:23:c3:20:c1:3d:0f:
-                    3f:38:40:b0:fe:82:44:38:aa:5a:1a:8a:6b:63:58:
-                    38:b4:15:d3:b6:11:69:7b:1e:54:ee:8c:1a:22:ac:
-                    72:97:3f:23:59:9b:c9:22:84:c1:07:4f:cc:7f:e2:
-                    57:ca:12:70:bb:a6:65:f3:69:75:63:bd:95:fb:1b:
-                    97:cd:e4:a8:af:f6:d1:4e:a8:d9:8a:71:24:cd:36:
-                    3d:bc:96:c4:f1:6c:a9:ae:e5:cf:0d:6e:28:0d:b0:
-                    0e:b5:ca:51:7b:78:14:c3:20:2f:7f:fb:14:55:e1:
-                    11:99:fd:d5:0a:a1:9e:02:e3:62:5f:eb:35:4b:2c:
-                    b8:72:e8:3e:3d:4f:ac:2c:bb:2e:86:e2:a3:76:8f:
-                    e5:93:2a:cf:a5:ab:c8:5c:8d:4b:06:ff:12:46:ac:
-                    78:cb:14:07:35:e0:a9:df:8b:e9:af:15:4f:16:89:
-                    5b:bd:f6:8d:c6:59:ae:88:85:0e:c1:89:eb:1f:67:
-                    c5:45:8e:ff:6d:37:36:2b:78:66:83:91:51:2b:3d:
-                    ff:51:77:76:62:a1:ec:67:3e:3e:81:83:e0:56:a9:
-                    50:1f:1f:7a:99:ab:63:bf:84:17:77:f1:0d:3b:df:
-                    f7:9c:61:b3:35:98:8a:3a:b2:ec:3c:1a:37:3f:7e:
-                    8f:92:cf:d9:12:14:64:da:10:02:15:41:ff:4f:c4:
-                    eb:1c:a3:c9:fa:99:f7:46:e9:e1:18:d9:b1:b8:32:
-                    2d:cb:14:0c:50:d8:83:65:83:ee:b9:5c:cf:cb:05:
-                    5a:4c:fa:19:97:6b:d6:5d:13:d3:c2:5c:54:bc:32:
-                    73:a0:78:f5:f1:6d:1e:cb:9f:a5:a6:9f:22:dc:d1:
-                    51:9e:82:79:64:60:29:13:3e:a3:fd:4f:72:6a:ab:
-                    e2:d4:e5:b8:24:55:2c:44:4b:8a:88:44:9c:ca:84:
-                    d3:2a:3b
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                82:21:2D:66:C6:D7:A0:E0:15:EB:CE:4C:09:77:C4:60:9E:54:6E:03
-    Signature Algorithm: sha256WithRSAEncryption
-         60:de:1a:b8:e7:f2:60:82:d5:03:33:81:cb:06:8a:f1:22:49:
-         e9:e8:ea:91:7f:c6:33:5e:68:19:03:86:3b:43:01:cf:07:70:
-         e4:08:1e:65:85:91:e6:11:22:b7:f5:02:23:8e:ae:b9:1e:7d:
-         1f:7e:6c:e6:bd:25:d5:95:1a:f2:05:a6:af:85:02:6f:ae:f8:
-         d6:31:ff:25:c9:4a:c8:c7:8a:a9:d9:9f:4b:49:9b:11:57:99:
-         92:43:11:de:b6:33:a4:cc:d7:8d:64:7d:d4:cd:3c:28:2c:b4:
-         9a:96:ea:4d:f5:c4:44:c4:25:aa:20:80:d8:29:55:f7:e0:41:
-         fc:06:26:ff:b9:36:f5:43:14:03:66:78:e1:11:b1:da:20:5f:
-         46:00:78:00:21:a5:1e:00:28:61:78:6f:a8:01:01:8f:9d:34:
-         9a:ff:f4:38:90:fb:b8:d1:b3:72:06:c9:71:e6:81:c5:79:ed:
-         0b:a6:79:f2:13:0b:9c:f7:5d:0e:7b:24:93:b4:48:db:86:5f:
-         de:50:86:78:e7:40:e6:31:a8:90:76:70:61:af:9c:37:2c:11:
-         b5:82:b7:aa:ae:24:34:5b:72:0c:69:0d:cd:59:9f:f6:71:af:
-         9c:0b:d1:0a:38:f9:06:22:83:53:25:0c:fc:51:c4:e6:be:e2:
-         39:95:0b:24:ad:af:d1:95:e4:96:d7:74:64:6b:71:4e:02:3c:
-         aa:85:f3:20:a3:43:39:76:5b:6c:50:fe:9a:9c:14:1e:65:14:
-         8a:15:bd:a3:82:45:5a:49:56:6a:d2:9c:b1:63:32:e5:61:e0:
-         53:22:0e:a7:0a:49:ea:cb:7e:1f:a8:e2:62:80:f6:10:45:52:
-         98:06:18:de:a5:cd:2f:7f:aa:d4:e9:3e:08:72:ec:23:03:02:
-         3c:a6:aa:d8:bc:67:74:3d:14:17:fb:54:4b:17:e3:d3:79:3d:
-         6d:6b:49:c9:28:0e:2e:74:50:bf:0c:d9:46:3a:10:86:c9:a7:
-         3f:e9:a0:ec:7f:eb:a5:77:58:69:71:e6:83:0a:37:f2:86:49:
-         6a:be:79:08:90:f6:02:16:64:3e:e5:da:4c:7e:0c:34:c9:f9:
-         5f:b6:b3:28:51:a7:a7:2b:aa:49:fa:8d:65:29:4e:e3:6b:13:
-         a7:94:a3:2d:51:6d:78:0c:44:cb:df:de:08:6f:ce:a3:64:ab:
-         d3:95:84:d4:b9:52:54:72:7b:96:25:cc:bc:69:e3:48:6e:0d:
-         d0:c7:9d:27:9a:aa:f8:13:92:dd:1e:df:63:9f:35:a9:16:36:
-         ec:8c:b8:83:f4:3d:89:8f:cd:b4:17:5e:d7:b3:17:41:10:5d:
-         27:73:60:85:57:49:22:07
------BEGIN CERTIFICATE-----
-MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV
-BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g
-Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ
-BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ
-R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF
-dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw
-vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ
-uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp
-n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs
-cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW
-xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P
-rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF
-DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx
-DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy
-LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C
-eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB
-/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ
-d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq
-kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC
-b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl
-qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0
-OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c
-NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk
-ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO
-pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj
-03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk
-PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE
-1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX
-QRBdJ3NghVdJIgc=
------END CERTIFICATE-----
-
-# 5c58468d55f58e497e743982d2b50010b6d165374acf83a7d4a32db768c4408e
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 279744 (0x444c0)
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA
-        Validity
-            Not Before: Oct 22 12:07:37 2008 GMT
-            Not After : Dec 31 12:07:37 2029 GMT
-        Subject: C=PL, O=Unizeto Technologies S.A., OU=Certum Certification Authority, CN=Certum Trusted Network CA
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:e3:fb:7d:a3:72:ba:c2:f0:c9:14:87:f5:6b:01:
-                    4e:e1:6e:40:07:ba:6d:27:5d:7f:f7:5b:2d:b3:5a:
-                    c7:51:5f:ab:a4:32:a6:61:87:b6:6e:0f:86:d2:30:
-                    02:97:f8:d7:69:57:a1:18:39:5d:6a:64:79:c6:01:
-                    59:ac:3c:31:4a:38:7c:d2:04:d2:4b:28:e8:20:5f:
-                    3b:07:a2:cc:4d:73:db:f3:ae:4f:c7:56:d5:5a:a7:
-                    96:89:fa:f3:ab:68:d4:23:86:59:27:cf:09:27:bc:
-                    ac:6e:72:83:1c:30:72:df:e0:a2:e9:d2:e1:74:75:
-                    19:bd:2a:9e:7b:15:54:04:1b:d7:43:39:ad:55:28:
-                    c5:e2:1a:bb:f4:c0:e4:ae:38:49:33:cc:76:85:9f:
-                    39:45:d2:a4:9e:f2:12:8c:51:f8:7c:e4:2d:7f:f5:
-                    ac:5f:eb:16:9f:b1:2d:d1:ba:cc:91:42:77:4c:25:
-                    c9:90:38:6f:db:f0:cc:fb:8e:1e:97:59:3e:d5:60:
-                    4e:e6:05:28:ed:49:79:13:4b:ba:48:db:2f:f9:72:
-                    d3:39:ca:fe:1f:d8:34:72:f5:b4:40:cf:31:01:c3:
-                    ec:de:11:2d:17:5d:1f:b8:50:d1:5e:19:a7:69:de:
-                    07:33:28:ca:50:95:f9:a7:54:cb:54:86:50:45:a9:
-                    f9:49
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                08:76:CD:CB:07:FF:24:F6:C5:CD:ED:BB:90:BC:E2:84:37:46:75:F7
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-    Signature Algorithm: sha1WithRSAEncryption
-         a6:a8:ad:22:ce:01:3d:a6:a3:ff:62:d0:48:9d:8b:5e:72:b0:
-         78:44:e3:dc:1c:af:09:fd:23:48:fa:bd:2a:c4:b9:55:04:b5:
-         10:a3:8d:27:de:0b:82:63:d0:ee:de:0c:37:79:41:5b:22:b2:
-         b0:9a:41:5c:a6:70:e0:d4:d0:77:cb:23:d3:00:e0:6c:56:2f:
-         e1:69:0d:0d:d9:aa:bf:21:81:50:d9:06:a5:a8:ff:95:37:d0:
-         aa:fe:e2:b3:f5:99:2d:45:84:8a:e5:42:09:d7:74:02:2f:f7:
-         89:d8:99:e9:bc:27:d4:47:8d:ba:0d:46:1c:77:cf:14:a4:1c:
-         b9:a4:31:c4:9c:28:74:03:34:ff:33:19:26:a5:e9:0d:74:b7:
-         3e:97:c6:76:e8:27:96:a3:66:dd:e1:ae:f2:41:5b:ca:98:56:
-         83:73:70:e4:86:1a:d2:31:41:ba:2f:be:2d:13:5a:76:6f:4e:
-         e8:4e:81:0e:3f:5b:03:22:a0:12:be:66:58:11:4a:cb:03:c4:
-         b4:2a:2a:2d:96:17:e0:39:54:bc:48:d3:76:27:9d:9a:2d:06:
-         a6:c9:ec:39:d2:ab:db:9f:9a:0b:27:02:35:29:b1:40:95:e7:
-         f9:e8:9c:55:88:19:46:d6:b7:34:f5:7e:ce:39:9a:d9:38:f1:
-         51:f7:4f:2c
------BEGIN CERTIFICATE-----
-MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
-MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
-ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
-cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
-WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
-Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
-IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
-UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
-TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
-BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
-kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
-AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
-sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
-I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
-J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
-VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
-03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
------END CERTIFICATE-----
-
-# 5cc3d78e4e1d5e45547a04e6873e64f90cf9536d1ccc2ef800f355c4c5fd70fd
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 407555286 (0x184accd6)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=CN, O=China Financial Certification Authority, CN=CFCA EV ROOT
-        Validity
-            Not Before: Aug  8 03:07:01 2012 GMT
-            Not After : Dec 31 03:07:01 2029 GMT
-        Subject: C=CN, O=China Financial Certification Authority, CN=CFCA EV ROOT
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:d7:5d:6b:cd:10:3f:1f:05:59:d5:05:4d:37:b1:
-                    0e:ec:98:2b:8e:15:1d:fa:93:4b:17:82:21:71:10:
-                    52:d7:51:64:70:16:c2:55:69:4d:8e:15:6d:9f:bf:
-                    0c:1b:c2:e0:a3:67:d6:0c:ac:cf:22:ae:af:77:54:
-                    2a:4b:4c:8a:53:52:7a:c3:ee:2e:de:b3:71:25:c1:
-                    e9:5d:3d:ee:a1:2f:a3:f7:2a:3c:c9:23:1d:6a:ab:
-                    1d:a1:a7:f1:f3:ec:a0:d5:44:cf:15:cf:72:2f:1d:
-                    63:97:e8:99:f9:fd:93:a4:54:80:4c:52:d4:52:ab:
-                    2e:49:df:90:cd:b8:5f:be:3f:de:a1:ca:4d:20:d4:
-                    25:e8:84:29:53:b7:b1:88:1f:ff:fa:da:90:9f:0a:
-                    a9:2d:41:3f:b1:f1:18:29:ee:16:59:2c:34:49:1a:
-                    a8:06:d7:a8:88:d2:03:72:7a:32:e2:ea:68:4d:6e:
-                    2c:96:65:7b:ca:59:fa:f2:e2:dd:ee:30:2c:fb:cc:
-                    46:ac:c4:63:eb:6f:7f:36:2b:34:73:12:94:7f:df:
-                    cc:26:9e:f1:72:5d:50:65:59:8f:69:b3:87:5e:32:
-                    6f:c3:18:8a:b5:95:8f:b0:7a:37:de:5a:45:3b:c7:
-                    36:e1:ef:67:d1:39:d3:97:5b:73:62:19:48:2d:87:
-                    1c:06:fb:74:98:20:49:73:f0:05:d2:1b:b1:a0:a3:
-                    b7:1b:70:d3:88:69:b9:5a:d6:38:f4:62:dc:25:8b:
-                    78:bf:f8:e8:7e:b8:5c:c9:95:4f:5f:a7:2d:b9:20:
-                    6b:cf:6b:dd:f5:0d:f4:82:b7:f4:b2:66:2e:10:28:
-                    f6:97:5a:7b:96:16:8f:01:19:2d:6c:6e:7f:39:58:
-                    06:64:83:01:83:83:c3:4d:92:dd:32:c6:87:a4:37:
-                    e9:16:ce:aa:2d:68:af:0a:81:65:3a:70:c1:9b:ad:
-                    4d:6d:54:ca:2a:2d:4b:85:1b:b3:80:e6:70:45:0d:
-                    6b:5e:35:f0:7f:3b:b8:9c:e4:04:70:89:12:25:93:
-                    da:0a:99:22:60:6a:63:60:4e:76:06:98:4e:bd:83:
-                    ad:1d:58:8a:25:85:d2:c7:65:1e:2d:8e:c6:df:b6:
-                    c6:e1:7f:8a:04:21:15:29:74:f0:3e:9c:90:9d:0c:
-                    2e:f1:8a:3e:5a:aa:0c:09:1e:c7:d5:3c:a3:ed:97:
-                    c3:1e:34:fa:38:f9:08:0e:e3:c0:5d:2b:83:d1:56:
-                    6a:c9:b6:a8:54:53:2e:78:32:67:3d:82:7f:74:d0:
-                    fb:e1:b6:05:60:b9:70:db:8e:0b:f9:13:58:6f:71:
-                    60:10:52:10:b9:c1:41:09:ef:72:1f:67:31:78:ff:
-                    96:05:8d
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Authority Key Identifier: 
-                keyid:E3:FE:2D:FD:28:D0:0B:B5:BA:B6:A2:C4:BF:06:AA:05:8C:93:FB:2F
-
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                E3:FE:2D:FD:28:D0:0B:B5:BA:B6:A2:C4:BF:06:AA:05:8C:93:FB:2F
-    Signature Algorithm: sha256WithRSAEncryption
-         25:c6:ba:6b:eb:87:cb:de:82:39:96:3d:f0:44:a7:6b:84:73:
-         03:de:9d:2b:4f:ba:20:7f:bc:78:b2:cf:97:b0:1b:9c:f3:d7:
-         79:2e:f5:48:b6:d2:fb:17:88:e6:d3:7a:3f:ed:53:13:d0:e2:
-         2f:6a:79:cb:00:23:28:e6:1e:37:57:35:89:84:c2:76:4f:34:
-         36:ad:67:c3:ce:41:06:88:c5:f7:ee:d8:1a:b8:d6:0b:7f:50:
-         ff:93:aa:17:4b:8c:ec:ed:52:60:b2:a4:06:ea:4e:eb:f4:6b:
-         19:fd:eb:f5:1a:e0:25:2a:9a:dc:c7:41:36:f7:c8:74:05:84:
-         39:95:39:d6:0b:3b:a4:27:fa:08:d8:5c:1e:f8:04:60:52:11:
-         28:28:03:ff:ef:53:66:00:a5:4a:34:16:66:7c:fd:09:a4:ae:
-         9e:67:1a:6f:41:0b:6b:06:13:9b:8f:86:71:05:b4:2f:8d:89:
-         66:33:29:76:54:9a:11:f8:27:fa:b2:3f:91:e0:ce:0d:1b:f3:
-         30:1a:ad:bf:22:5d:1b:d3:bf:25:05:4d:e1:92:1a:7f:99:9f:
-         3c:44:93:ca:d4:40:49:6c:80:87:d7:04:3a:c3:32:52:35:0e:
-         56:f8:a5:dd:7d:c4:8b:0d:11:1f:53:cb:1e:b2:17:b6:68:77:
-         5a:e0:d4:cb:c8:07:ae:f5:3a:2e:8e:37:b7:d0:01:4b:43:29:
-         77:8c:39:97:8f:82:5a:f8:51:e5:89:a0:18:e7:68:7f:5d:0a:
-         2e:fb:a3:47:0e:3d:a6:23:7a:c6:01:c7:8f:c8:5e:bf:6d:80:
-         56:be:8a:24:ba:33:ea:9f:e1:32:11:9e:f1:d2:4f:80:f6:1b:
-         40:af:38:9e:11:50:79:73:12:12:cd:e6:6c:9d:2c:88:72:3c:
-         30:81:06:91:22:ea:59:ad:da:19:2e:22:c2:8d:b9:8c:87:e0:
-         66:bc:73:23:5f:21:64:63:80:48:f5:a0:3c:18:3d:94:c8:48:
-         41:1d:40:ba:5e:fe:fe:56:39:a1:c8:cf:5e:9e:19:64:46:10:
-         da:17:91:b7:05:80:ac:8b:99:92:7d:e7:a2:d8:07:0b:36:27:
-         e7:48:79:60:8a:c3:d7:13:5c:f8:72:40:df:4a:cb:cf:99:00:
-         0a:00:0b:11:95:da:56:45:03:88:0a:9f:67:d0:d5:79:b1:a8:
-         8d:40:6d:0d:c2:7a:40:fa:f3:5f:64:47:92:cb:53:b9:bb:59:
-         ce:4f:fd:d0:15:53:01:d8:df:eb:d9:e6:76:ef:d0:23:bb:3b:
-         a9:79:b3:d5:02:29:cd:89:a3:96:0f:4a:35:e7:4e:42:c0:75:
-         cd:07:cf:e6:2c:eb:7b:2e
------BEGIN CERTIFICATE-----
-MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
-TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
-MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
-aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
-T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
-sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
-TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
-/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
-7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
-EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
-hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
-a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
-aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
-TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
-PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
-cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
-tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
-BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
-ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
-ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
-jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
-ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
-P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
-xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
-Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
-5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
-/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
-AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
-5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
------END CERTIFICATE-----
-
-# 1a0d20445de5ba1862d19ef880858cbce50102b36e8f0a040c3c69e74522fe6e
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            20:a4:c4:7f:dd:df:e1:c7:53:63:07:13:88:77:60:12
-        Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO Certification Authority
-        Validity
-            Not Before: Jan  1 00:00:00 2011 GMT
-            Not After : Dec 31 23:59:59 2030 GMT
-        Subject: C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (2048 bit)
-                Modulus:
-                    00:d0:40:8b:8b:72:e3:91:1b:f7:51:c1:1b:54:04:
-                    98:d3:a9:bf:c1:e6:8a:5d:3b:87:fb:bb:88:ce:0d:
-                    e3:2f:3f:06:96:f0:a2:29:50:99:ae:db:3b:a1:57:
-                    b0:74:51:71:cd:ed:42:91:4d:41:fe:a9:c8:d8:6a:
-                    86:77:44:bb:59:66:97:50:5e:b4:d4:2c:70:44:cf:
-                    da:37:95:42:69:3c:30:c4:71:b3:52:f0:21:4d:a1:
-                    d8:ba:39:7c:1c:9e:a3:24:9d:f2:83:16:98:aa:16:
-                    7c:43:9b:15:5b:b7:ae:34:91:fe:d4:62:26:18:46:
-                    9a:3f:eb:c1:f9:f1:90:57:eb:ac:7a:0d:8b:db:72:
-                    30:6a:66:d5:e0:46:a3:70:dc:68:d9:ff:04:48:89:
-                    77:de:b5:e9:fb:67:6d:41:e9:bc:39:bd:32:d9:62:
-                    02:f1:b1:a8:3d:6e:37:9c:e2:2f:e2:d3:a2:26:8b:
-                    c6:b8:55:43:88:e1:23:3e:a5:d2:24:39:6a:47:ab:
-                    00:d4:a1:b3:a9:25:fe:0d:3f:a7:1d:ba:d3:51:c1:
-                    0b:a4:da:ac:38:ef:55:50:24:05:65:46:93:34:4f:
-                    2d:8d:ad:c6:d4:21:19:d2:8e:ca:05:61:71:07:73:
-                    47:e5:8a:19:12:bd:04:4d:ce:4e:9c:a5:48:ac:bb:
-                    26:f7
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                0B:58:E5:8B:C6:4C:15:37:A4:40:A9:30:A9:21:BE:47:36:5A:56:FF
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-    Signature Algorithm: sha1WithRSAEncryption
-         2f:c9:c4:1c:07:3b:cf:61:02:00:b1:d9:21:51:75:72:03:30:
-         b0:c4:16:1f:6c:00:8b:10:ac:af:f1:47:d4:ae:10:3c:0c:1a:
-         f8:d4:93:6c:ac:10:37:7c:b7:a6:83:64:ad:cd:df:0e:87:33:
-         9d:37:b0:c6:7b:38:72:b1:f3:1a:0e:a3:f9:55:7a:6d:03:66:
-         03:17:95:4a:f1:b1:7a:df:56:21:06:42:8f:b1:d3:a8:85:de:
-         ee:97:1d:62:eb:a7:e7:31:12:66:c3:0f:a6:4b:2e:41:82:f7:
-         fd:c9:1b:a8:1b:af:ee:3c:ce:e3:9c:ae:28:07:a1:2c:9b:24:
-         c2:0f:23:26:83:32:8b:86:0f:1f:2b:12:46:25:16:8f:76:90:
-         03:6b:de:bc:aa:22:68:6b:8c:a1:ac:2b:11:39:a6:db:70:c2:
-         7d:72:e9:33:e7:fc:26:f1:74:5a:91:e6:9d:84:ac:f8:a8:06:
-         19:46:e6:a7:e9:aa:34:22:a4:a1:9f:7a:ad:b7:b2:a4:9a:33:
-         88:71:02:3c:2e:d6:7a:b2:1f:a2:ca:c0:dd:2f:10:94:fd:b3:
-         8c:84:20:79:46:d5:05:d4:10:e4:d2:db:64:4f:b8:5b:ee:1b:
-         c5:20:47:5b:94:ab:6e:d4:95:33:1d:a6:15:71:f1:f8:94:ca:
-         54:39:3e:c1
------BEGIN CERTIFICATE-----
-MIID0DCCArigAwIBAgIQIKTEf93f4cdTYwcTiHdgEjANBgkqhkiG9w0BAQUFADCB
-gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
-BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTAxMDEwMDAw
-MDBaFw0zMDEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
-YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
-RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
-UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
-2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
-Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
-+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
-DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
-nKVIrLsm9wIDAQABo0IwQDAdBgNVHQ4EFgQUC1jli8ZMFTekQKkwqSG+RzZaVv8w
-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
-ggEBAC/JxBwHO89hAgCx2SFRdXIDMLDEFh9sAIsQrK/xR9SuEDwMGvjUk2ysEDd8
-t6aDZK3N3w6HM503sMZ7OHKx8xoOo/lVem0DZgMXlUrxsXrfViEGQo+x06iF3u6X
-HWLrp+cxEmbDD6ZLLkGC9/3JG6gbr+48zuOcrigHoSybJMIPIyaDMouGDx8rEkYl
-Fo92kANr3ryqImhrjKGsKxE5pttwwn1y6TPn/CbxdFqR5p2ErPioBhlG5qfpqjQi
-pKGfeq23sqSaM4hxAjwu1nqyH6LKwN0vEJT9s4yEIHlG1QXUEOTS22RPuFvuG8Ug
-R1uUq27UlTMdphVx8fiUylQ5PsE=
------END CERTIFICATE-----
-
-# 1793927a0614549789adce2f8f34f7f0b66d0f3ae3a3b84d21ec15dbba4fadc7
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            1f:47:af:aa:62:00:70:50:54:4c:01:9e:9b:63:99:2a
-    Signature Algorithm: ecdsa-with-SHA384
-        Issuer: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO ECC Certification Authority
-        Validity
-            Not Before: Mar  6 00:00:00 2008 GMT
-            Not After : Jan 18 23:59:59 2038 GMT
-        Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO ECC Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub: 
-                    04:03:47:7b:2f:75:c9:82:15:85:fb:75:e4:91:16:
-                    d4:ab:62:99:f5:3e:52:0b:06:ce:41:00:7f:97:e1:
-                    0a:24:3c:1d:01:04:ee:3d:d2:8d:09:97:0c:e0:75:
-                    e4:fa:fb:77:8a:2a:f5:03:60:4b:36:8b:16:23:16:
-                    ad:09:71:f4:4a:f4:28:50:b4:fe:88:1c:6e:3f:6c:
-                    2f:2f:09:59:5b:a5:5b:0b:33:99:e2:c3:3d:89:f9:
-                    6a:2c:ef:b2:d3:06:e9
-                ASN1 OID: secp384r1
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                75:71:A7:19:48:19:BC:9D:9D:EA:41:47:DF:94:C4:48:77:99:D3:79
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-    Signature Algorithm: ecdsa-with-SHA384
-         30:65:02:31:00:ef:03:5b:7a:ac:b7:78:0a:72:b7:88:df:ff:
-         b5:46:14:09:0a:fa:a0:e6:7d:08:c6:1a:87:bd:18:a8:73:bd:
-         26:ca:60:0c:9d:ce:99:9f:cf:5c:0f:30:e1:be:14:31:ea:02:
-         30:14:f4:93:3c:49:a7:33:7a:90:46:47:b3:63:7d:13:9b:4e:
-         b7:6f:18:37:80:53:fe:dd:20:e0:35:9a:36:d1:c7:01:b9:e6:
-         dc:dd:f3:ff:1d:2c:3a:16:57:d9:92:39:d6
------BEGIN CERTIFICATE-----
-MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
-MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
-BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
-IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
-MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
-ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
-T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
-biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
-FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
-cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
-BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
-BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
-fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
-GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
------END CERTIFICATE-----
-
-# 52f0e1c4e58ec629291b60317f074671b85d7ea80d5b07273463534b32b40234
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            4c:aa:f9:ca:db:63:6f:e0:1f:f7:4e:d8:5b:03:86:9d
-    Signature Algorithm: sha384WithRSAEncryption
-        Issuer: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO RSA Certification Authority
-        Validity
-            Not Before: Jan 19 00:00:00 2010 GMT
-            Not After : Jan 18 23:59:59 2038 GMT
-        Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=COMODO RSA Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:91:e8:54:92:d2:0a:56:b1:ac:0d:24:dd:c5:cf:
-                    44:67:74:99:2b:37:a3:7d:23:70:00:71:bc:53:df:
-                    c4:fa:2a:12:8f:4b:7f:10:56:bd:9f:70:72:b7:61:
-                    7f:c9:4b:0f:17:a7:3d:e3:b0:04:61:ee:ff:11:97:
-                    c7:f4:86:3e:0a:fa:3e:5c:f9:93:e6:34:7a:d9:14:
-                    6b:e7:9c:b3:85:a0:82:7a:76:af:71:90:d7:ec:fd:
-                    0d:fa:9c:6c:fa:df:b0:82:f4:14:7e:f9:be:c4:a6:
-                    2f:4f:7f:99:7f:b5:fc:67:43:72:bd:0c:00:d6:89:
-                    eb:6b:2c:d3:ed:8f:98:1c:14:ab:7e:e5:e3:6e:fc:
-                    d8:a8:e4:92:24:da:43:6b:62:b8:55:fd:ea:c1:bc:
-                    6c:b6:8b:f3:0e:8d:9a:e4:9b:6c:69:99:f8:78:48:
-                    30:45:d5:ad:e1:0d:3c:45:60:fc:32:96:51:27:bc:
-                    67:c3:ca:2e:b6:6b:ea:46:c7:c7:20:a0:b1:1f:65:
-                    de:48:08:ba:a4:4e:a9:f2:83:46:37:84:eb:e8:cc:
-                    81:48:43:67:4e:72:2a:9b:5c:bd:4c:1b:28:8a:5c:
-                    22:7b:b4:ab:98:d9:ee:e0:51:83:c3:09:46:4e:6d:
-                    3e:99:fa:95:17:da:7c:33:57:41:3c:8d:51:ed:0b:
-                    b6:5c:af:2c:63:1a:df:57:c8:3f:bc:e9:5d:c4:9b:
-                    af:45:99:e2:a3:5a:24:b4:ba:a9:56:3d:cf:6f:aa:
-                    ff:49:58:be:f0:a8:ff:f4:b8:ad:e9:37:fb:ba:b8:
-                    f4:0b:3a:f9:e8:43:42:1e:89:d8:84:cb:13:f1:d9:
-                    bb:e1:89:60:b8:8c:28:56:ac:14:1d:9c:0a:e7:71:
-                    eb:cf:0e:dd:3d:a9:96:a1:48:bd:3c:f7:af:b5:0d:
-                    22:4c:c0:11:81:ec:56:3b:f6:d3:a2:e2:5b:b7:b2:
-                    04:22:52:95:80:93:69:e8:8e:4c:65:f1:91:03:2d:
-                    70:74:02:ea:8b:67:15:29:69:52:02:bb:d7:df:50:
-                    6a:55:46:bf:a0:a3:28:61:7f:70:d0:c3:a2:aa:2c:
-                    21:aa:47:ce:28:9c:06:45:76:bf:82:18:27:b4:d5:
-                    ae:b4:cb:50:e6:6b:f4:4c:86:71:30:e9:a6:df:16:
-                    86:e0:d8:ff:40:dd:fb:d0:42:88:7f:a3:33:3a:2e:
-                    5c:1e:41:11:81:63:ce:18:71:6b:2b:ec:a6:8a:b7:
-                    31:5c:3a:6a:47:e0:c3:79:59:d6:20:1a:af:f2:6a:
-                    98:aa:72:bc:57:4a:d2:4b:9d:bb:10:fc:b0:4c:41:
-                    e5:ed:1d:3d:5e:28:9d:9c:cc:bf:b3:51:da:a7:47:
-                    e5:84:53
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                BB:AF:7E:02:3D:FA:A6:F1:3C:84:8E:AD:EE:38:98:EC:D9:32:32:D4
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-    Signature Algorithm: sha384WithRSAEncryption
-         0a:f1:d5:46:84:b7:ae:51:bb:6c:b2:4d:41:14:00:93:4c:9c:
-         cb:e5:c0:54:cf:a0:25:8e:02:f9:fd:b0:a2:0d:f5:20:98:3c:
-         13:2d:ac:56:a2:b0:d6:7e:11:92:e9:2e:ba:9e:2e:9a:72:b1:
-         bd:19:44:6c:61:35:a2:9a:b4:16:12:69:5a:8c:e1:d7:3e:a4:
-         1a:e8:2f:03:f4:ae:61:1d:10:1b:2a:a4:8b:7a:c5:fe:05:a6:
-         e1:c0:d6:c8:fe:9e:ae:8f:2b:ba:3d:99:f8:d8:73:09:58:46:
-         6e:a6:9c:f4:d7:27:d3:95:da:37:83:72:1c:d3:73:e0:a2:47:
-         99:03:38:5d:d5:49:79:00:29:1c:c7:ec:9b:20:1c:07:24:69:
-         57:78:b2:39:fc:3a:84:a0:b5:9c:7c:8d:bf:2e:93:62:27:b7:
-         39:da:17:18:ae:bd:3c:09:68:ff:84:9b:3c:d5:d6:0b:03:e3:
-         57:9e:14:f7:d1:eb:4f:c8:bd:87:23:b7:b6:49:43:79:85:5c:
-         ba:eb:92:0b:a1:c6:e8:68:a8:4c:16:b1:1a:99:0a:e8:53:2c:
-         92:bb:a1:09:18:75:0c:65:a8:7b:cb:23:b7:1a:c2:28:85:c3:
-         1b:ff:d0:2b:62:ef:a4:7b:09:91:98:67:8c:14:01:cd:68:06:
-         6a:63:21:75:03:80:88:8a:6e:81:c6:85:f2:a9:a4:2d:e7:f4:
-         a5:24:10:47:83:ca:cd:f4:8d:79:58:b1:06:9b:e7:1a:2a:d9:
-         9d:01:d7:94:7d:ed:03:4a:ca:f0:db:e8:a9:01:3e:f5:56:99:
-         c9:1e:8e:49:3d:bb:e5:09:b9:e0:4f:49:92:3d:16:82:40:cc:
-         cc:59:c6:e6:3a:ed:12:2e:69:3c:6c:95:b1:fd:aa:1d:7b:7f:
-         86:be:1e:0e:32:46:fb:fb:13:8f:75:7f:4c:8b:4b:46:63:fe:
-         00:34:40:70:c1:c3:b9:a1:dd:a6:70:e2:04:b3:41:bc:e9:80:
-         91:ea:64:9c:7a:e1:22:03:a9:9c:6e:6f:0e:65:4f:6c:87:87:
-         5e:f3:6e:a0:f9:75:a5:9b:40:e8:53:b2:27:9d:4a:b9:c0:77:
-         21:8d:ff:87:f2:de:bc:8c:ef:17:df:b7:49:0b:d1:f2:6e:30:
-         0b:1a:0e:4e:76:ed:11:fc:f5:e9:56:b2:7d:bf:c7:6d:0a:93:
-         8c:a5:d0:c0:b6:1d:be:3a:4e:94:a2:d7:6e:6c:0b:c2:8a:7c:
-         fa:20:f3:c4:e4:e5:cd:0d:a8:cb:91:92:b1:7c:85:ec:b5:14:
-         69:66:0e:82:e7:cd:ce:c8:2d:a6:51:7f:21:c1:35:53:85:06:
-         4a:5d:9f:ad:bb:1b:5f:74
------BEGIN CERTIFICATE-----
-MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB
-hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
-A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV
-BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5
-MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
-EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
-Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR
-6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X
-pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC
-9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV
-/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf
-Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z
-+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w
-qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah
-SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC
-u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf
-Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq
-crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
-FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB
-/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl
-wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM
-4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV
-2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna
-FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ
-CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK
-boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke
-jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL
-S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb
-QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl
-0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB
-NVOFBkpdn627G190
------END CERTIFICATE-----
-
-# 7d05ebb682339f8c9451ee094eebfefa7953a114edb2f44949452fab7d2fc185
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            0b:93:1c:3a:d6:39:67:ea:67:23:bf:c3:af:9a:f4:4b
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Assured ID Root G2
-        Validity
-            Not Before: Aug  1 12:00:00 2013 GMT
-            Not After : Jan 15 12:00:00 2038 GMT
-        Subject: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Assured ID Root G2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (2048 bit)
-                Modulus:
-                    00:d9:e7:28:2f:52:3f:36:72:49:88:93:34:f3:f8:
-                    6a:1e:31:54:80:9f:ad:54:41:b5:47:df:96:a8:d4:
-                    af:80:2d:b9:0a:cf:75:fd:89:a5:7d:24:fa:e3:22:
-                    0c:2b:bc:95:17:0b:33:bf:19:4d:41:06:90:00:bd:
-                    0c:4d:10:fe:07:b5:e7:1c:6e:22:55:31:65:97:bd:
-                    d3:17:d2:1e:62:f3:db:ea:6c:50:8c:3f:84:0c:96:
-                    cf:b7:cb:03:e0:ca:6d:a1:14:4c:1b:89:dd:ed:00:
-                    b0:52:7c:af:91:6c:b1:38:13:d1:e9:12:08:c0:00:
-                    b0:1c:2b:11:da:77:70:36:9b:ae:ce:79:87:dc:82:
-                    70:e6:09:74:70:55:69:af:a3:68:9f:bf:dd:b6:79:
-                    b3:f2:9d:70:29:55:f4:ab:ff:95:61:f3:c9:40:6f:
-                    1d:d1:be:93:bb:d3:88:2a:bb:9d:bf:72:5a:56:71:
-                    3b:3f:d4:f3:d1:0a:fe:28:ef:a3:ee:d9:99:af:03:
-                    d3:8f:60:b7:f2:92:a1:b1:bd:89:89:1f:30:cd:c3:
-                    a6:2e:62:33:ae:16:02:77:44:5a:e7:81:0a:3c:a7:
-                    44:2e:79:b8:3f:04:bc:5c:a0:87:e1:1b:af:51:8e:
-                    cd:ec:2c:fa:f8:fe:6d:f0:3a:7c:aa:8b:e4:67:95:
-                    31:8d
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                CE:C3:4A:B9:99:55:F2:B8:DB:60:BF:A9:7E:BD:56:B5:97:36:A7:D6
-    Signature Algorithm: sha256WithRSAEncryption
-         ca:a5:55:8c:e3:c8:41:6e:69:27:a7:75:11:ef:3c:86:36:6f:
-         d2:9d:c6:78:38:1d:69:96:a2:92:69:2e:38:6c:9b:7d:04:d4:
-         89:a5:b1:31:37:8a:c9:21:cc:ab:6c:cd:8b:1c:9a:d6:bf:48:
-         d2:32:66:c1:8a:c0:f3:2f:3a:ef:c0:e3:d4:91:86:d1:50:e3:
-         03:db:73:77:6f:4a:39:53:ed:de:26:c7:b5:7d:af:2b:42:d1:
-         75:62:e3:4a:2b:02:c7:50:4b:e0:69:e2:96:6c:0e:44:66:10:
-         44:8f:ad:05:eb:f8:79:ac:a6:1b:e8:37:34:9d:53:c9:61:aa:
-         a2:52:af:4a:70:16:86:c2:3a:c8:b1:13:70:36:d8:cf:ee:f4:
-         0a:34:d5:5b:4c:fd:07:9c:a2:ba:d9:01:72:5c:f3:4d:c1:dd:
-         0e:b1:1c:0d:c4:63:be:ad:f4:14:fb:89:ec:a2:41:0e:4c:cc:
-         c8:57:40:d0:6e:03:aa:cd:0c:8e:89:99:99:6c:f0:3c:30:af:
-         38:df:6f:bc:a3:be:29:20:27:ab:74:ff:13:22:78:de:97:52:
-         55:1e:83:b5:54:20:03:ee:ae:c0:4f:56:de:37:cc:c3:7f:aa:
-         04:27:bb:d3:77:b8:62:db:17:7c:9c:28:22:13:73:6c:cf:26:
-         f5:8a:29:e7
------BEGIN CERTIFICATE-----
-MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
-b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG
-EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
-cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi
-MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA
-n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc
-biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp
-EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA
-bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu
-YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB
-AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW
-BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI
-QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I
-0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni
-lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9
-B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv
-ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
-IhNzbM8m9Yop5w==
------END CERTIFICATE-----
-
-# 7e37cb8b4c47090cab36551ba6f45db840680fba166a952db100717f43053fc2
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            0b:a1:5a:fa:1d:df:a0:b5:49:44:af:cd:24:a0:6c:ec
-        Signature Algorithm: ecdsa-with-SHA384
-        Issuer: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Assured ID Root G3
-        Validity
-            Not Before: Aug  1 12:00:00 2013 GMT
-            Not After : Jan 15 12:00:00 2038 GMT
-        Subject: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Assured ID Root G3
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub:
-                    04:19:e7:bc:ac:44:65:ed:cd:b8:3f:58:fb:8d:b1:
-                    57:a9:44:2d:05:15:f2:ef:0b:ff:10:74:9f:b5:62:
-                    52:5f:66:7e:1f:e5:dc:1b:45:79:0b:cc:c6:53:0a:
-                    9d:8d:5d:02:d9:a9:59:de:02:5a:f6:95:2a:0e:8d:
-                    38:4a:8a:49:c6:bc:c6:03:38:07:5f:55:da:7e:09:
-                    6e:e2:7f:5e:d0:45:20:0f:59:76:10:d6:a0:24:f0:
-                    2d:de:36:f2:6c:29:39
-                ASN1 OID: secp384r1
-                NIST CURVE: P-384
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                CB:D0:BD:A9:E1:98:05:51:A1:4D:37:A2:83:79:CE:8D:1D:2A:E4:84
-    Signature Algorithm: ecdsa-with-SHA384
-         30:64:02:30:25:a4:81:45:02:6b:12:4b:75:74:4f:c8:23:e3:
-         70:f2:75:72:de:7c:89:f0:cf:91:72:61:9e:5e:10:92:59:56:
-         b9:83:c7:10:e7:38:e9:58:26:36:7d:d5:e4:34:86:39:02:30:
-         7c:36:53:f0:30:e5:62:63:3a:99:e2:b6:a3:3b:9b:34:fa:1e:
-         da:10:92:71:5e:91:13:a7:dd:a4:6e:92:cc:32:d6:f5:21:66:
-         c7:2f:ea:96:63:6a:65:45:92:95:01:b4
------BEGIN CERTIFICATE-----
-MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw
-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
-ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg
-RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV
-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
-Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq
-hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf
-Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q
-RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
-BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD
-AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY
-JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv
-6pZjamVFkpUBtA==
------END CERTIFICATE-----
-
-# cb3ccbb76031e5e0138f8dd39a23f9de47ffc35e43c1144cea27d46a5ab1cb5f
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            03:3a:f1:e6:a7:11:a9:a0:bb:28:64:b1:1d:09:fa:e5
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2
-        Validity
-            Not Before: Aug  1 12:00:00 2013 GMT
-            Not After : Jan 15 12:00:00 2038 GMT
-        Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:bb:37:cd:34:dc:7b:6b:c9:b2:68:90:ad:4a:75:
-                    ff:46:ba:21:0a:08:8d:f5:19:54:c9:fb:88:db:f3:
-                    ae:f2:3a:89:91:3c:7a:e6:ab:06:1a:6b:cf:ac:2d:
-                    e8:5e:09:24:44:ba:62:9a:7e:d6:a3:a8:7e:e0:54:
-                    75:20:05:ac:50:b7:9c:63:1a:6c:30:dc:da:1f:19:
-                    b1:d7:1e:de:fd:d7:e0:cb:94:83:37:ae:ec:1f:43:
-                    4e:dd:7b:2c:d2:bd:2e:a5:2f:e4:a9:b8:ad:3a:d4:
-                    99:a4:b6:25:e9:9b:6b:00:60:92:60:ff:4f:21:49:
-                    18:f7:67:90:ab:61:06:9c:8f:f2:ba:e9:b4:e9:92:
-                    32:6b:b5:f3:57:e8:5d:1b:cd:8c:1d:ab:95:04:95:
-                    49:f3:35:2d:96:e3:49:6d:dd:77:e3:fb:49:4b:b4:
-                    ac:55:07:a9:8f:95:b3:b4:23:bb:4c:6d:45:f0:f6:
-                    a9:b2:95:30:b4:fd:4c:55:8c:27:4a:57:14:7c:82:
-                    9d:cd:73:92:d3:16:4a:06:0c:8c:50:d1:8f:1e:09:
-                    be:17:a1:e6:21:ca:fd:83:e5:10:bc:83:a5:0a:c4:
-                    67:28:f6:73:14:14:3d:46:76:c3:87:14:89:21:34:
-                    4d:af:0f:45:0c:a6:49:a1:ba:bb:9c:c5:b1:33:83:
-                    29:85
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                4E:22:54:20:18:95:E6:E3:6E:E6:0F:FA:FA:B9:12:ED:06:17:8F:39
-    Signature Algorithm: sha256WithRSAEncryption
-         60:67:28:94:6f:0e:48:63:eb:31:dd:ea:67:18:d5:89:7d:3c:
-         c5:8b:4a:7f:e9:be:db:2b:17:df:b0:5f:73:77:2a:32:13:39:
-         81:67:42:84:23:f2:45:67:35:ec:88:bf:f8:8f:b0:61:0c:34:
-         a4:ae:20:4c:84:c6:db:f8:35:e1:76:d9:df:a6:42:bb:c7:44:
-         08:86:7f:36:74:24:5a:da:6c:0d:14:59:35:bd:f2:49:dd:b6:
-         1f:c9:b3:0d:47:2a:3d:99:2f:bb:5c:bb:b5:d4:20:e1:99:5f:
-         53:46:15:db:68:9b:f0:f3:30:d5:3e:31:e2:8d:84:9e:e3:8a:
-         da:da:96:3e:35:13:a5:5f:f0:f9:70:50:70:47:41:11:57:19:
-         4e:c0:8f:ae:06:c4:95:13:17:2f:1b:25:9f:75:f2:b1:8e:99:
-         a1:6f:13:b1:41:71:fe:88:2a:c8:4f:10:20:55:d7:f3:14:45:
-         e5:e0:44:f4:ea:87:95:32:93:0e:fe:53:46:fa:2c:9d:ff:8b:
-         22:b9:4b:d9:09:45:a4:de:a4:b8:9a:58:dd:1b:7d:52:9f:8e:
-         59:43:88:81:a4:9e:26:d5:6f:ad:dd:0d:c6:37:7d:ed:03:92:
-         1b:e5:77:5f:76:ee:3c:8d:c4:5d:56:5b:a2:d9:66:6e:b3:35:
-         37:e5:32:b6
------BEGIN CERTIFICATE-----
-MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH
-MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT
-MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
-b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI
-2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx
-1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ
-q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz
-tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ
-vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP
-BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV
-5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY
-1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4
-NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG
-Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91
-8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe
-pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
-MrY=
------END CERTIFICATE-----
-
-# 31ad6648f8104138c738f39ea4320133393e3a18cc02296ef97c2ac9ef6731d0
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            05:55:56:bc:f2:5e:a4:35:35:c3:a4:0f:d5:ab:45:72
-    Signature Algorithm: ecdsa-with-SHA384
-        Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G3
-        Validity
-            Not Before: Aug  1 12:00:00 2013 GMT
-            Not After : Jan 15 12:00:00 2038 GMT
-        Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root G3
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub: 
-                    04:dd:a7:d9:bb:8a:b8:0b:fb:0b:7f:21:d2:f0:be:
-                    be:73:f3:33:5d:1a:bc:34:ea:de:c6:9b:bc:d0:95:
-                    f6:f0:cc:d0:0b:ba:61:5b:51:46:7e:9e:2d:9f:ee:
-                    8e:63:0c:17:ec:07:70:f5:cf:84:2e:40:83:9c:e8:
-                    3f:41:6d:3b:ad:d3:a4:14:59:36:78:9d:03:43:ee:
-                    10:13:6c:72:de:ae:88:a7:a1:6b:b5:43:ce:67:dc:
-                    23:ff:03:1c:a3:e2:3e
-                ASN1 OID: secp384r1
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                B3:DB:48:A4:F9:A1:C5:D8:AE:36:41:CC:11:63:69:62:29:BC:4B:C6
-    Signature Algorithm: ecdsa-with-SHA384
-         30:65:02:31:00:ad:bc:f2:6c:3f:12:4a:d1:2d:39:c3:0a:09:
-         97:73:f4:88:36:8c:88:27:bb:e6:88:8d:50:85:a7:63:f9:9e:
-         32:de:66:93:0f:f1:cc:b1:09:8f:dd:6c:ab:fa:6b:7f:a0:02:
-         30:39:66:5b:c2:64:8d:b8:9e:50:dc:a8:d5:49:a2:ed:c7:dc:
-         d1:49:7f:17:01:b8:c8:86:8f:4e:8c:88:2b:a8:9a:a9:8a:c5:
-         d1:00:bd:f8:54:e2:9a:e5:5b:7c:b3:27:17
------BEGIN CERTIFICATE-----
-MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw
-CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
-ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe
-Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw
-EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
-IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF
-K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG
-fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO
-Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd
-BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx
-AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/
-oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8
-sycX
------END CERTIFICATE-----
-
-# 7431e5f4c3c1ce4690774f0b61e05440883ba9a01ed00ba6abd7806ed3b118cf
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            02:ac:5c:26:6a:0b:40:9b:8f:0b:79:f2:ae:46:25:77
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA
-        Validity
-            Not Before: Nov 10 00:00:00 2006 GMT
-            Not After : Nov 10 00:00:00 2031 GMT
-        Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df:
-                    e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67:
-                    a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98:
-                    a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a:
-                    cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71:
-                    91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be:
-                    f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41:
-                    55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d:
-                    be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7:
-                    ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41:
-                    22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a:
-                    57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4:
-                    68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e:
-                    64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79:
-                    39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a:
-                    a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e:
-                    87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8:
-                    4b:cb
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3
-            X509v3 Authority Key Identifier: 
-                keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3
-
-    Signature Algorithm: sha1WithRSAEncryption
-         1c:1a:06:97:dc:d7:9c:9f:3c:88:66:06:08:57:21:db:21:47:
-         f8:2a:67:aa:bf:18:32:76:40:10:57:c1:8a:f3:7a:d9:11:65:
-         8e:35:fa:9e:fc:45:b5:9e:d9:4c:31:4b:b8:91:e8:43:2c:8e:
-         b3:78:ce:db:e3:53:79:71:d6:e5:21:94:01:da:55:87:9a:24:
-         64:f6:8a:66:cc:de:9c:37:cd:a8:34:b1:69:9b:23:c8:9e:78:
-         22:2b:70:43:e3:55:47:31:61:19:ef:58:c5:85:2f:4e:30:f6:
-         a0:31:16:23:c8:e7:e2:65:16:33:cb:bf:1a:1b:a0:3d:f8:ca:
-         5e:8b:31:8b:60:08:89:2d:0c:06:5c:52:b7:c4:f9:0a:98:d1:
-         15:5f:9f:12:be:7c:36:63:38:bd:44:a4:7f:e4:26:2b:0a:c4:
-         97:69:0d:e9:8c:e2:c0:10:57:b8:c8:76:12:91:55:f2:48:69:
-         d8:bc:2a:02:5b:0f:44:d4:20:31:db:f4:ba:70:26:5d:90:60:
-         9e:bc:4b:17:09:2f:b4:cb:1e:43:68:c9:07:27:c1:d2:5c:f7:
-         ea:21:b9:68:12:9c:3c:9c:bf:9e:fc:80:5c:9b:63:cd:ec:47:
-         aa:25:27:67:a0:37:f3:00:82:7d:54:d7:a9:f8:e9:2e:13:a3:
-         77:e8:1f:4a
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
-ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
-MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
-LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
-RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
-+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
-PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
-xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
-Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
-hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
-EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
-FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
-nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
-eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
-hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
-Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
-vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
-+OkuE6N36B9K
------END CERTIFICATE-----
-
-# 552f7bdcf1a7af9e6ce672017f4f12abf77240c78e761ac203d1d9d20ac89988
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            05:9b:1b:57:9e:8e:21:32:e2:39:07:bd:a7:77:75:5c
-    Signature Algorithm: sha384WithRSAEncryption
-        Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Trusted Root G4
-        Validity
-            Not Before: Aug  1 12:00:00 2013 GMT
-            Not After : Jan 15 12:00:00 2038 GMT
-        Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Trusted Root G4
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:bf:e6:90:73:68:de:bb:e4:5d:4a:3c:30:22:30:
-                    69:33:ec:c2:a7:25:2e:c9:21:3d:f2:8a:d8:59:c2:
-                    e1:29:a7:3d:58:ab:76:9a:cd:ae:7b:1b:84:0d:c4:
-                    30:1f:f3:1b:a4:38:16:eb:56:c6:97:6d:1d:ab:b2:
-                    79:f2:ca:11:d2:e4:5f:d6:05:3c:52:0f:52:1f:c6:
-                    9e:15:a5:7e:be:9f:a9:57:16:59:55:72:af:68:93:
-                    70:c2:b2:ba:75:99:6a:73:32:94:d1:10:44:10:2e:
-                    df:82:f3:07:84:e6:74:3b:6d:71:e2:2d:0c:1b:ee:
-                    20:d5:c9:20:1d:63:29:2d:ce:ec:5e:4e:c8:93:f8:
-                    21:61:9b:34:eb:05:c6:5e:ec:5b:1a:bc:eb:c9:cf:
-                    cd:ac:34:40:5f:b1:7a:66:ee:77:c8:48:a8:66:57:
-                    57:9f:54:58:8e:0c:2b:b7:4f:a7:30:d9:56:ee:ca:
-                    7b:5d:e3:ad:c9:4f:5e:e5:35:e7:31:cb:da:93:5e:
-                    dc:8e:8f:80:da:b6:91:98:40:90:79:c3:78:c7:b6:
-                    b1:c4:b5:6a:18:38:03:10:8d:d8:d4:37:a4:2e:05:
-                    7d:88:f5:82:3e:10:91:70:ab:55:82:41:32:d7:db:
-                    04:73:2a:6e:91:01:7c:21:4c:d4:bc:ae:1b:03:75:
-                    5d:78:66:d9:3a:31:44:9a:33:40:bf:08:d7:5a:49:
-                    a4:c2:e6:a9:a0:67:dd:a4:27:bc:a1:4f:39:b5:11:
-                    58:17:f7:24:5c:46:8f:64:f7:c1:69:88:76:98:76:
-                    3d:59:5d:42:76:87:89:97:69:7a:48:f0:e0:a2:12:
-                    1b:66:9a:74:ca:de:4b:1e:e7:0e:63:ae:e6:d4:ef:
-                    92:92:3a:9e:3d:dc:00:e4:45:25:89:b6:9a:44:19:
-                    2b:7e:c0:94:b4:d2:61:6d:eb:33:d9:c5:df:4b:04:
-                    00:cc:7d:1c:95:c3:8f:f7:21:b2:b2:11:b7:bb:7f:
-                    f2:d5:8c:70:2c:41:60:aa:b1:63:18:44:95:1a:76:
-                    62:7e:f6:80:b0:fb:e8:64:a6:33:d1:89:07:e1:bd:
-                    b7:e6:43:a4:18:b8:a6:77:01:e1:0f:94:0c:21:1d:
-                    b2:54:29:25:89:6c:e5:0e:52:51:47:74:be:26:ac:
-                    b6:41:75:de:7a:ac:5f:8d:3f:c9:bc:d3:41:11:12:
-                    5b:e5:10:50:eb:31:c5:ca:72:16:22:09:df:7c:4c:
-                    75:3f:63:ec:21:5f:c4:20:51:6b:6f:b1:ab:86:8b:
-                    4f:c2:d6:45:5f:9d:20:fc:a1:1e:c5:c0:8f:a2:b1:
-                    7e:0a:26:99:f5:e4:69:2f:98:1d:2d:f5:d9:a9:b2:
-                    1d:e5:1b
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                EC:D7:E3:82:D2:71:5D:64:4C:DF:2E:67:3F:E7:BA:98:AE:1C:0F:4F
-    Signature Algorithm: sha384WithRSAEncryption
-         bb:61:d9:7d:a9:6c:be:17:c4:91:1b:c3:a1:a2:00:8d:e3:64:
-         68:0f:56:cf:77:ae:70:f9:fd:9a:4a:99:b9:c9:78:5c:0c:0c:
-         5f:e4:e6:14:29:56:0b:36:49:5d:44:63:e0:ad:9c:96:18:66:
-         1b:23:0d:3d:79:e9:6d:6b:d6:54:f8:d2:3c:c1:43:40:ae:1d:
-         50:f5:52:fc:90:3b:bb:98:99:69:6b:c7:c1:a7:a8:68:a4:27:
-         dc:9d:f9:27:ae:30:85:b9:f6:67:4d:3a:3e:8f:59:39:22:53:
-         44:eb:c8:5d:03:ca:ed:50:7a:7d:62:21:0a:80:c8:73:66:d1:
-         a0:05:60:5f:e8:a5:b4:a7:af:a8:f7:6d:35:9c:7c:5a:8a:d6:
-         a2:38:99:f3:78:8b:f4:4d:d2:20:0b:de:04:ee:8c:9b:47:81:
-         72:0d:c0:14:32:ef:30:59:2e:ae:e0:71:f2:56:e4:6a:97:6f:
-         92:50:6d:96:8d:68:7a:9a:b2:36:14:7a:06:f2:24:b9:09:11:
-         50:d7:08:b1:b8:89:7a:84:23:61:42:29:e5:a3:cd:a2:20:41:
-         d7:d1:9c:64:d9:ea:26:a1:8b:14:d7:4c:19:b2:50:41:71:3d:
-         3f:4d:70:23:86:0c:4a:dc:81:d2:cc:32:94:84:0d:08:09:97:
-         1c:4f:c0:ee:6b:20:74:30:d2:e0:39:34:10:85:21:15:01:08:
-         e8:55:32:de:71:49:d9:28:17:50:4d:e6:be:4d:d1:75:ac:d0:
-         ca:fb:41:b8:43:a5:aa:d3:c3:05:44:4f:2c:36:9b:e2:fa:e2:
-         45:b8:23:53:6c:06:6f:67:55:7f:46:b5:4c:3f:6e:28:5a:79:
-         26:d2:a4:a8:62:97:d2:1e:e2:ed:4a:8b:bc:1b:fd:47:4a:0d:
-         df:67:66:7e:b2:5b:41:d0:3b:e4:f4:3b:f4:04:63:e9:ef:c2:
-         54:00:51:a0:8a:2a:c9:ce:78:cc:d5:ea:87:04:18:b3:ce:af:
-         49:88:af:f3:92:99:b6:b3:e6:61:0f:d2:85:00:e7:50:1a:e4:
-         1b:95:9d:19:a1:b9:9c:b1:9b:b1:00:1e:ef:d0:0f:4f:42:6c:
-         c9:0a:bc:ee:43:fa:3a:71:a5:c8:4d:26:a5:35:fd:89:5d:bc:
-         85:62:1d:32:d2:a0:2b:54:ed:9a:57:c1:db:fa:10:cf:19:b7:
-         8b:4a:1b:8f:01:b6:27:95:53:e8:b6:89:6d:5b:bc:68:d4:23:
-         e8:8b:51:a2:56:f9:f0:a6:80:a0:d6:1e:b3:bc:0f:0f:53:75:
-         29:aa:ea:13:77:e4:de:8c:81:21:ad:07:10:47:11:ad:87:3d:
-         07:d1:75:bc:cf:f3:66:7e
------BEGIN CERTIFICATE-----
-MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi
-MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
-d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
-RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV
-UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu
-Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y
-ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If
-xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV
-ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO
-DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ
-jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/
-CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi
-EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM
-fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY
-uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK
-chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t
-9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
-ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2
-SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd
-+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc
-fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa
-sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N
-cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N
-0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie
-4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI
-r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
-/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm
-gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
------END CERTIFICATE-----
-
-# eec5496b988ce98625b934092eec2908bed0b0f316c2d4730c84eaf1f3d34881
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 623604 (0x983f4)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=DE, O=D-Trust GmbH, CN=D-TRUST Root Class 3 CA 2 EV 2009
-        Validity
-            Not Before: Nov  5 08:50:46 2009 GMT
-            Not After : Nov  5 08:50:46 2029 GMT
-        Subject: C=DE, O=D-Trust GmbH, CN=D-TRUST Root Class 3 CA 2 EV 2009
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:99:f1:84:34:70:ba:2f:b7:30:a0:8e:bd:7c:04:
-                    cf:be:62:bc:99:fd:82:97:d2:7a:0a:67:96:38:09:
-                    f6:10:4e:95:22:73:99:8d:da:15:2d:e7:05:fc:19:
-                    73:22:b7:8e:98:00:bc:3c:3d:ac:a1:6c:fb:d6:79:
-                    25:4b:ad:f0:cc:64:da:88:3e:29:b8:0f:09:d3:34:
-                    dd:33:f5:62:d1:e1:cd:19:e9:ee:18:4f:4c:58:ae:
-                    e2:1e:d6:0c:5b:15:5a:d8:3a:b8:c4:18:64:1e:e3:
-                    33:b2:b5:89:77:4e:0c:bf:d9:94:6b:13:97:6f:12:
-                    a3:fe:99:a9:04:cc:15:ec:60:68:36:ed:08:7b:b7:
-                    f5:bf:93:ed:66:31:83:8c:c6:71:34:87:4e:17:ea:
-                    af:8b:91:8d:1c:56:41:ae:22:37:5e:37:f2:1d:d9:
-                    d1:2d:0d:2f:69:51:a7:be:66:a6:8a:3a:2a:bd:c7:
-                    1a:b1:e1:14:f0:be:3a:1d:b9:cf:5b:b1:6a:fe:b4:
-                    b1:46:20:a2:fb:1e:3b:70:ef:93:98:7d:8c:73:96:
-                    f2:c5:ef:85:70:ad:29:26:fc:1e:04:3e:1c:a0:d8:
-                    0f:cb:52:83:62:7c:ee:8b:53:95:90:a9:57:a2:ea:
-                    61:05:d8:f9:4d:c4:27:fa:6e:ad:ed:f9:d7:51:f7:
-                    6b:a5
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                D3:94:8A:4C:62:13:2A:19:2E:CC:AF:72:8A:7D:36:D7:9A:1C:DC:67
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 CRL Distribution Points: 
-
-                Full Name:
-                  URI:ldap://directory.d-trust.net/CN=D-TRUST%20Root%20Class%203%20CA%202%20EV%202009,O=D-Trust%20GmbH,C=DE?certificaterevocationlist
-
-                Full Name:
-                  URI:http://www.d-trust.net/crl/d-trust_root_class_3_ca_2_ev_2009.crl
-
-    Signature Algorithm: sha256WithRSAEncryption
-         34:ed:7b:5a:3c:a4:94:88:ef:1a:11:75:07:2f:b3:fe:3c:fa:
-         1e:51:26:eb:87:f6:29:de:e0:f1:d4:c6:24:09:e9:c1:cf:55:
-         1b:b4:30:d9:ce:1a:fe:06:51:a6:15:a4:2d:ef:b2:4b:bf:20:
-         28:25:49:d1:a6:36:77:34:e8:64:df:52:b1:11:c7:73:7a:cd:
-         39:9e:c2:ad:8c:71:21:f2:5a:6b:af:df:3c:4e:55:af:b2:84:
-         65:14:89:b9:77:cb:2a:31:be:cf:a3:6d:cf:6f:48:94:32:46:
-         6f:e7:71:8c:a0:a6:84:19:37:07:f2:03:45:09:2b:86:75:7c:
-         df:5f:69:57:00:db:6e:d8:a6:72:22:4b:50:d4:75:98:56:df:
-         b7:18:ff:43:43:50:ae:7a:44:7b:f0:79:51:d7:43:3d:a7:d3:
-         81:d3:f0:c9:4f:b9:da:c6:97:86:d0:82:c3:e4:42:6d:fe:b0:
-         e2:64:4e:0e:26:e7:40:34:26:b5:08:89:d7:08:63:63:38:27:
-         75:1e:33:ea:6e:a8:dd:9f:99:4f:74:4d:81:89:80:4b:dd:9a:
-         97:29:5c:2f:be:81:41:b9:8c:ff:ea:7d:60:06:9e:cd:d7:3d:
-         d3:2e:a3:15:bc:a8:e6:26:e5:6f:c3:dc:b8:03:21:ea:9f:16:
-         f1:2c:54:b5
------BEGIN CERTIFICATE-----
-MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
-MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
-bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
-NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
-BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
-ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
-3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
-qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
-p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
-HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
-ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
-HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
-Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
-c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
-RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
-dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
-Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
-3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
-nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
-CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
-xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
-KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
------END CERTIFICATE-----
-
-# 40f6af0346a99aa1cd1d555a4e9cce62c7f9634603ee406615833dc8c8d00367
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            31:f5:e4:62:0c:6c:58:ed:d6:d8
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = IN, OU = emSign PKI, O = eMudhra Technologies Limited, CN = emSign Root CA - G1
-        Validity
-            Not Before: Feb 18 18:30:00 2018 GMT
-            Not After : Feb 18 18:30:00 2043 GMT
-        Subject: C = IN, OU = emSign PKI, O = eMudhra Technologies Limited, CN = emSign Root CA - G1
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (2048 bit)
-                Modulus:
-                    00:93:4b:bb:e9:66:8a:ee:9d:5b:d5:34:93:d0:1b:
-                    1e:c3:e7:9e:b8:64:33:7f:63:78:68:b4:cd:2e:71:
-                    75:d7:9b:20:c6:4d:29:bc:b6:68:60:8a:f7:21:9a:
-                    56:35:5a:f3:76:bd:d8:cd:9a:ff:93:56:4b:a5:59:
-                    06:a1:93:34:29:dd:16:34:75:4e:f2:81:b4:c7:96:
-                    4e:ad:19:15:52:4a:fe:3c:70:75:70:cd:af:2b:ab:
-                    15:9a:33:3c:aa:b3:8b:aa:cd:43:fd:f5:ea:70:ff:
-                    ed:cf:11:3b:94:ce:4e:32:16:d3:23:40:2a:77:b3:
-                    af:3c:01:2c:6c:ed:99:2c:8b:d9:4e:69:98:b2:f7:
-                    8f:41:b0:32:78:61:d6:0d:5f:c3:fa:a2:40:92:1d:
-                    5c:17:e6:70:3e:35:e7:a2:b7:c2:62:e2:ab:a4:38:
-                    4c:b5:39:35:6f:ea:03:69:fa:3a:54:68:85:6d:d6:
-                    f2:2f:43:55:1e:91:0d:0e:d8:d5:6a:a4:96:d1:13:
-                    3c:2c:78:50:e8:3a:92:d2:17:56:e5:35:1a:40:1c:
-                    3e:8d:2c:ed:39:df:42:e0:83:41:74:df:a3:cd:c2:
-                    86:60:48:68:e3:69:0b:54:00:8b:e4:76:69:21:0d:
-                    79:4e:34:08:5e:14:c2:cc:b1:b7:ad:d7:7c:70:8a:
-                    c7:85
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                FB:EF:0D:86:9E:B0:E3:DD:A9:B9:F1:21:17:7F:3E:FC:F0:77:2B:1A
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-    Signature Algorithm: sha256WithRSAEncryption
-         59:ff:f2:8c:f5:87:7d:71:3d:a3:9f:1b:5b:d1:da:f8:d3:9c:
-         6b:36:bd:9b:a9:61:eb:de:16:2c:74:3d:9e:e6:75:da:d7:ba:
-         a7:bc:42:17:e7:3d:91:eb:e5:7d:dd:3e:9c:f1:cf:92:ac:6c:
-         48:cc:c2:22:3f:69:3b:c5:b6:15:2f:a3:35:c6:68:2a:1c:57:
-         af:39:ef:8d:d0:35:c3:18:0c:7b:00:56:1c:cd:8b:19:74:de:
-         be:0f:12:e0:d0:aa:a1:3f:02:34:b1:70:ce:9d:18:d6:08:03:
-         09:46:ee:60:e0:7e:b6:c4:49:04:51:7d:70:60:bc:aa:b2:ff:
-         79:72:7a:a6:1d:3d:5f:2a:f8:ca:e2:fd:39:b7:47:b9:eb:7e:
-         df:04:23:af:fa:9c:06:07:e9:fb:63:93:80:40:b5:c6:6c:0a:
-         31:28:ce:0c:9f:cf:b3:23:35:80:41:8d:6c:c4:37:7b:81:2f:
-         80:a1:40:42:85:e9:d9:38:8d:e8:a1:53:cd:01:bf:69:e8:5a:
-         06:f2:45:0b:90:fa:ae:e1:bf:9d:f2:ae:57:3c:a5:ae:b2:56:
-         f4:8b:65:40:e9:fd:31:81:2c:f4:39:09:d8:ee:6b:a7:b4:a6:
-         1d:15:a5:98:f7:01:81:d8:85:7d:f3:51:5c:71:88:de:ba:cc:
-         1f:80:7e:4a
------BEGIN CERTIFICATE-----
-MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD
-VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU
-ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH
-MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO
-MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv
-Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz
-f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO
-8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq
-d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM
-tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt
-Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB
-o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x
-PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM
-wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d
-GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH
-6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby
-RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
-iN66zB+Afko=
------END CERTIFICATE-----
-
-# 73c176434f1bc6d5adf45b0e76e727287c8de57616c1e6e6141a2b2cbc7d8e4c
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 1164660820 (0x456b5054)
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=US, O=Entrust, Inc., OU=www.entrust.net/CPS is incorporated by reference, OU=(c) 2006 Entrust, Inc., CN=Entrust Root Certification Authority
-        Validity
-            Not Before: Nov 27 20:23:42 2006 GMT
-            Not After : Nov 27 20:53:42 2026 GMT
-        Subject: C=US, O=Entrust, Inc., OU=www.entrust.net/CPS is incorporated by reference, OU=(c) 2006 Entrust, Inc., CN=Entrust Root Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:b6:95:b6:43:42:fa:c6:6d:2a:6f:48:df:94:4c:
-                    39:57:05:ee:c3:79:11:41:68:36:ed:ec:fe:9a:01:
-                    8f:a1:38:28:fc:f7:10:46:66:2e:4d:1e:1a:b1:1a:
-                    4e:c6:d1:c0:95:88:b0:c9:ff:31:8b:33:03:db:b7:
-                    83:7b:3e:20:84:5e:ed:b2:56:28:a7:f8:e0:b9:40:
-                    71:37:c5:cb:47:0e:97:2a:68:c0:22:95:62:15:db:
-                    47:d9:f5:d0:2b:ff:82:4b:c9:ad:3e:de:4c:db:90:
-                    80:50:3f:09:8a:84:00:ec:30:0a:3d:18:cd:fb:fd:
-                    2a:59:9a:23:95:17:2c:45:9e:1f:6e:43:79:6d:0c:
-                    5c:98:fe:48:a7:c5:23:47:5c:5e:fd:6e:e7:1e:b4:
-                    f6:68:45:d1:86:83:5b:a2:8a:8d:b1:e3:29:80:fe:
-                    25:71:88:ad:be:bc:8f:ac:52:96:4b:aa:51:8d:e4:
-                    13:31:19:e8:4e:4d:9f:db:ac:b3:6a:d5:bc:39:54:
-                    71:ca:7a:7a:7f:90:dd:7d:1d:80:d9:81:bb:59:26:
-                    c2:11:fe:e6:93:e2:f7:80:e4:65:fb:34:37:0e:29:
-                    80:70:4d:af:38:86:2e:9e:7f:57:af:9e:17:ae:eb:
-                    1c:cb:28:21:5f:b6:1c:d8:e7:a2:04:22:f9:d3:da:
-                    d8:cb
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Private Key Usage Period: 
-                Not Before: Nov 27 20:23:42 2006 GMT, Not After: Nov 27 20:53:42 2026 GMT
-            X509v3 Authority Key Identifier: 
-                keyid:68:90:E4:67:A4:A6:53:80:C7:86:66:A4:F1:F7:4B:43:FB:84:BD:6D
-
-            X509v3 Subject Key Identifier: 
-                68:90:E4:67:A4:A6:53:80:C7:86:66:A4:F1:F7:4B:43:FB:84:BD:6D
-            1.2.840.113533.7.65.0: 
-                0...V7.1:4.0....
-    Signature Algorithm: sha1WithRSAEncryption
-         93:d4:30:b0:d7:03:20:2a:d0:f9:63:e8:91:0c:05:20:a9:5f:
-         19:ca:7b:72:4e:d4:b1:db:d0:96:fb:54:5a:19:2c:0c:08:f7:
-         b2:bc:85:a8:9d:7f:6d:3b:52:b3:2a:db:e7:d4:84:8c:63:f6:
-         0f:cb:26:01:91:50:6c:f4:5f:14:e2:93:74:c0:13:9e:30:3a:
-         50:e3:b4:60:c5:1c:f0:22:44:8d:71:47:ac:c8:1a:c9:e9:9b:
-         9a:00:60:13:ff:70:7e:5f:11:4d:49:1b:b3:15:52:7b:c9:54:
-         da:bf:9d:95:af:6b:9a:d8:9e:e9:f1:e4:43:8d:e2:11:44:3a:
-         bf:af:bd:83:42:73:52:8b:aa:bb:a7:29:cf:f5:64:1c:0a:4d:
-         d1:bc:aa:ac:9f:2a:d0:ff:7f:7f:da:7d:ea:b1:ed:30:25:c1:
-         84:da:34:d2:5b:78:83:56:ec:9c:36:c3:26:e2:11:f6:67:49:
-         1d:92:ab:8c:fb:eb:ff:7a:ee:85:4a:a7:50:80:f0:a7:5c:4a:
-         94:2e:5f:05:99:3c:52:41:e0:cd:b4:63:cf:01:43:ba:9c:83:
-         dc:8f:60:3b:f3:5a:b4:b4:7b:ae:da:0b:90:38:75:ef:81:1d:
-         66:d2:f7:57:70:36:b3:bf:fc:28:af:71:25:85:5b:13:fe:1e:
-         7f:5a:b4:3c
------BEGIN CERTIFICATE-----
-MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
-Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
-KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
-NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
-NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
-ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
-BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
-Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
-4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
-KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
-rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
-94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
-sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
-gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
-kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
-vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
-A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
-O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
-AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
-9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
-eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
-0vdXcDazv/wor3ElhVsT/h5/WrQ8
------END CERTIFICATE-----
-
-# 43df5774b03e7fef5fe40d931a7bedf1bb2e6b42738c4e6d3841103d3aa7f339
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 1246989352 (0x4a538c28)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2009 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - G2
-        Validity
-            Not Before: Jul  7 17:25:54 2009 GMT
-            Not After : Dec  7 17:55:54 2030 GMT
-        Subject: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2009 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - G2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:ba:84:b6:72:db:9e:0c:6b:e2:99:e9:30:01:a7:
-                    76:ea:32:b8:95:41:1a:c9:da:61:4e:58:72:cf:fe:
-                    f6:82:79:bf:73:61:06:0a:a5:27:d8:b3:5f:d3:45:
-                    4e:1c:72:d6:4e:32:f2:72:8a:0f:f7:83:19:d0:6a:
-                    80:80:00:45:1e:b0:c7:e7:9a:bf:12:57:27:1c:a3:
-                    68:2f:0a:87:bd:6a:6b:0e:5e:65:f3:1c:77:d5:d4:
-                    85:8d:70:21:b4:b3:32:e7:8b:a2:d5:86:39:02:b1:
-                    b8:d2:47:ce:e4:c9:49:c4:3b:a7:de:fb:54:7d:57:
-                    be:f0:e8:6e:c2:79:b2:3a:0b:55:e2:50:98:16:32:
-                    13:5c:2f:78:56:c1:c2:94:b3:f2:5a:e4:27:9a:9f:
-                    24:d7:c6:ec:d0:9b:25:82:e3:cc:c2:c4:45:c5:8c:
-                    97:7a:06:6b:2a:11:9f:a9:0a:6e:48:3b:6f:db:d4:
-                    11:19:42:f7:8f:07:bf:f5:53:5f:9c:3e:f4:17:2c:
-                    e6:69:ac:4e:32:4c:62:77:ea:b7:e8:e5:bb:34:bc:
-                    19:8b:ae:9c:51:e7:b7:7e:b5:53:b1:33:22:e5:6d:
-                    cf:70:3c:1a:fa:e2:9b:67:b6:83:f4:8d:a5:af:62:
-                    4c:4d:e0:58:ac:64:34:12:03:f8:b6:8d:94:63:24:
-                    a4:71
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                6A:72:26:7A:D0:1E:EF:7D:E7:3B:69:51:D4:6C:8D:9F:90:12:66:AB
-    Signature Algorithm: sha256WithRSAEncryption
-         79:9f:1d:96:c6:b6:79:3f:22:8d:87:d3:87:03:04:60:6a:6b:
-         9a:2e:59:89:73:11:ac:43:d1:f5:13:ff:8d:39:2b:c0:f2:bd:
-         4f:70:8c:a9:2f:ea:17:c4:0b:54:9e:d4:1b:96:98:33:3c:a8:
-         ad:62:a2:00:76:ab:59:69:6e:06:1d:7e:c4:b9:44:8d:98:af:
-         12:d4:61:db:0a:19:46:47:f3:eb:f7:63:c1:40:05:40:a5:d2:
-         b7:f4:b5:9a:36:bf:a9:88:76:88:04:55:04:2b:9c:87:7f:1a:
-         37:3c:7e:2d:a5:1a:d8:d4:89:5e:ca:bd:ac:3d:6c:d8:6d:af:
-         d5:f3:76:0f:cd:3b:88:38:22:9d:6c:93:9a:c4:3d:bf:82:1b:
-         65:3f:a6:0f:5d:aa:fc:e5:b2:15:ca:b5:ad:c6:bc:3d:d0:84:
-         e8:ea:06:72:b0:4d:39:32:78:bf:3e:11:9c:0b:a4:9d:9a:21:
-         f3:f0:9b:0b:30:78:db:c1:dc:87:43:fe:bc:63:9a:ca:c5:c2:
-         1c:c9:c7:8d:ff:3b:12:58:08:e6:b6:3d:ec:7a:2c:4e:fb:83:
-         96:ce:0c:3c:69:87:54:73:a4:73:c2:93:ff:51:10:ac:15:54:
-         01:d8:fc:05:b1:89:a1:7f:74:83:9a:49:d7:dc:4e:7b:8a:48:
-         6f:8b:45:f6
------BEGIN CERTIFICATE-----
-MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
-cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
-IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
-dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
-NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
-dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
-dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
-aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
-AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
-RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
-cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
-wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
-U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
-jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
-BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
-BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
-jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
-Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
-1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
-nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
-VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
------END CERTIFICATE-----
-
-# db3517d1f6732a2d5ab97c533ec70779ee3270a62fb4ac4238372460e6f01e88
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            d9:b5:43:7f:af:a9:39:0f:00:00:00:00:55:65:ad:58
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2015 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G4
-        Validity
-            Not Before: May 27 11:11:16 2015 GMT
-            Not After : Dec 27 11:41:16 2037 GMT
-        Subject: C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2015 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G4
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (4096 bit)
-                Modulus:
-                    00:b1:ec:2c:42:ee:e2:d1:30:ff:a5:92:47:e2:2d:
-                    c3:ba:64:97:6d:ca:f7:0d:b5:59:c1:b3:cb:a8:68:
-                    19:d8:af:84:6d:30:70:5d:7e:f3:2e:d2:53:99:e1:
-                    fe:1f:5e:d9:48:af:5d:13:8d:db:ff:63:33:4d:d3:
-                    00:02:bc:c4:f8:d1:06:08:94:79:58:8a:15:de:29:
-                    b3:fd:fd:c4:4f:e8:aa:e2:a0:3b:79:cd:bf:6b:43:
-                    32:dd:d9:74:10:b9:f7:f4:68:d4:bb:d0:87:d5:aa:
-                    4b:8a:2a:6f:2a:04:b5:b2:a6:c7:a0:7a:e6:48:ab:
-                    d2:d1:59:cc:d6:7e:23:e6:97:6c:f0:42:e5:dc:51:
-                    4b:15:41:ed:49:4a:c9:de:10:97:d6:76:c1:ef:a5:
-                    b5:36:14:97:35:d8:78:22:35:52:ef:43:bd:db:27:
-                    db:61:56:82:34:dc:cb:88:60:0c:0b:5a:e5:2c:01:
-                    c6:54:af:d7:aa:c1:10:7b:d2:05:5a:b8:40:9e:86:
-                    a7:c3:90:86:02:56:52:09:7a:9c:d2:27:82:53:4a:
-                    65:52:6a:f5:3c:e7:a8:f2:9c:af:8b:bd:d3:0e:d4:
-                    d4:5e:6e:87:9e:6a:3d:45:1d:d1:5d:1b:f4:e9:0a:
-                    ac:60:99:fb:89:b4:ff:98:2c:cf:7c:1d:e9:02:aa:
-                    04:9a:1e:b8:dc:88:6e:25:b3:6c:66:f7:3c:90:f3:
-                    57:c1:b3:2f:f5:6d:f2:fb:ca:a1:f8:29:9d:46:8b:
-                    b3:6a:f6:e6:67:07:be:2c:67:0a:2a:1f:5a:b2:3e:
-                    57:c4:d3:21:21:63:65:52:91:1b:b1:99:8e:79:7e:
-                    e6:eb:8d:00:d9:5a:aa:ea:73:e8:a4:82:02:47:96:
-                    fe:5b:8e:54:61:a3:eb:2f:4b:30:b0:8b:23:75:72:
-                    7c:21:3c:c8:f6:f1:74:d4:1c:7b:a3:05:55:ee:bb:
-                    4d:3b:32:be:9a:77:66:9e:ac:69:90:22:07:1f:61:
-                    3a:96:be:e5:9a:4f:cc:05:3c:28:59:d3:c1:0c:54:
-                    a8:59:61:bd:c8:72:4c:e8:dc:9f:87:7f:bd:9c:48:
-                    36:5e:95:a3:0e:b9:38:24:55:fc:75:66:eb:02:e3:
-                    08:34:29:4a:c6:e3:2b:2f:33:a0:da:a3:86:a5:12:
-                    97:fd:80:2b:da:14:42:e3:92:bd:3e:f2:5d:5e:67:
-                    74:2e:1c:88:47:29:34:5f:e2:32:a8:9c:25:37:8c:
-                    ba:98:00:97:8b:49:96:1e:fd:25:8a:ac:dc:da:d8:
-                    5d:74:6e:66:b0:ff:44:df:a1:18:c6:be:48:2f:37:
-                    94:78:f8:95:4a:3f:7f:13:5e:5d:59:fd:74:86:43:
-                    63:73:49
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                9F:38:C4:56:23:C3:39:E8:A0:71:6C:E8:54:4C:E4:E8:3A:B1:BF:67
-    Signature Algorithm: sha256WithRSAEncryption
-         12:e5:42:a6:7b:8b:0f:0c:e4:46:a5:b6:60:40:87:8c:25:7e:
-         ad:b8:68:2e:5b:c6:40:76:3c:03:f8:c9:59:f4:f3:ab:62:ce:
-         10:8d:b4:5a:64:8c:68:c0:b0:72:43:34:d2:1b:0b:f6:2c:53:
-         d2:ca:90:4b:86:66:fc:aa:83:22:f4:8b:1a:6f:26:48:ac:76:
-         77:08:bf:c5:98:5c:f4:26:89:9e:7b:c3:b9:64:32:01:7f:d3:
-         c3:dd:58:6d:ec:b1:ab:84:55:74:77:84:04:27:52:6b:86:4c:
-         ce:dd:b9:65:ff:d6:c6:5e:9f:9a:10:99:4b:75:6a:fe:6a:e9:
-         97:20:e4:e4:76:7a:c6:d0:24:aa:90:cd:20:90:ba:47:64:fb:
-         7f:07:b3:53:78:b5:0a:62:f2:73:43:ce:41:2b:81:6a:2e:85:
-         16:94:53:d4:6b:5f:72:22:ab:51:2d:42:d5:00:9c:99:bf:de:
-         bb:94:3b:57:fd:9a:f5:86:cb:56:3b:5b:88:01:e5:7c:28:4b:
-         03:f9:49:83:7c:b2:7f:7c:e3:ed:8e:a1:7f:60:53:8e:55:9d:
-         50:34:12:0f:b7:97:7b:6c:87:4a:44:e7:f5:6d:ec:80:37:f0:
-         58:19:6e:4a:68:76:f0:1f:92:e4:ea:b5:92:d3:61:51:10:0b:
-         ad:a7:d9:5f:c7:5f:dc:1f:a3:5c:8c:a1:7e:9b:b7:9e:d3:56:
-         6f:66:5e:07:96:20:ed:0b:74:fb:66:4e:8b:11:15:e9:81:49:
-         7e:6f:b0:d4:50:7f:22:d7:5f:65:02:0d:a6:f4:85:1e:d8:ae:
-         06:4b:4a:a7:d2:31:66:c2:f8:ce:e5:08:a6:a4:02:96:44:68:
-         57:c4:d5:33:cf:19:2f:14:c4:94:1c:7b:a4:d9:f0:9f:0e:b1:
-         80:e2:d1:9e:11:64:a9:88:11:3a:76:82:e5:62:c2:80:d8:a4:
-         83:ed:93:ef:7c:2f:90:b0:32:4c:96:15:68:48:52:d4:99:08:
-         c0:24:e8:1c:e3:b3:a5:21:0e:92:c0:90:1f:cf:20:5f:ca:3b:
-         38:c7:b7:6d:3a:f3:e6:44:b8:0e:31:6b:88:8e:70:eb:9c:17:
-         52:a8:41:94:2e:87:b6:e7:a6:12:c5:75:df:5b:c0:0a:6e:7b:
-         a4:e4:5e:86:f9:36:94:df:77:c3:e9:0d:c0:39:f1:79:bb:46:
-         8e:ab:43:59:27:b7:20:bb:23:e9:56:40:21:ec:31:3d:65:aa:
-         43:f2:3d:df:70:44:e1:ba:4d:26:10:3b:98:9f:f3:c8:8e:1b:
-         38:56:21:6a:51:93:d3:91:ca:46:da:89:b7:3d:53:83:2c:08:
-         1f:8b:8f:53:dd:ff:ac:1f
------BEGIN CERTIFICATE-----
-MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAw
-gb4xCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQL
-Ex9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykg
-MjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAw
-BgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0
-MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYTAlVT
-MRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1
-c3QubmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJ
-bmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3Qg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0MIICIjANBgkqhkiG9w0B
-AQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3DumSXbcr3DbVZwbPLqGgZ
-2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV3imz/f3E
-T+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j
-5pds8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAM
-C1rlLAHGVK/XqsEQe9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73T
-DtTUXm6Hnmo9RR3RXRv06QqsYJn7ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNX
-wbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5XxNMhIWNlUpEbsZmOeX7m640A
-2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV7rtNOzK+mndm
-nqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8
-dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwl
-N4y6mACXi0mWHv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNj
-c0kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
-VR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9nMA0GCSqGSIb3DQEBCwUAA4ICAQAS
-5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4QjbRaZIxowLByQzTS
-Gwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht7LGr
-hFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/
-B7NTeLUKYvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uI
-AeV8KEsD+UmDfLJ/fOPtjqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbw
-H5Lk6rWS02FREAutp9lfx1/cH6NcjKF+m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+
-b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKWRGhXxNUzzxkvFMSUHHuk
-2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjAJOgc47Ol
-IQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk
-5F6G+TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuY
-n/PIjhs4ViFqUZPTkcpG2om3PVODLAgfi49T3f+sHw==
------END CERTIFICATE-----
-
-# 02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            a6:8b:79:29:00:00:00:00:50:d0:91:f9
-    Signature Algorithm: ecdsa-with-SHA384
-        Issuer: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2012 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - EC1
-        Validity
-            Not Before: Dec 18 15:25:36 2012 GMT
-            Not After : Dec 18 15:55:36 2037 GMT
-        Subject: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2012 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - EC1
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub: 
-                    04:84:13:c9:d0:ba:6d:41:7b:e2:6c:d0:eb:55:5f:
-                    66:02:1a:24:f4:5b:89:69:47:e3:b8:c2:7d:f1:f2:
-                    02:c5:9f:a0:f6:5b:d5:8b:06:19:86:4f:53:10:6d:
-                    07:24:27:a1:a0:f8:d5:47:19:61:4c:7d:ca:93:27:
-                    ea:74:0c:ef:6f:96:09:fe:63:ec:70:5d:36:ad:67:
-                    77:ae:c9:9d:7c:55:44:3a:a2:63:51:1f:f5:e3:62:
-                    d4:a9:47:07:3e:cc:20
-                ASN1 OID: secp384r1
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                B7:63:E7:1A:DD:8D:E9:08:A6:55:83:A4:E0:6A:50:41:65:11:42:49
-    Signature Algorithm: ecdsa-with-SHA384
-         30:64:02:30:61:79:d8:e5:42:47:df:1c:ae:53:99:17:b6:6f:
-         1c:7d:e1:bf:11:94:d1:03:88:75:e4:8d:89:a4:8a:77:46:de:
-         6d:61:ef:02:f5:fb:b5:df:cc:fe:4e:ff:fe:a9:e6:a7:02:30:
-         5b:99:d7:85:37:06:b5:7b:08:fd:eb:27:8b:4a:94:f9:e1:fa:
-         a7:8e:26:08:e8:7c:92:68:6d:73:d8:6f:26:ac:21:02:b8:99:
-         b7:26:41:5b:25:60:ae:d0:48:1a:ee:06
------BEGIN CERTIFICATE-----
-MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
-A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
-d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
-dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
-RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
-MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
-VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
-L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
-Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
-A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
-ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
-Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
-BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
-R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
-hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
------END CERTIFICATE-----
-
-# b0bfd52bb0d7d9bd92bf5d4dc13da255c02c542f378365ea893911f55e55f23c
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 7667447206703254355 (0x6a683e9c519bcb53)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=TR, L=Ankara, O=E-Tu\xC4\x9Fra EBG Bili\xC5\x9Fim Teknolojileri ve Hizmetleri A.\xC5\x9E., OU=E-Tugra Sertifikasyon Merkezi, CN=E-Tugra Certification Authority
-        Validity
-            Not Before: Mar  5 12:09:48 2013 GMT
-            Not After : Mar  3 12:09:48 2023 GMT
-        Subject: C=TR, L=Ankara, O=E-Tu\xC4\x9Fra EBG Bili\xC5\x9Fim Teknolojileri ve Hizmetleri A.\xC5\x9E., OU=E-Tugra Sertifikasyon Merkezi, CN=E-Tugra Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:e2:f5:3f:93:05:51:1e:85:62:54:5e:7a:0b:f5:
-                    18:07:83:ae:7e:af:7c:f7:d4:8a:6b:a5:63:43:39:
-                    b9:4b:f7:c3:c6:64:89:3d:94:2e:54:80:52:39:39:
-                    07:4b:4b:dd:85:07:76:87:cc:bf:2f:95:4c:cc:7d:
-                    a7:3d:bc:47:0f:98:70:f8:8c:85:1e:74:8e:92:6d:
-                    1b:40:d1:99:0d:bb:75:6e:c8:a9:6b:9a:c0:84:31:
-                    af:ca:43:cb:eb:2b:34:e8:8f:97:6b:01:9b:d5:0e:
-                    4a:08:aa:5b:92:74:85:43:d3:80:ae:a1:88:5b:ae:
-                    b3:ea:5e:cb:16:9a:77:44:c8:a1:f6:54:68:ce:de:
-                    8f:97:2b:ba:5b:40:02:0c:64:17:c0:b5:93:cd:e1:
-                    f1:13:66:ce:0c:79:ef:d1:91:28:ab:5f:a0:12:52:
-                    30:73:19:8e:8f:e1:8c:07:a2:c3:bb:4a:f0:ea:1f:
-                    15:a8:ee:25:cc:a4:46:f8:1b:22:ef:b3:0e:43:ba:
-                    2c:24:b8:c5:2c:5c:d4:1c:f8:5d:64:bd:c3:93:5e:
-                    28:a7:3f:27:f1:8e:1e:d3:2a:50:05:a3:55:d9:cb:
-                    e7:39:53:c0:98:9e:8c:54:62:8b:26:b0:f7:7d:8d:
-                    7c:e4:c6:9e:66:42:55:82:47:e7:b2:58:8d:66:f7:
-                    07:7c:2e:36:e6:50:1c:3f:db:43:24:c5:bf:86:47:
-                    79:b3:79:1c:f7:5a:f4:13:ec:6c:f8:3f:e2:59:1f:
-                    95:ee:42:3e:b9:ad:a8:32:85:49:97:46:fe:4b:31:
-                    8f:5a:cb:ad:74:47:1f:e9:91:b7:df:28:04:22:a0:
-                    d4:0f:5d:e2:79:4f:ea:6c:85:86:bd:a8:a6:ce:e4:
-                    fa:c3:e1:b3:ae:de:3c:51:ee:cb:13:7c:01:7f:84:
-                    0e:5d:51:94:9e:13:0c:b6:2e:a5:4c:f9:39:70:36:
-                    6f:96:ca:2e:0c:44:55:c5:ca:fa:5d:02:a3:df:d6:
-                    64:8c:5a:b3:01:0a:a9:b5:0a:47:17:ff:ef:91:40:
-                    2a:8e:a1:46:3a:31:98:e5:11:fc:cc:bb:49:56:8a:
-                    fc:b9:d0:61:9a:6f:65:6c:e6:c3:cb:3e:75:49:fe:
-                    8f:a7:e2:89:c5:67:d7:9d:46:13:4e:31:76:3b:24:
-                    b3:9e:11:65:86:ab:7f:ef:1d:d4:f8:bc:e7:ac:5a:
-                    5c:b7:5a:47:5c:55:ce:55:b4:22:71:5b:5b:0b:f0:
-                    cf:dc:a0:61:64:ea:a9:d7:68:0a:63:a7:e0:0d:3f:
-                    a0:af:d3:aa:d2:7e:ef:51:a0:e6:51:2b:55:92:15:
-                    17:53:cb:b7:66:0e:66:4c:f8:f9:75:4c:90:e7:12:
-                    70:c7:45
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                2E:E3:DB:B2:49:D0:9C:54:79:5C:FA:27:2A:FE:CC:4E:D2:E8:4E:54
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Authority Key Identifier: 
-                keyid:2E:E3:DB:B2:49:D0:9C:54:79:5C:FA:27:2A:FE:CC:4E:D2:E8:4E:54
-
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-    Signature Algorithm: sha256WithRSAEncryption
-         05:37:3a:f4:4d:b7:45:e2:45:75:24:8f:b6:77:52:e8:1c:d8:
-         10:93:65:f3:f2:59:06:a4:3e:1e:29:ec:5d:d1:d0:ab:7c:e0:
-         0a:90:48:78:ed:4e:98:03:99:fe:28:60:91:1d:30:1d:b8:63:
-         7c:a8:e6:35:b5:fa:d3:61:76:e6:d6:07:4b:ca:69:9a:b2:84:
-         7a:77:93:45:17:15:9f:24:d0:98:13:12:ff:bb:a0:2e:fd:4e:
-         4c:87:f8:ce:5c:aa:98:1b:05:e0:00:46:4a:82:80:a5:33:8b:
-         28:dc:ed:38:d3:df:e5:3e:e9:fe:fb:59:dd:61:84:4f:d2:54:
-         96:13:61:13:3e:8f:80:69:be:93:47:b5:35:43:d2:5a:bb:3d:
-         5c:ef:b3:42:47:cd:3b:55:13:06:b0:09:db:fd:63:f6:3a:88:
-         0a:99:6f:7e:e1:ce:1b:53:6a:44:66:23:51:08:7b:bc:5b:52:
-         a2:fd:06:37:38:40:61:8f:4a:96:b8:90:37:f8:66:c7:78:90:
-         00:15:2e:8b:ad:51:35:53:07:a8:6b:68:ae:f9:4e:3c:07:26:
-         cd:08:05:70:cc:39:3f:76:bd:a5:d3:67:26:01:86:a6:53:d2:
-         60:3b:7c:43:7f:55:8a:bc:95:1a:c1:28:39:4c:1f:43:d2:91:
-         f4:72:59:8a:b9:56:fc:3f:b4:9d:da:70:9c:76:5a:8c:43:50:
-         ee:8e:30:72:4d:df:ff:49:f7:c6:a9:67:d9:6d:ac:02:11:e2:
-         3a:16:25:a7:58:08:cb:6f:53:41:9c:48:38:47:68:33:d1:d7:
-         c7:8f:d4:74:21:d4:c3:05:90:7a:ff:ce:96:88:b1:15:29:5d:
-         23:ab:d0:60:a1:12:4f:de:f4:17:cd:32:e5:c9:bf:c8:43:ad:
-         fd:2e:8e:f1:af:e2:f4:98:fa:12:1f:20:d8:c0:a7:0c:85:c5:
-         90:f4:3b:2d:96:26:b1:2c:be:4c:ab:eb:b1:d2:8a:c9:db:78:
-         13:0f:1e:09:9d:6d:8f:00:9f:02:da:c1:fa:1f:7a:7a:09:c4:
-         4a:e6:88:2a:97:9f:89:8b:fd:37:5f:5f:3a:ce:38:59:86:4b:
-         af:71:0b:b4:d8:f2:70:4f:9f:32:13:e3:b0:a7:57:e5:da:da:
-         43:cb:84:34:f2:28:c4:ea:6d:f4:2a:ef:c1:6b:76:da:fb:7e:
-         bb:85:3c:d2:53:c2:4d:be:71:e1:45:d1:fd:23:67:0d:13:75:
-         fb:cf:65:67:22:9d:ae:b0:09:d1:09:ff:1d:34:bf:fe:23:97:
-         37:d2:39:fa:3d:0d:06:0b:b4:db:3b:a3:ab:6f:5c:1d:b6:7e:
-         e8:b3:82:34:ed:06:5c:24
------BEGIN CERTIFICATE-----
-MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV
-BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC
-aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV
-BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1
-Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz
-MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+
-BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp
-em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
-ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY
-B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH
-D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF
-Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo
-q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D
-k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH
-fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut
-dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM
-ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8
-zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
-rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX
-U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6
-Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5
-XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF
-Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR
-HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY
-GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c
-77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3
-+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK
-vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6
-FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl
-yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P
-AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD
-y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d
-NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA==
------END CERTIFICATE-----
-
-# ebd41040e4bb3ec742c9e381d31ef2a41a48b6685c96e7cef3c1df6cd4331c99
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            04:00:00:00:00:01:15:4b:5a:c3:94
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA
-        Validity
-            Not Before: Sep  1 12:00:00 1998 GMT
-            Not After : Jan 28 12:00:00 2028 GMT
-        Subject: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:da:0e:e6:99:8d:ce:a3:e3:4f:8a:7e:fb:f1:8b:
-                    83:25:6b:ea:48:1f:f1:2a:b0:b9:95:11:04:bd:f0:
-                    63:d1:e2:67:66:cf:1c:dd:cf:1b:48:2b:ee:8d:89:
-                    8e:9a:af:29:80:65:ab:e9:c7:2d:12:cb:ab:1c:4c:
-                    70:07:a1:3d:0a:30:cd:15:8d:4f:f8:dd:d4:8c:50:
-                    15:1c:ef:50:ee:c4:2e:f7:fc:e9:52:f2:91:7d:e0:
-                    6d:d5:35:30:8e:5e:43:73:f2:41:e9:d5:6a:e3:b2:
-                    89:3a:56:39:38:6f:06:3c:88:69:5b:2a:4d:c5:a7:
-                    54:b8:6c:89:cc:9b:f9:3c:ca:e5:fd:89:f5:12:3c:
-                    92:78:96:d6:dc:74:6e:93:44:61:d1:8d:c7:46:b2:
-                    75:0e:86:e8:19:8a:d5:6d:6c:d5:78:16:95:a2:e9:
-                    c8:0a:38:eb:f2:24:13:4f:73:54:93:13:85:3a:1b:
-                    bc:1e:34:b5:8b:05:8c:b9:77:8b:b1:db:1f:20:91:
-                    ab:09:53:6e:90:ce:7b:37:74:b9:70:47:91:22:51:
-                    63:16:79:ae:b1:ae:41:26:08:c8:19:2b:d1:46:aa:
-                    48:d6:64:2a:d7:83:34:ff:2c:2a:c1:6c:19:43:4a:
-                    07:85:e7:d3:7c:f6:21:68:ef:ea:f2:52:9f:7f:93:
-                    90:cf
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                60:7B:66:1A:45:0D:97:CA:89:50:2F:7D:04:CD:34:A8:FF:FC:FD:4B
-    Signature Algorithm: sha1WithRSAEncryption
-         d6:73:e7:7c:4f:76:d0:8d:bf:ec:ba:a2:be:34:c5:28:32:b5:
-         7c:fc:6c:9c:2c:2b:bd:09:9e:53:bf:6b:5e:aa:11:48:b6:e5:
-         08:a3:b3:ca:3d:61:4d:d3:46:09:b3:3e:c3:a0:e3:63:55:1b:
-         f2:ba:ef:ad:39:e1:43:b9:38:a3:e6:2f:8a:26:3b:ef:a0:50:
-         56:f9:c6:0a:fd:38:cd:c4:0b:70:51:94:97:98:04:df:c3:5f:
-         94:d5:15:c9:14:41:9c:c4:5d:75:64:15:0d:ff:55:30:ec:86:
-         8f:ff:0d:ef:2c:b9:63:46:f6:aa:fc:df:bc:69:fd:2e:12:48:
-         64:9a:e0:95:f0:a6:ef:29:8f:01:b1:15:b5:0c:1d:a5:fe:69:
-         2c:69:24:78:1e:b3:a7:1c:71:62:ee:ca:c8:97:ac:17:5d:8a:
-         c2:f8:47:86:6e:2a:c4:56:31:95:d0:67:89:85:2b:f9:6c:a6:
-         5d:46:9d:0c:aa:82:e4:99:51:dd:70:b7:db:56:3d:61:e4:6a:
-         e1:5c:d6:f6:fe:3d:de:41:cc:07:ae:63:52:bf:53:53:f4:2b:
-         e9:c7:fd:b6:f7:82:5f:85:d2:41:18:db:81:b3:04:1c:c5:1f:
-         a4:80:6f:15:20:c9:de:0c:88:0a:1d:d6:66:55:e2:fc:48:c9:
-         29:26:69:e0
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
-A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
-b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
-MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
-YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
-aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
-jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
-xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
-1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
-snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
-U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
-9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
-BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
-AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
-yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
-38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
-AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
-DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
-HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
------END CERTIFICATE-----
-
-# cbb522d7b7f127ad6a0113865bdf1cd4102e7d0759af635a7cf4720dc963c53b
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            04:00:00:00:00:01:21:58:53:08:a2
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: OU=GlobalSign Root CA - R3, O=GlobalSign, CN=GlobalSign
-        Validity
-            Not Before: Mar 18 10:00:00 2009 GMT
-            Not After : Mar 18 10:00:00 2029 GMT
-        Subject: OU=GlobalSign Root CA - R3, O=GlobalSign, CN=GlobalSign
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:cc:25:76:90:79:06:78:22:16:f5:c0:83:b6:84:
-                    ca:28:9e:fd:05:76:11:c5:ad:88:72:fc:46:02:43:
-                    c7:b2:8a:9d:04:5f:24:cb:2e:4b:e1:60:82:46:e1:
-                    52:ab:0c:81:47:70:6c:dd:64:d1:eb:f5:2c:a3:0f:
-                    82:3d:0c:2b:ae:97:d7:b6:14:86:10:79:bb:3b:13:
-                    80:77:8c:08:e1:49:d2:6a:62:2f:1f:5e:fa:96:68:
-                    df:89:27:95:38:9f:06:d7:3e:c9:cb:26:59:0d:73:
-                    de:b0:c8:e9:26:0e:83:15:c6:ef:5b:8b:d2:04:60:
-                    ca:49:a6:28:f6:69:3b:f6:cb:c8:28:91:e5:9d:8a:
-                    61:57:37:ac:74:14:dc:74:e0:3a:ee:72:2f:2e:9c:
-                    fb:d0:bb:bf:f5:3d:00:e1:06:33:e8:82:2b:ae:53:
-                    a6:3a:16:73:8c:dd:41:0e:20:3a:c0:b4:a7:a1:e9:
-                    b2:4f:90:2e:32:60:e9:57:cb:b9:04:92:68:68:e5:
-                    38:26:60:75:b2:9f:77:ff:91:14:ef:ae:20:49:fc:
-                    ad:40:15:48:d1:02:31:61:19:5e:b8:97:ef:ad:77:
-                    b7:64:9a:7a:bf:5f:c1:13:ef:9b:62:fb:0d:6c:e0:
-                    54:69:16:a9:03:da:6e:e9:83:93:71:76:c6:69:85:
-                    82:17
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                8F:F0:4B:7F:A8:2E:45:24:AE:4D:50:FA:63:9A:8B:DE:E2:DD:1B:BC
-    Signature Algorithm: sha256WithRSAEncryption
-         4b:40:db:c0:50:aa:fe:c8:0c:ef:f7:96:54:45:49:bb:96:00:
-         09:41:ac:b3:13:86:86:28:07:33:ca:6b:e6:74:b9:ba:00:2d:
-         ae:a4:0a:d3:f5:f1:f1:0f:8a:bf:73:67:4a:83:c7:44:7b:78:
-         e0:af:6e:6c:6f:03:29:8e:33:39:45:c3:8e:e4:b9:57:6c:aa:
-         fc:12:96:ec:53:c6:2d:e4:24:6c:b9:94:63:fb:dc:53:68:67:
-         56:3e:83:b8:cf:35:21:c3:c9:68:fe:ce:da:c2:53:aa:cc:90:
-         8a:e9:f0:5d:46:8c:95:dd:7a:58:28:1a:2f:1d:de:cd:00:37:
-         41:8f:ed:44:6d:d7:53:28:97:7e:f3:67:04:1e:15:d7:8a:96:
-         b4:d3:de:4c:27:a4:4c:1b:73:73:76:f4:17:99:c2:1f:7a:0e:
-         e3:2d:08:ad:0a:1c:2c:ff:3c:ab:55:0e:0f:91:7e:36:eb:c3:
-         57:49:be:e1:2e:2d:7c:60:8b:c3:41:51:13:23:9d:ce:f7:32:
-         6b:94:01:a8:99:e7:2c:33:1f:3a:3b:25:d2:86:40:ce:3b:2c:
-         86:78:c9:61:2f:14:ba:ee:db:55:6f:df:84:ee:05:09:4d:bd:
-         28:d8:72:ce:d3:62:50:65:1e:eb:92:97:83:31:d9:b3:b5:ca:
-         47:58:3f:5f
------BEGIN CERTIFICATE-----
-MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
-A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
-Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
-MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
-A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
-RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
-gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
-KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
-QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
-XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
-DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
-LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
-RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
-jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
-6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
-mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
-Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
-WD9f
------END CERTIFICATE-----
-
-# 179fbc148a3dd00fd24ea13458cc43bfa7f59c8182d783a513f6ebec100c8924
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            60:59:49:e0:26:2e:bb:55:f9:0a:77:8a:71:f9:4a:d8:6c
-    Signature Algorithm: ecdsa-with-SHA384
-        Issuer: OU=GlobalSign ECC Root CA - R5, O=GlobalSign, CN=GlobalSign
-        Validity
-            Not Before: Nov 13 00:00:00 2012 GMT
-            Not After : Jan 19 03:14:07 2038 GMT
-        Subject: OU=GlobalSign ECC Root CA - R5, O=GlobalSign, CN=GlobalSign
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub: 
-                    04:47:45:0e:96:fb:7d:5d:bf:e9:39:d1:21:f8:9f:
-                    0b:b6:d5:7b:1e:92:3a:48:59:1c:f0:62:31:2d:c0:
-                    7a:28:fe:1a:a7:5c:b3:b6:cc:97:e7:45:d4:58:fa:
-                    d1:77:6d:43:a2:c0:87:65:34:0a:1f:7a:dd:eb:3c:
-                    33:a1:c5:9d:4d:a4:6f:41:95:38:7f:c9:1e:84:eb:
-                    d1:9e:49:92:87:94:87:0c:3a:85:4a:66:9f:9d:59:
-                    93:4d:97:61:06:86:4a
-                ASN1 OID: secp384r1
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                3D:E6:29:48:9B:EA:07:CA:21:44:4A:26:DE:6E:DE:D2:83:D0:9F:59
-    Signature Algorithm: ecdsa-with-SHA384
-         30:65:02:31:00:e5:69:12:c9:6e:db:c6:31:ba:09:41:e1:97:
-         f8:fb:fd:9a:e2:7d:12:c9:ed:7c:64:d3:cb:05:25:8b:56:d9:
-         a0:e7:5e:5d:4e:0b:83:9c:5b:76:29:a0:09:26:21:6a:62:02:
-         30:71:d2:b5:8f:5c:ea:3b:e1:78:09:85:a8:75:92:3b:c8:5c:
-         fd:48:ef:0d:74:22:a8:08:e2:6e:c5:49:ce:c7:0c:bc:a7:61:
-         69:f1:f7:3b:e1:2a:cb:f9:2b:f3:66:90:37
------BEGIN CERTIFICATE-----
-MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk
-MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH
-bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX
-DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD
-QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu
-MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc
-8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke
-hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI
-KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg
-515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO
-xwy8p2Fp8fc74SrL+SvzZpA3
------END CERTIFICATE-----
-
-# 9a296a5182d1d451a2e37f439b74daafa267523329f90f9a0d2007c334e23c9a
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            5a:4b:bd:5a:fb:4f:8a:5b:fa:65:e5
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = AT, O = e-commerce monitoring GmbH, CN = GLOBALTRUST 2020
-        Validity
-            Not Before: Feb 10 00:00:00 2020 GMT
-            Not After : Jun 10 00:00:00 2040 GMT
-        Subject: C = AT, O = e-commerce monitoring GmbH, CN = GLOBALTRUST 2020
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (4096 bit)
-                Modulus:
-                    00:ae:2e:56:ad:1b:1c:ef:f6:95:8f:a0:77:1b:2b:
-                    d3:63:8f:84:4d:45:a2:0f:9f:5b:45:ab:59:7b:51:
-                    34:f9:ec:8b:8a:78:c5:dd:6b:af:bd:c4:df:93:45:
-                    1e:bf:91:38:0b:ae:0e:16:e7:41:73:f8:db:bb:d1:
-                    b8:51:e0:cb:83:3b:73:38:6e:77:8a:0f:59:63:26:
-                    cd:a7:2a:ce:54:fb:b8:e2:c0:7c:47:ce:60:7c:3f:
-                    b2:73:f2:c0:19:b6:8a:92:87:35:0d:90:28:a2:e4:
-                    15:04:63:3e:ba:af:ee:7c:5e:cc:a6:8b:50:b2:38:
-                    f7:41:63:ca:ce:ff:69:8f:68:0e:95:36:e5:cc:b9:
-                    8c:09:ca:4b:dd:31:90:96:c8:cc:1f:fd:56:96:34:
-                    db:8e:1c:ea:2c:be:85:2e:63:dd:aa:a9:95:d3:fd:
-                    29:95:13:f0:c8:98:93:d9:2d:16:47:90:11:83:a2:
-                    3a:22:a2:28:57:a2:eb:fe:c0:8c:28:a0:a6:7d:e7:
-                    2a:42:3b:82:80:63:a5:63:1f:19:cc:7c:b2:66:a8:
-                    c2:d3:6d:37:6f:e2:7e:06:51:d9:45:84:1f:12:ce:
-                    24:52:64:85:0b:48:80:4e:87:b1:22:22:30:aa:eb:
-                    ae:be:e0:02:e0:40:e8:b0:42:80:03:51:aa:b4:7e:
-                    aa:44:d7:43:61:f3:a2:6b:16:89:49:a4:a3:a4:2b:
-                    8a:02:c4:78:f4:68:8a:c1:e4:7a:36:b1:6f:1b:96:
-                    1b:77:49:8d:d4:c9:06:72:8f:cf:53:e3:dc:17:85:
-                    20:4a:dc:98:27:d3:91:26:2b:47:1e:69:07:af:de:
-                    a2:e4:e4:d4:6b:0b:b3:5e:7c:d4:24:80:47:29:69:
-                    3b:6e:e8:ac:fd:40:eb:d8:ed:71:71:2b:f2:e8:58:
-                    1d:eb:41:97:22:c5:1f:d4:39:d0:27:8f:87:e3:18:
-                    f4:e0:a9:46:0d:f5:74:3a:82:2e:d0:6e:2c:91:a3:
-                    31:5c:3b:46:ea:7b:04:10:56:5e:80:1d:f5:a5:65:
-                    e8:82:fc:e2:07:8c:62:45:f5:20:de:46:70:86:a1:
-                    bc:93:d3:1e:74:a6:6c:b0:2c:f7:03:0c:88:0c:cb:
-                    d4:72:53:86:bc:60:46:f3:98:6a:c2:f1:bf:43:f9:
-                    70:20:77:ca:37:41:79:55:52:63:8d:5b:12:9f:c5:
-                    68:c4:88:9d:ac:f2:30:ab:b7:a3:31:97:67:ad:8f:
-                    17:0f:6c:c7:73:ed:24:94:6b:c8:83:9a:d0:9a:37:
-                    49:04:ab:b1:16:c8:6c:49:49:2d:ab:a1:d0:8c:92:
-                    f2:41:4a:79:21:25:db:63:d7:b6:9c:a7:7e:42:69:
-                    fb:3a:63
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                DC:2E:1F:D1:61:37:79:E4:AB:D5:D5:B3:12:71:68:3D:6A:68:9C:22
-            X509v3 Authority Key Identifier: 
-                keyid:DC:2E:1F:D1:61:37:79:E4:AB:D5:D5:B3:12:71:68:3D:6A:68:9C:22
-
-    Signature Algorithm: sha256WithRSAEncryption
-         91:f0:42:02:68:40:ee:c3:68:c0:54:2f:df:ec:62:c3:c3:9e:
-         8a:a0:31:28:aa:83:8e:a4:56:96:12:10:86:56:ba:97:72:d2:
-         54:30:7c:ad:19:d5:1d:68:6f:fb:14:42:d8:8d:0e:f3:b5:d1:
-         a5:e3:02:42:5e:dc:e8:46:58:07:35:02:30:e0:bc:74:4a:c1:
-         43:2a:ff:db:1a:d0:b0:af:6c:c3:fd:cb:b3:f5:7f:6d:03:2e:
-         59:56:9d:2d:2d:35:8c:b2:d6:43:17:2c:92:0a:cb:5d:e8:8c:
-         0f:4b:70:43:d0:82:ff:a8:cc:bf:a4:94:c0:be:87:bd:8a:e3:
-         93:7b:c6:8f:9b:16:9d:27:65:bc:7a:c5:42:82:6c:5c:07:d0:
-         a9:c1:88:60:44:e9:98:85:16:5f:f8:8f:ca:01:10:ce:25:c3:
-         f9:60:1b:a0:c5:97:c3:d3:2c:88:31:a2:bd:30:ec:d0:d0:c0:
-         12:f1:c1:39:e3:e5:f5:f8:d6:4a:dd:34:cd:fb:6f:c1:4f:e3:
-         00:8b:56:e2:92:f7:28:b2:42:77:72:23:67:c7:3f:11:15:b2:
-         c4:03:05:be:bb:11:7b:0a:bf:a8:6e:e7:ff:58:43:cf:9b:67:
-         a0:80:07:b6:1d:ca:ad:6d:ea:41:11:7e:2d:74:93:fb:c2:bc:
-         be:51:44:c5:ef:68:25:27:80:e3:c8:a0:d4:12:ec:d9:a5:37:
-         1d:37:7c:b4:91:ca:da:d4:b1:96:81:ef:68:5c:76:10:49:af:
-         7e:a5:37:80:b1:1c:52:bd:33:81:4c:8f:f9:dd:65:d9:14:cd:
-         8a:25:58:f4:e2:c5:83:a5:09:90:d4:6c:14:63:b5:40:df:eb:
-         c0:fc:c4:58:7e:0d:14:16:87:54:27:6e:56:e4:70:84:b8:6c:
-         32:12:7e:82:31:43:be:d7:dd:7c:a1:ad:ae:d6:ab:20:12:ef:
-         0a:c3:10:8c:49:96:35:dc:0b:75:5e:b1:4f:d5:4f:34:0e:11:
-         20:07:75:43:45:e9:a3:11:da:ac:a3:99:c2:b6:79:27:e2:b9:
-         ef:c8:e2:f6:35:29:7a:74:fa:c5:7f:82:05:62:a6:0a:ea:68:
-         b2:79:47:06:6e:f2:57:a8:15:33:c6:f7:78:4a:3d:42:7b:6b:
-         7e:fe:f7:46:ea:d1:eb:8e:ef:88:68:5b:e8:c1:d9:71:7e:fd:
-         64:ef:ff:67:47:88:58:25:2f:3e:86:07:bd:fb:a8:e5:82:a8:
-         ac:a5:d3:69:43:cd:31:88:49:84:53:92:c0:b1:39:1b:39:83:
-         01:30:c4:f2:a9:fa:d0:03:bd:72:37:60:56:1f:36:7c:bd:39:
-         91:f5:6d:0d:bf:7b:d7:92
------BEGIN CERTIFICATE-----
-MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkG
-A1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkw
-FwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYx
-MDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAhBgNVBAoTGmUtY29tbWVyY2UgbW9u
-aXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAyMDIwMIICIjANBgkq
-hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWiD59b
-RatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9Z
-YybNpyrOVPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3
-QWPKzv9pj2gOlTblzLmMCcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPw
-yJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCmfecqQjuCgGOlYx8ZzHyyZqjC0203b+J+
-BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKAA1GqtH6qRNdDYfOiaxaJ
-SaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9ORJitHHmkH
-r96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj0
-4KlGDfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9Me
-dKZssCz3AwyIDMvUclOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIw
-q7ejMZdnrY8XD2zHc+0klGvIg5rQmjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2
-nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1UdIwQYMBaAFNwu
-H9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
-VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJC
-XtzoRlgHNQIw4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd
-6IwPS3BD0IL/qMy/pJTAvoe9iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf
-+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS8cE54+X1+NZK3TTN+2/BT+MAi1bi
-kvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2HcqtbepBEX4tdJP7
-wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxSvTOB
-TI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6C
-MUO+1918oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn
-4rnvyOL2NSl6dPrFf4IFYqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+I
-aFvowdlxfv1k7/9nR4hYJS8+hge9+6jlgqispdNpQ80xiEmEU5LAsTkbOYMBMMTy
-qfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
------END CERTIFICATE-----
-
-# c3846bf24b9e93ca64274c0ec67c1ecc5e024ffcacd2d74019350e81fe546ae4
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 0 (0x0)
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
-        Validity
-            Not Before: Jun 29 17:06:20 2004 GMT
-            Not After : Jun 29 17:06:20 2034 GMT
-        Subject: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:de:9d:d7:ea:57:18:49:a1:5b:eb:d7:5f:48:86:
-                    ea:be:dd:ff:e4:ef:67:1c:f4:65:68:b3:57:71:a0:
-                    5e:77:bb:ed:9b:49:e9:70:80:3d:56:18:63:08:6f:
-                    da:f2:cc:d0:3f:7f:02:54:22:54:10:d8:b2:81:d4:
-                    c0:75:3d:4b:7f:c7:77:c3:3e:78:ab:1a:03:b5:20:
-                    6b:2f:6a:2b:b1:c5:88:7e:c4:bb:1e:b0:c1:d8:45:
-                    27:6f:aa:37:58:f7:87:26:d7:d8:2d:f6:a9:17:b7:
-                    1f:72:36:4e:a6:17:3f:65:98:92:db:2a:6e:5d:a2:
-                    fe:88:e0:0b:de:7f:e5:8d:15:e1:eb:cb:3a:d5:e2:
-                    12:a2:13:2d:d8:8e:af:5f:12:3d:a0:08:05:08:b6:
-                    5c:a5:65:38:04:45:99:1e:a3:60:60:74:c5:41:a5:
-                    72:62:1b:62:c5:1f:6f:5f:1a:42:be:02:51:65:a8:
-                    ae:23:18:6a:fc:78:03:a9:4d:7f:80:c3:fa:ab:5a:
-                    fc:a1:40:a4:ca:19:16:fe:b2:c8:ef:5e:73:0d:ee:
-                    77:bd:9a:f6:79:98:bc:b1:07:67:a2:15:0d:dd:a0:
-                    58:c6:44:7b:0a:3e:62:28:5f:ba:41:07:53:58:cf:
-                    11:7e:38:74:c5:f8:ff:b5:69:90:8f:84:74:ea:97:
-                    1b:af
-                Exponent: 3 (0x3)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3
-            X509v3 Authority Key Identifier: 
-                keyid:D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3
-                DirName:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
-                serial:00
-
-            X509v3 Basic Constraints: 
-                CA:TRUE
-    Signature Algorithm: sha1WithRSAEncryption
-         32:4b:f3:b2:ca:3e:91:fc:12:c6:a1:07:8c:8e:77:a0:33:06:
-         14:5c:90:1e:18:f7:08:a6:3d:0a:19:f9:87:80:11:6e:69:e4:
-         96:17:30:ff:34:91:63:72:38:ee:cc:1c:01:a3:1d:94:28:a4:
-         31:f6:7a:c4:54:d7:f6:e5:31:58:03:a2:cc:ce:62:db:94:45:
-         73:b5:bf:45:c9:24:b5:d5:82:02:ad:23:79:69:8d:b8:b6:4d:
-         ce:cf:4c:ca:33:23:e8:1c:88:aa:9d:8b:41:6e:16:c9:20:e5:
-         89:9e:cd:3b:da:70:f7:7e:99:26:20:14:54:25:ab:6e:73:85:
-         e6:9b:21:9d:0a:6c:82:0e:a8:f8:c2:0c:fa:10:1e:6c:96:ef:
-         87:0d:c4:0f:61:8b:ad:ee:83:2b:95:f8:8e:92:84:72:39:eb:
-         20:ea:83:ed:83:cd:97:6e:08:bc:eb:4e:26:b6:73:2b:e4:d3:
-         f6:4c:fe:26:71:e2:61:11:74:4a:ff:57:1a:87:0f:75:48:2e:
-         cf:51:69:17:a0:02:12:61:95:d5:d1:40:b2:10:4c:ee:c4:ac:
-         10:43:a6:a5:9e:0a:d5:95:62:9a:0d:cf:88:82:c5:32:0c:e4:
-         2b:9f:45:e6:0d:9f:28:9c:b1:b9:2a:5a:57:ad:37:0f:af:1d:
-         7f:db:bd:9f
------BEGIN CERTIFICATE-----
-MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
-MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
-YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
-MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
-ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
-MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
-ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
-PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
-wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
-EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
-avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
-YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
-sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
-/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
-IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
-YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
-ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
-OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
-TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
-HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
-dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
-ReYNnyicsbkqWletNw+vHX/bvZ8=
------END CERTIFICATE-----
-
-# 45140b3247eb9cc8c5b4f0d7b53091f73292089e6e5a63e2749dd3aca9198eda
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 0 (0x0)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2
-        Validity
-            Not Before: Sep  1 00:00:00 2009 GMT
-            Not After : Dec 31 23:59:59 2037 GMT
-        Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:bf:71:62:08:f1:fa:59:34:f7:1b:c9:18:a3:f7:
-                    80:49:58:e9:22:83:13:a6:c5:20:43:01:3b:84:f1:
-                    e6:85:49:9f:27:ea:f6:84:1b:4e:a0:b4:db:70:98:
-                    c7:32:01:b1:05:3e:07:4e:ee:f4:fa:4f:2f:59:30:
-                    22:e7:ab:19:56:6b:e2:80:07:fc:f3:16:75:80:39:
-                    51:7b:e5:f9:35:b6:74:4e:a9:8d:82:13:e4:b6:3f:
-                    a9:03:83:fa:a2:be:8a:15:6a:7f:de:0b:c3:b6:19:
-                    14:05:ca:ea:c3:a8:04:94:3b:46:7c:32:0d:f3:00:
-                    66:22:c8:8d:69:6d:36:8c:11:18:b7:d3:b2:1c:60:
-                    b4:38:fa:02:8c:ce:d3:dd:46:07:de:0a:3e:eb:5d:
-                    7c:c8:7c:fb:b0:2b:53:a4:92:62:69:51:25:05:61:
-                    1a:44:81:8c:2c:a9:43:96:23:df:ac:3a:81:9a:0e:
-                    29:c5:1c:a9:e9:5d:1e:b6:9e:9e:30:0a:39:ce:f1:
-                    88:80:fb:4b:5d:cc:32:ec:85:62:43:25:34:02:56:
-                    27:01:91:b4:3b:70:2a:3f:6e:b1:e8:9c:88:01:7d:
-                    9f:d4:f9:db:53:6d:60:9d:bf:2c:e7:58:ab:b8:5f:
-                    46:fc:ce:c4:1b:03:3c:09:eb:49:31:5c:69:46:b3:
-                    e0:47
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE
-    Signature Algorithm: sha256WithRSAEncryption
-         99:db:5d:79:d5:f9:97:59:67:03:61:f1:7e:3b:06:31:75:2d:
-         a1:20:8e:4f:65:87:b4:f7:a6:9c:bc:d8:e9:2f:d0:db:5a:ee:
-         cf:74:8c:73:b4:38:42:da:05:7b:f8:02:75:b8:fd:a5:b1:d7:
-         ae:f6:d7:de:13:cb:53:10:7e:8a:46:d1:97:fa:b7:2e:2b:11:
-         ab:90:b0:27:80:f9:e8:9f:5a:e9:37:9f:ab:e4:df:6c:b3:85:
-         17:9d:3d:d9:24:4f:79:91:35:d6:5f:04:eb:80:83:ab:9a:02:
-         2d:b5:10:f4:d8:90:c7:04:73:40:ed:72:25:a0:a9:9f:ec:9e:
-         ab:68:12:99:57:c6:8f:12:3a:09:a4:bd:44:fd:06:15:37:c1:
-         9b:e4:32:a3:ed:38:e8:d8:64:f3:2c:7e:14:fc:02:ea:9f:cd:
-         ff:07:68:17:db:22:90:38:2d:7a:8d:d1:54:f1:69:e3:5f:33:
-         ca:7a:3d:7b:0a:e3:ca:7f:5f:39:e5:e2:75:ba:c5:76:18:33:
-         ce:2c:f0:2f:4c:ad:f7:b1:e7:ce:4f:a8:c4:9b:4a:54:06:c5:
-         7f:7d:d5:08:0f:e2:1c:fe:7e:17:b8:ac:5e:f6:d4:16:b2:43:
-         09:0c:4d:f6:a7:6b:b4:99:84:65:ca:7a:88:e2:e2:44:be:5c:
-         f7:ea:1c:f5
------BEGIN CERTIFICATE-----
-MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
-EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
-ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
-NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
-EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
-AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
-E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
-/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
-DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
-GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
-tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
-AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
-FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
-WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
-9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
-gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
-2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
-LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
-4uJEvlz36hz1
------END CERTIFICATE-----
-
-# 3f99cc474acfce4dfed58794665e478d1547739f2e780f1bb4ca9b133097d401
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            67:74:9d:8d:77:d8:3b:6a:db:22:f4:ff:59:e2:bf:ce
-        Signature Algorithm: ecdsa-with-SHA384
-        Issuer: C = GR, O = Hellenic Academic and Research Institutions CA, CN = HARICA TLS ECC Root CA 2021
-        Validity
-            Not Before: Feb 19 11:01:10 2021 GMT
-            Not After : Feb 13 11:01:09 2045 GMT
-        Subject: C = GR, O = Hellenic Academic and Research Institutions CA, CN = HARICA TLS ECC Root CA 2021
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub:
-                    04:38:08:fe:b1:a0:96:d2:7a:ac:af:49:3a:d0:c0:
-                    e0:c3:3b:28:aa:f1:72:6d:65:00:47:88:84:fc:9a:
-                    26:6b:aa:4b:ba:6c:04:0a:88:5e:17:f2:55:87:fc:
-                    30:b0:34:e2:34:58:57:1a:84:53:e9:30:d9:a9:f2:
-                    96:74:c3:51:1f:58:49:31:cc:98:4e:60:11:87:75:
-                    d3:72:94:90:4f:9b:10:25:2a:a8:78:2d:be:90:41:
-                    58:90:15:72:a7:a1:b7
-                ASN1 OID: secp384r1
-                NIST CURVE: P-384
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                C9:1B:53:81:12:FE:04:D5:16:D1:AA:BC:9A:6F:B7:A0:95:19:6E:CA
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-    Signature Algorithm: ecdsa-with-SHA384
-         30:64:02:30:11:de:ae:f8:dc:4e:88:b0:a9:f0:22:ad:c2:51:
-         40:ef:60:71:2d:ee:8f:02:c4:5d:03:70:49:a4:92:ea:c5:14:
-         88:70:a6:d3:0d:b0:aa:ca:2c:40:9c:fb:e9:82:6e:9a:02:30:
-         2b:47:9a:07:c6:d1:c2:81:7c:ca:0b:96:18:41:1b:a3:f4:30:
-         09:9e:b5:23:28:0d:9f:14:b6:3c:53:a2:4c:06:69:7d:fa:6c:
-         91:c6:2a:49:45:e6:ec:b7:13:e1:3a:6c
------BEGIN CERTIFICATE-----
-MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw
-CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh
-cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v
-dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG
-A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
-aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg
-Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7
-KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y
-STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD
-AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw
-SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN
-nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
------END CERTIFICATE-----
-
-# d95d0e8eda79525bf9beb11b14d2100d3294985f0c62d9fabd9cd999eccb7b1d
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            39:ca:93:1c:ef:43:f3:c6:8e:93:c7:f4:64:89:38:7e
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = GR, O = Hellenic Academic and Research Institutions CA, CN = HARICA TLS RSA Root CA 2021
-        Validity
-            Not Before: Feb 19 10:55:38 2021 GMT
-            Not After : Feb 13 10:55:37 2045 GMT
-        Subject: C = GR, O = Hellenic Academic and Research Institutions CA, CN = HARICA TLS RSA Root CA 2021
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (4096 bit)
-                Modulus:
-                    00:8b:c2:e7:af:65:9b:05:67:96:c9:0d:24:b9:d0:
-                    0e:64:fc:ce:e2:24:18:2c:84:7f:77:51:cb:04:11:
-                    36:b8:5e:ed:69:71:a7:9e:e4:25:09:97:67:c1:47:
-                    c2:cf:91:16:36:62:3d:38:04:e1:51:82:ff:ac:d2:
-                    b4:69:dd:2e:ec:11:a3:45:ee:6b:6b:3b:4c:bf:8c:
-                    8d:a4:1e:9d:11:b9:e9:38:f9:7a:0e:0c:98:e2:23:
-                    1d:d1:4e:63:d4:e7:b8:41:44:fb:6b:af:6b:da:1f:
-                    d3:c5:91:88:5b:a4:89:92:d1:81:e6:8c:39:58:a0:
-                    d6:69:43:a9:ad:98:52:58:6e:db:0a:fb:6b:cf:68:
-                    fa:e3:a4:5e:3a:45:73:98:07:ea:5f:02:72:de:0c:
-                    a5:b3:9f:ae:a9:1d:b7:1d:b3:fc:8a:59:e7:6e:72:
-                    65:ad:f5:30:94:23:07:f3:82:16:4b:35:98:9c:53:
-                    bb:2f:ca:e4:5a:d9:c7:8d:1d:fc:98:99:fb:2c:a4:
-                    82:6b:f0:2a:1f:8e:0b:5f:71:5c:5c:ae:42:7b:29:
-                    89:81:cb:03:a3:99:ca:88:9e:0b:40:09:41:33:db:
-                    e6:58:7a:fd:ae:99:70:c0:5a:0f:d6:13:86:71:2f:
-                    76:69:fc:90:dd:db:2d:6e:d1:f2:9b:f5:1a:6b:9e:
-                    6f:15:8c:7a:f0:4b:28:a0:22:38:80:24:6c:36:a4:
-                    3b:f2:30:91:f3:78:13:cf:c1:3f:35:ab:f1:1d:11:
-                    23:b5:43:22:9e:01:92:b7:18:02:e5:11:d1:82:db:
-                    15:00:cc:61:37:c1:2a:7c:9a:e1:d0:ba:b3:50:46:
-                    ee:82:ac:9d:31:f8:fb:23:e2:03:00:48:70:a3:09:
-                    26:79:15:53:60:f3:38:5c:ad:38:ea:81:00:63:14:
-                    b9:33:5e:dd:0b:db:a0:45:07:1a:33:09:f8:4d:b4:
-                    a7:02:a6:69:f4:c2:59:05:88:65:85:56:ae:4b:cb:
-                    e0:de:3c:7d:2d:1a:c8:e9:fb:1f:a3:61:4a:d6:2a:
-                    13:ad:77:4c:1a:18:9b:91:0f:58:d8:06:54:c5:97:
-                    f8:aa:3f:20:8a:a6:85:a6:77:f6:a6:fc:1c:e2:ee:
-                    6e:94:33:2a:83:50:84:0a:e5:4f:86:f8:50:45:78:
-                    00:81:eb:5b:68:e3:26:8d:cc:7b:5c:51:f4:14:2c:
-                    40:be:1a:60:1d:7a:72:61:1d:1f:63:2d:88:aa:ce:
-                    a2:45:90:08:fc:6b:be:b3:50:2a:5a:fd:a8:48:18:
-                    46:d6:90:40:92:90:0a:84:5e:68:31:f8:eb:ed:0d:
-                    d3:1d:c6:7d:99:18:55:56:27:65:2e:8d:45:c5:24:
-                    ec:ce:e3
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                0A:48:23:A6:60:A4:92:0A:33:EA:93:5B:C5:57:EA:25:4D:BD:12:EE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-    Signature Algorithm: sha256WithRSAEncryption
-         3e:90:48:aa:6e:62:15:25:66:7b:0c:d5:8c:8b:89:9d:d7:ed:
-         4e:07:ef:9c:d0:14:5f:5e:50:bd:68:96:90:a4:14:11:aa:68:
-         6d:09:35:39:40:09:da:f4:09:2c:34:a5:7b:59:84:49:29:97:
-         74:c8:07:1e:47:6d:f2:ce:1c:50:26:e3:9e:3d:40:53:3f:f7:
-         7f:96:76:10:c5:46:a5:d0:20:4b:50:f4:35:3b:18:f4:55:6a:
-         41:1b:47:06:68:3c:bb:09:08:62:d9:5f:55:42:aa:ac:53:85:
-         ac:95:56:36:56:ab:e4:05:8c:c5:a8:da:1f:a3:69:bd:53:0f:
-         c4:ff:dc:ca:e3:7e:f2:4c:88:86:47:46:1a:f3:00:f5:80:91:
-         a2:dc:43:42:94:9b:20:f0:d1:cd:b2:eb:2c:53:c2:53:78:4a:
-         4f:04:94:41:9a:8f:27:32:c1:e5:49:19:bf:f1:f2:c2:8b:a8:
-         0a:39:31:28:b4:7d:62:36:2c:4d:ec:1f:33:b6:7e:77:6d:7e:
-         50:f0:9f:0e:d7:11:8f:cf:18:c5:e3:27:fe:26:ef:05:9d:cf:
-         cf:37:c5:d0:7b:da:3b:b0:16:84:0c:3a:93:d6:be:17:db:0f:
-         3e:0e:19:78:09:c7:a9:02:72:22:4b:f7:37:76:ba:75:c4:85:
-         03:5a:63:d5:b1:75:05:c2:b9:bd:94:ad:8c:15:99:a7:93:7d:
-         f6:c5:f3:aa:74:cf:04:85:94:98:00:f4:e2:f9:ca:24:65:bf:
-         e0:62:af:c8:c5:fa:b2:c9:9e:56:48:da:79:fd:96:76:15:be:
-         a3:8e:56:c4:b3:34:fc:be:47:f4:c1:b4:a8:fc:d5:30:88:68:
-         ee:cb:ae:c9:63:c4:76:be:ac:38:18:e1:5e:5c:cf:ae:3a:22:
-         51:eb:d1:8b:b3:f3:2b:33:07:54:87:fa:b4:b2:13:7b:ba:53:
-         04:62:01:9d:f1:c0:4f:ee:e1:3a:d4:8b:20:10:fa:02:57:e6:
-         ef:c1:0b:b7:90:46:9c:19:29:8c:dc:6f:a0:4a:69:69:94:b7:
-         24:65:a0:ff:ac:3f:ce:01:fb:21:2e:fd:68:f8:9b:f2:a5:cf:
-         31:38:5c:15:aa:e6:97:00:c1:df:5a:a5:a7:39:aa:e9:84:7f:
-         3c:51:a8:3a:d9:94:5b:8c:bf:4f:08:71:e5:db:a8:5c:d4:d2:
-         a6:fe:00:a3:c6:16:c7:0f:e8:80:ce:1c:28:64:74:19:08:d3:
-         42:e3:ce:00:5d:7f:b1:dc:13:b0:e1:05:cb:d1:20:aa:86:74:
-         9e:39:e7:91:fd:ff:5b:d6:f7:ad:a6:2f:03:0b:6d:e3:57:54:
-         eb:76:53:18:8d:11:98:ba
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs
-MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
-c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg
-Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL
-MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
-YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv
-b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l
-mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE
-4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv
-a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M
-pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw
-Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b
-LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY
-AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB
-AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq
-E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr
-W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ
-CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE
-AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU
-X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3
-f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja
-H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP
-JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P
-zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt
-jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0
-/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT
-BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79
-aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW
-xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU
-63ZTGI0RmLo=
------END CERTIFICATE-----
-
-# 44b545aa8a25e65a73ca15dc27fc36d24c1cb9953a066539b11582dc487b4833
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 0 (0x0)
-        Signature Algorithm: ecdsa-with-SHA256
-        Issuer: C = GR, L = Athens, O = Hellenic Academic and Research Institutions Cert. Authority, CN = Hellenic Academic and Research Institutions ECC RootCA 2015
-        Validity
-            Not Before: Jul  7 10:37:12 2015 GMT
-            Not After : Jun 30 10:37:12 2040 GMT
-        Subject: C = GR, L = Athens, O = Hellenic Academic and Research Institutions Cert. Authority, CN = Hellenic Academic and Research Institutions ECC RootCA 2015
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub:
-                    04:92:a0:41:e8:4b:82:84:5c:e2:f8:31:11:99:86:
-                    64:4e:09:25:2f:9d:41:2f:0a:ae:35:4f:74:95:b2:
-                    51:64:6b:8d:6b:e6:3f:70:95:f0:05:44:47:a6:72:
-                    38:50:76:95:02:5a:8e:ae:28:9e:f9:2d:4e:99:ef:
-                    2c:48:6f:4c:25:29:e8:d1:71:5b:df:1d:c1:75:37:
-                    b4:d7:fa:7b:7a:42:9c:6a:0a:56:5a:7c:69:0b:aa:
-                    80:09:24:6c:7e:c1:46
-                ASN1 OID: secp384r1
-                NIST CURVE: P-384
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                B4:22:0B:82:99:24:01:0E:9C:BB:E4:0E:FD:BF:FB:97:20:93:99:2A
-    Signature Algorithm: ecdsa-with-SHA256
-         30:64:02:30:67:ce:16:62:38:a2:ac:62:45:a7:a9:95:24:c0:
-         1a:27:9c:32:3b:c0:c0:d5:ba:a9:e7:f8:04:43:53:85:ee:52:
-         21:de:9d:f5:25:83:3e:9e:58:4b:2f:d7:67:13:0e:21:02:30:
-         05:e1:75:01:de:68:ed:2a:1f:4d:4c:09:08:0d:ec:4b:ad:64:
-         17:28:e7:75:ce:45:65:72:21:17:cb:22:41:0e:8c:13:98:38:
-         9a:54:6d:9b:ca:e2:7c:ea:02:58:22:91
------BEGIN CERTIFICATE-----
-MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN
-BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
-c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl
-bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv
-b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ
-BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj
-YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5
-MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0
-dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg
-QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa
-jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC
-MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi
-C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep
-lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof
-TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
------END CERTIFICATE-----
-
-# a040929a02ce53b4acf4f2ffc6981ce4496f755e6d45fe0b2a692bcd52523f36
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 0 (0x0)
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = GR, L = Athens, O = Hellenic Academic and Research Institutions Cert. Authority, CN = Hellenic Academic and Research Institutions RootCA 2015
-        Validity
-            Not Before: Jul  7 10:11:21 2015 GMT
-            Not After : Jun 30 10:11:21 2040 GMT
-        Subject: C = GR, L = Athens, O = Hellenic Academic and Research Institutions Cert. Authority, CN = Hellenic Academic and Research Institutions RootCA 2015
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (4096 bit)
-                Modulus:
-                    00:c2:f8:a9:3f:1b:89:fc:3c:3c:04:5d:3d:90:36:
-                    b0:91:3a:79:3c:66:5a:ef:6d:39:01:49:1a:b4:b7:
-                    cf:7f:4d:23:53:b7:90:00:e3:13:2a:28:a6:31:f1:
-                    91:00:e3:28:ec:ae:21:41:ce:1f:da:fd:7d:12:5b:
-                    01:83:0f:b9:b0:5f:99:e1:f2:12:83:80:4d:06:3e:
-                    df:ac:af:e7:a1:88:6b:31:af:f0:8b:d0:18:33:b8:
-                    db:45:6a:34:f4:02:80:24:28:0a:02:15:95:5e:76:
-                    2a:0d:99:3a:14:5b:f6:cb:cb:53:bc:13:4d:01:88:
-                    37:94:25:1b:42:bc:22:d8:8e:a3:96:5e:3a:d9:32:
-                    db:3e:e8:f0:10:65:ed:74:e1:2f:a7:7c:af:27:34:
-                    bb:29:7d:9b:b6:cf:09:c8:e5:d3:0a:fc:88:65:65:
-                    74:0a:dc:73:1c:5c:cd:40:b1:1c:d4:b6:84:8c:4c:
-                    50:cf:68:8e:a8:59:ae:c2:27:4e:82:a2:35:dd:14:
-                    f4:1f:ff:b2:77:d5:87:2f:aa:6e:7d:24:27:e7:c6:
-                    cb:26:e6:e5:fe:67:07:63:d8:45:0d:dd:3a:59:65:
-                    39:58:7a:92:99:72:3d:9c:84:5e:88:21:b8:d5:f4:
-                    2c:fc:d9:70:52:4f:78:b8:bd:3c:2b:8b:95:98:f5:
-                    b3:d1:68:cf:20:14:7e:4c:5c:5f:e7:8b:e5:f5:35:
-                    81:19:37:d7:11:08:b7:66:be:d3:4a:ce:83:57:00:
-                    3a:c3:81:f8:17:cb:92:36:5d:d1:a3:d8:75:1b:e1:
-                    8b:27:ea:7a:48:41:fd:45:19:06:ad:27:99:4e:c1:
-                    70:47:dd:b5:9f:81:53:12:e5:b1:8c:48:5d:31:43:
-                    17:e3:8c:c6:7a:63:96:4b:29:30:4e:84:4e:62:19:
-                    5e:3c:ce:97:90:a5:7f:01:eb:9d:e0:f8:8b:89:dd:
-                    25:98:3d:92:b6:7e:ef:d9:f1:51:51:7d:2d:26:c8:
-                    69:59:61:e0:ac:6a:b8:2a:36:11:04:7a:50:bd:32:
-                    84:be:2f:dc:72:d5:d7:1d:16:47:e4:47:66:20:3f:
-                    f4:96:c5:af:8e:01:7a:a5:0f:7a:64:f5:0d:18:87:
-                    d9:ae:88:d5:fa:84:c1:3a:c0:69:28:2d:f2:0d:68:
-                    51:aa:e3:a5:77:c6:a4:90:0e:a1:37:8b:31:23:47:
-                    c1:09:08:eb:6e:f7:78:9b:d7:82:fc:84:20:99:49:
-                    19:b6:12:46:b1:fb:45:55:16:a9:a3:65:ac:9c:07:
-                    0f:ea:6b:dc:1f:2e:06:72:ec:86:88:12:e4:2d:db:
-                    5f:05:2f:e4:f0:03:d3:26:33:e7:80:c2:cd:42:a1:
-                    17:34:0b
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                71:15:67:C8:C8:C9:BD:75:5D:72:D0:38:18:6A:9D:F3:71:24:54:0B
-    Signature Algorithm: sha256WithRSAEncryption
-         75:bb:6d:54:4b:aa:10:58:46:34:f2:62:d7:16:36:5d:08:5e:
-         d5:6c:c8:87:bd:b4:2e:46:f2:31:f8:7c:ea:42:b5:93:16:55:
-         dc:a1:0c:12:a0:da:61:7e:0f:58:58:73:64:72:c7:e8:45:8e:
-         dc:a9:f2:26:3f:c6:79:8c:b1:53:08:33:81:b0:56:13:be:e6:
-         51:5c:d8:9b:0a:4f:4b:9c:56:53:02:e9:4f:f6:0d:60:ea:4d:
-         42:55:e8:7c:1b:21:21:d3:1b:3a:cc:77:f2:b8:90:f1:68:c7:
-         f9:5a:fe:fa:2d:f4:bf:c9:f5:45:1b:ce:38:10:2a:37:8a:79:
-         a3:b4:e3:09:6c:85:86:93:ff:89:96:27:78:81:8f:67:e3:46:
-         74:54:8e:d9:0d:69:e2:4a:f4:4d:74:03:ff:b2:77:ed:95:67:
-         97:e4:b1:c5:ab:bf:6a:23:e8:d4:94:e2:44:28:62:c4:4b:e2:
-         f0:d8:e2:29:6b:1a:70:7e:24:61:93:7b:4f:03:32:25:0d:45:
-         24:2b:96:b4:46:6a:bf:4a:0b:f7:9a:8f:c1:ac:1a:c5:67:f3:
-         6f:34:d2:fa:73:63:8c:ef:16:b0:a8:a4:46:2a:f8:eb:12:ec:
-         72:b4:ef:f8:2b:7e:8c:52:c0:8b:84:54:f9:2f:3e:e3:55:a8:
-         dc:66:b1:d9:e1:5f:d8:b3:8c:59:34:59:a4:ab:4f:6c:bb:1f:
-         18:db:75:ab:d8:cb:92:cd:94:38:61:0e:07:06:1f:4b:46:10:
-         f1:15:be:8d:85:5c:3b:4a:2b:81:79:0f:b4:69:9f:49:50:97:
-         4d:f7:0e:56:5d:c0:95:6a:c2:36:c3:1b:68:c9:f5:2a:dc:47:
-         9a:be:b2:ce:c5:25:e8:fa:03:b9:da:f9:16:6e:91:84:f5:1c:
-         28:c8:fc:26:cc:d7:1c:90:56:a7:5f:6f:3a:04:bc:cd:78:89:
-         0b:8e:0f:2f:a3:aa:4f:a2:1b:12:3d:16:08:40:0f:f1:46:4c:
-         d7:aa:7b:08:c1:0a:f5:6d:27:de:02:8f:ca:c3:b5:2b:ca:e9:
-         eb:c8:21:53:38:a5:cc:3b:d8:77:37:30:a2:4f:d9:6f:d1:f2:
-         40:ad:41:7a:17:c5:d6:4a:35:89:b7:41:d5:7c:86:7f:55:4d:
-         83:4a:a5:73:20:c0:3a:af:90:f1:9a:24:8e:d9:8e:71:ca:7b:
-         b8:86:da:b2:8f:99:3e:1d:13:0d:12:11:ee:d4:ab:f0:e9:15:
-         76:02:e4:e0:df:aa:20:1e:5b:61:85:64:40:a9:90:97:0d:ad:
-         53:d2:5a:1d:87:6a:00:97:65:62:b4:be:6f:6a:a7:f5:2c:42:
-         ed:32:ad:b6:21:9e:be:bc
------BEGIN CERTIFICATE-----
-MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix
-DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k
-IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT
-N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v
-dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG
-A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh
-ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx
-QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
-dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA
-4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0
-AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10
-4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C
-ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV
-9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD
-gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6
-Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq
-NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko
-LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
-Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd
-ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I
-XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI
-M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot
-9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V
-Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea
-j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh
-X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ
-l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf
-bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4
-pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK
-e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0
-vm9qp/UsQu0yrbYhnr68
------END CERTIFICATE-----
-
-# 5a2fc03f0c83b090bbfa40604b0988446c7636183df9846e17101a447fb8efd6
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            08:16:5f:8a:4c:a5:ec:00:c9:93:40:df:c4:c6:ae:23:b8:1c:5a:a4
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = HK, ST = Hong Kong, L = Hong Kong, O = Hongkong Post, CN = Hongkong Post Root CA 3
-        Validity
-            Not Before: Jun  3 02:29:46 2017 GMT
-            Not After : Jun  3 02:29:46 2042 GMT
-        Subject: C = HK, ST = Hong Kong, L = Hong Kong, O = Hongkong Post, CN = Hongkong Post Root CA 3
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (4096 bit)
-                Modulus:
-                    00:b3:88:d7:ea:ce:0f:20:4e:be:e6:d6:03:6d:ee:
-                    59:fc:c2:57:df:29:68:a1:83:0e:3e:68:c7:68:58:
-                    9c:1c:60:4b:89:43:0c:b9:d4:15:b2:ee:c1:4e:75:
-                    e9:b5:a7:ef:e5:e9:35:99:e4:cc:1c:e7:4b:5f:8d:
-                    33:30:20:33:53:d9:a6:bb:d5:3e:13:8e:e9:1f:87:
-                    49:ad:50:2d:50:ca:18:be:01:58:a2:13:70:96:bb:
-                    89:88:56:80:5c:f8:bd:2c:3c:e1:4c:57:88:bb:d3:
-                    b9:95:ef:cb:c7:f6:da:31:74:28:a6:e6:54:89:f5:
-                    41:31:ca:e5:26:1a:cd:82:e0:70:da:3b:29:bb:d5:
-                    03:f5:99:ba:55:f5:64:d1:60:0e:b3:89:49:b8:8a:
-                    2f:05:d2:84:45:28:7c:8f:68:50:12:78:fc:0b:b5:
-                    53:cb:c2:98:1c:84:a3:9e:b0:be:23:a4:da:dc:c8:
-                    2b:1e:da:6e:45:1e:89:98:da:f9:00:2e:06:e9:0c:
-                    3b:70:d5:50:25:88:99:cb:cd:73:60:f7:d5:ff:35:
-                    67:c5:a1:bc:5e:ab:cd:4a:b8:45:eb:c8:68:1e:0d:
-                    0d:14:46:12:e3:d2:64:62:8a:42:98:bc:b4:c6:08:
-                    08:f8:fd:a8:4c:64:9c:76:01:bd:2f:a9:6c:33:0f:
-                    d8:3f:28:b8:3c:69:01:42:86:7e:69:c1:c9:06:ca:
-                    e5:7a:46:65:e9:c2:d6:50:41:2e:3f:b7:e4:ed:6c:
-                    d7:bf:26:01:11:a2:16:29:4a:6b:34:06:90:ec:13:
-                    d2:b6:fb:6a:76:d2:3c:ed:f0:d6:2d:dd:e1:15:ec:
-                    a3:9b:2f:2c:c9:3e:2b:e4:69:3b:ff:72:25:b1:36:
-                    86:5b:c7:7f:6b:8b:55:1b:4a:c5:20:61:3d:ae:cb:
-                    50:e1:08:3a:be:b0:8f:63:41:53:30:08:59:3c:98:
-                    1d:77:ba:63:91:7a:ca:10:50:60:bf:f0:d7:bc:95:
-                    87:8f:97:c5:fe:97:6a:01:94:a3:7c:5b:85:1d:2a:
-                    39:3a:d0:54:a1:d1:39:71:9d:fd:21:f9:b5:7b:f0:
-                    e2:e0:02:8f:6e:96:24:25:2c:a0:1e:2c:a8:c4:89:
-                    a7:ef:ed:99:06:2f:b6:0a:4c:4f:db:a2:cc:37:1a:
-                    af:47:85:2d:8a:5f:c4:34:34:4c:00:fd:18:93:67:
-                    13:d1:37:e6:48:b4:8b:06:c5:57:7b:19:86:0a:79:
-                    cb:00:c9:52:af:42:ff:37:8f:e1:a3:1e:7a:3d:50:
-                    ab:63:06:e7:15:b5:3f:b6:45:37:94:37:b1:7e:f2:
-                    48:c3:7f:c5:75:fe:97:8d:45:8f:1a:a7:1a:72:28:
-                    1a:40:0f
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Authority Key Identifier: 
-                keyid:17:9D:CD:1E:8B:D6:39:2B:70:D3:5C:D4:A0:B8:1F:B0:00:FC:C5:61
-
-            X509v3 Subject Key Identifier: 
-                17:9D:CD:1E:8B:D6:39:2B:70:D3:5C:D4:A0:B8:1F:B0:00:FC:C5:61
-    Signature Algorithm: sha256WithRSAEncryption
-         56:d5:7b:6e:e6:22:01:d2:42:9b:18:d5:0e:d7:66:23:5c:e3:
-         fe:a0:c7:92:d2:e9:94:ad:4b:a2:c6:ec:12:7c:74:d5:48:d2:
-         59:14:99:c0:eb:b9:d1:eb:f4:48:30:5b:ad:a7:57:73:99:a9:
-         d3:e5:b7:d1:2e:59:24:58:dc:68:2e:2e:62:d8:6a:e4:70:0b:
-         2d:20:50:20:a4:32:95:d1:00:98:bb:d3:fd:f7:32:f2:49:ae:
-         c6:7a:e0:47:be:6e:ce:cb:a3:72:3a:2d:69:5d:cb:c8:e8:45:
-         39:d4:fa:42:c1:11:4c:77:5d:92:fb:6a:ff:58:44:e5:eb:81:
-         9e:af:a0:99:ad:be:a9:01:66:cb:38:1d:3c:df:43:1f:f4:4d:
-         6e:b4:ba:17:46:fc:7d:fd:87:81:79:6a:0d:33:0f:fa:2f:f8:
-         14:b9:80:b3:5d:4d:aa:97:e1:f9:e4:18:c5:f8:d5:38:8c:26:
-         3c:fd:f2:28:e2:ee:5a:49:88:2c:df:79:3d:8e:9e:90:3c:bd:
-         41:4a:3a:dd:5b:f6:9a:b4:ce:3f:25:30:7f:32:7d:a2:03:94:
-         d0:dc:7a:a1:52:de:6e:93:8d:18:26:fd:55:ac:bd:8f:9b:d2:
-         cf:af:e7:86:2c:cb:1f:09:6f:a3:6f:a9:84:d4:73:bf:4d:a1:
-         74:1b:4e:23:60:f2:cc:0e:aa:7f:a4:9c:4c:25:a8:b2:66:3b:
-         38:ff:d9:94:30:f6:72:84:be:68:55:10:0f:c6:73:2c:16:69:
-         93:07:fe:b1:45:ed:bb:a2:55:6a:b0:da:b5:4a:02:25:27:85:
-         d7:b7:b7:86:44:16:89:6c:80:2b:3e:97:a9:9c:d5:7e:55:4c:
-         c6:de:45:10:1c:ea:e9:3b:9f:03:53:ee:ee:7a:01:02:16:78:
-         d4:e8:c2:be:46:76:88:13:3f:22:bb:48:12:1d:52:00:b4:02:
-         7e:21:1a:1e:9c:25:f4:f3:3d:5e:1e:d2:1c:f9:b3:2d:b6:f7:
-         37:5c:c6:cb:21:4e:b0:f7:99:47:18:85:c1:2b:ba:55:ae:06:
-         ea:d0:07:b2:dc:ab:d0:82:96:75:ce:d2:50:fe:99:e7:cf:2f:
-         9f:e7:76:d1:61:2a:fb:21:bb:31:d0:aa:9f:47:a4:b2:22:ca:
-         16:3a:50:57:c4:5b:43:67:c5:65:62:03:49:01:eb:43:d9:d8:
-         f8:9e:ad:cf:b1:63:0e:45:f4:a0:5a:2c:9b:2d:c5:a6:c0:ad:
-         a8:47:f4:27:4c:38:0d:2e:1b:49:3b:52:f4:e8:88:83:2b:54:
-         28:d4:f2:35:52:b4:32:83:62:69:64:0c:91:9c:9f:97:ea:74:
-         16:fd:1f:11:06:9a:9b:f4
------BEGIN CERTIFICATE-----
-MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL
-BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ
-SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n
-a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5
-NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT
-CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u
-Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO
-dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI
-VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV
-9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY
-2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY
-vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt
-bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb
-x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+
-l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK
-TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj
-Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP
-BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e
-i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw
-DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG
-7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk
-MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr
-gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk
-GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS
-3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm
-Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+
-l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c
-JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP
-L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa
-LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG
-mpv0
------END CERTIFICATE-----
-
-# 5d56499be4d2e08bcfcad08a3e38723d50503bde706948e42f55603019e528ae
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            0a:01:42:80:00:00:01:45:23:c8:44:b5:00:00:00:02
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = US, O = IdenTrust, CN = IdenTrust Commercial Root CA 1
-        Validity
-            Not Before: Jan 16 18:12:23 2014 GMT
-            Not After : Jan 16 18:12:23 2034 GMT
-        Subject: C = US, O = IdenTrust, CN = IdenTrust Commercial Root CA 1
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (4096 bit)
-                Modulus:
-                    00:a7:50:19:de:3f:99:3d:d4:33:46:f1:6f:51:61:
-                    82:b2:a9:4f:8f:67:89:5d:84:d9:53:dd:0c:28:d9:
-                    d7:f0:ff:ae:95:43:72:99:f9:b5:5d:7c:8a:c1:42:
-                    e1:31:50:74:d1:81:0d:7c:cd:9b:21:ab:43:e2:ac:
-                    ad:5e:86:6e:f3:09:8a:1f:5a:32:bd:a2:eb:94:f9:
-                    e8:5c:0a:ec:ff:98:d2:af:71:b3:b4:53:9f:4e:87:
-                    ef:92:bc:bd:ec:4f:32:30:88:4b:17:5e:57:c4:53:
-                    c2:f6:02:97:8d:d9:62:2b:bf:24:1f:62:8d:df:c3:
-                    b8:29:4b:49:78:3c:93:60:88:22:fc:99:da:36:c8:
-                    c2:a2:d4:2c:54:00:67:35:6e:73:bf:02:58:f0:a4:
-                    dd:e5:b0:a2:26:7a:ca:e0:36:a5:19:16:f5:fd:b7:
-                    ef:ae:3f:40:f5:6d:5a:04:fd:ce:34:ca:24:dc:74:
-                    23:1b:5d:33:13:12:5d:c4:01:25:f6:30:dd:02:5d:
-                    9f:e0:d5:47:bd:b4:eb:1b:a1:bb:49:49:d8:9f:5b:
-                    02:f3:8a:e4:24:90:e4:62:4f:4f:c1:af:8b:0e:74:
-                    17:a8:d1:72:88:6a:7a:01:49:cc:b4:46:79:c6:17:
-                    b1:da:98:1e:07:59:fa:75:21:85:65:dd:90:56:ce:
-                    fb:ab:a5:60:9d:c4:9d:f9:52:b0:8b:bd:87:f9:8f:
-                    2b:23:0a:23:76:3b:f7:33:e1:c9:00:f3:69:f9:4b:
-                    a2:e0:4e:bc:7e:93:39:84:07:f7:44:70:7e:fe:07:
-                    5a:e5:b1:ac:d1:18:cc:f2:35:e5:49:49:08:ca:56:
-                    c9:3d:fb:0f:18:7d:8b:3b:c1:13:c2:4d:8f:c9:4f:
-                    0e:37:e9:1f:a1:0e:6a:df:62:2e:cb:35:06:51:79:
-                    2c:c8:25:38:f4:fa:4b:a7:89:5c:9c:d2:e3:0d:39:
-                    86:4a:74:7c:d5:59:87:c2:3f:4e:0c:5c:52:f4:3d:
-                    f7:52:82:f1:ea:a3:ac:fd:49:34:1a:28:f3:41:88:
-                    3a:13:ee:e8:de:ff:99:1d:5f:ba:cb:e8:1e:f2:b9:
-                    50:60:c0:31:d3:73:e5:ef:be:a0:ed:33:0b:74:be:
-                    20:20:c4:67:6c:f0:08:03:7a:55:80:7f:46:4e:96:
-                    a7:f4:1e:3e:e1:f6:d8:09:e1:33:64:2b:63:d7:32:
-                    5e:9f:f9:c0:7b:0f:78:6f:97:bc:93:9a:f9:9c:12:
-                    90:78:7a:80:87:15:d7:72:74:9c:55:74:78:b1:ba:
-                    e1:6e:70:04:ba:4f:a0:ba:68:c3:7b:ff:31:f0:73:
-                    3d:3d:94:2a:b1:0b:41:0e:a0:fe:4d:88:65:6b:79:
-                    33:b4:d7
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                ED:44:19:C0:D3:F0:06:8B:EE:A4:7B:BE:42:E7:26:54:C8:8E:36:76
-    Signature Algorithm: sha256WithRSAEncryption
-         0d:ae:90:32:f6:a6:4b:7c:44:76:19:61:1e:27:28:cd:5e:54:
-         ef:25:bc:e3:08:90:f9:29:d7:ae:68:08:e1:94:00:58:ef:2e:
-         2e:7e:53:52:8c:b6:5c:07:ea:88:ba:99:8b:50:94:d7:82:80:
-         df:61:09:00:93:ad:0d:14:e6:ce:c1:f2:37:94:78:b0:5f:9c:
-         b3:a2:73:b8:8f:05:93:38:cd:8d:3e:b0:b8:fb:c0:cf:b1:f2:
-         ec:2d:2d:1b:cc:ec:aa:9a:b3:aa:60:82:1b:2d:3b:c3:84:3d:
-         57:8a:96:1e:9c:75:b8:d3:30:cd:60:08:83:90:d3:8e:54:f1:
-         4d:66:c0:5d:74:03:40:a3:ee:85:7e:c2:1f:77:9c:06:e8:c1:
-         a7:18:5d:52:95:ed:c9:dd:25:9e:6d:fa:a9:ed:a3:3a:34:d0:
-         59:7b:da:ed:50:f3:35:bf:ed:eb:14:4d:31:c7:60:f4:da:f1:
-         87:9c:e2:48:e2:c6:c5:37:fb:06:10:fa:75:59:66:31:47:29:
-         da:76:9a:1c:e9:82:ae:ef:9a:b9:51:f7:88:23:9a:69:95:62:
-         3c:e5:55:80:36:d7:54:02:ff:f1:b9:5d:ce:d4:23:6f:d8:45:
-         84:4a:5b:65:ef:89:0c:dd:14:a7:20:cb:18:a5:25:b4:0d:f9:
-         01:f0:a2:d2:f4:00:c8:74:8e:a1:2a:48:8e:65:db:13:c4:e2:
-         25:17:7d:eb:be:87:5b:17:20:54:51:93:4a:53:03:0b:ec:5d:
-         ca:33:ed:62:fd:45:c7:2f:5b:dc:58:a0:80:39:e6:fa:d7:fe:
-         13:14:a6:ed:3d:94:4a:42:74:d4:c3:77:59:73:cd:8f:46:be:
-         55:38:ef:fa:e8:91:32:ea:97:58:04:22:de:38:c3:cc:bc:6d:
-         c9:33:3a:6a:0a:69:3f:a0:c8:ea:72:8f:8c:63:86:23:bd:6d:
-         3c:96:9e:95:e0:49:4c:aa:a2:b9:2a:1b:9c:36:81:78:ed:c3:
-         e8:46:e2:26:59:44:75:1e:d9:75:89:51:cd:10:84:9d:61:60:
-         cb:5d:f9:97:22:4d:8e:98:e6:e3:7f:f6:5b:bb:ae:cd:ca:4a:
-         81:6b:5e:0b:f3:51:e1:74:2b:e9:7e:27:a7:d9:99:49:4e:f8:
-         a5:80:db:25:0f:1c:63:62:8a:c9:33:67:6b:3c:10:83:c6:ad:
-         de:a8:cd:16:8e:8d:f0:07:37:71:9f:f2:ab:fc:41:f5:c1:8b:
-         ec:00:37:5d:09:e5:4e:80:ef:fa:b1:5c:38:06:a5:1b:4a:e1:
-         dc:38:2d:3c:dc:ab:1f:90:1a:d5:4a:9c:ee:d1:70:6c:cc:ee:
-         f4:57:f8:18:ba:84:6e:87
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK
-MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu
-VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw
-MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw
-JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT
-3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU
-+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp
-S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1
-bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi
-T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL
-vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK
-Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK
-dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT
-c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv
-l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N
-iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD
-ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
-6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt
-LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93
-nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3
-+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK
-W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT
-AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq
-l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG
-4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ
-mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A
-7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H
------END CERTIFICATE-----
-
-# 2530cc8e98321502bad96f9b1fba1b099e2d299e0f4548bb914f363bc0d4531f
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            b0:b7:5a:16:48:5f:bf:e1:cb:f5:8b:d7:19:e6:7d
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=ES, O=IZENPE S.A., CN=Izenpe.com
-        Validity
-            Not Before: Dec 13 13:08:28 2007 GMT
-            Not After : Dec 13 08:27:25 2037 GMT
-        Subject: C=ES, O=IZENPE S.A., CN=Izenpe.com
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:c9:d3:7a:ca:0f:1e:ac:a7:86:e8:16:65:6a:b1:
-                    c2:1b:45:32:71:95:d9:fe:10:5b:cc:af:e7:a5:79:
-                    01:8f:89:c3:ca:f2:55:71:f7:77:be:77:94:f3:72:
-                    a4:2c:44:d8:9e:92:9b:14:3a:a1:e7:24:90:0a:0a:
-                    56:8e:c5:d8:26:94:e1:d9:48:e1:2d:3e:da:0a:72:
-                    dd:a3:99:15:da:81:a2:87:f4:7b:6e:26:77:89:58:
-                    ad:d6:eb:0c:b2:41:7a:73:6e:6d:db:7a:78:41:e9:
-                    08:88:12:7e:87:2e:66:11:63:6c:54:fb:3c:9d:72:
-                    c0:bc:2e:ff:c2:b7:dd:0d:76:e3:3a:d7:f7:b4:68:
-                    be:a2:f5:e3:81:6e:c1:46:6f:5d:8d:e0:4d:c6:54:
-                    55:89:1a:33:31:0a:b1:57:b9:a3:8a:98:c3:ec:3b:
-                    34:c5:95:41:69:7e:75:c2:3c:20:c5:61:ba:51:47:
-                    a0:20:90:93:a1:90:4b:f3:4e:7c:85:45:54:9a:d1:
-                    05:26:41:b0:b5:4d:1d:33:be:c4:03:c8:25:7c:c1:
-                    70:db:3b:f4:09:2d:54:27:48:ac:2f:e1:c4:ac:3e:
-                    c8:cb:92:4c:53:39:37:23:ec:d3:01:f9:e0:09:44:
-                    4d:4d:64:c0:e1:0d:5a:87:22:bc:ad:1b:a3:fe:26:
-                    b5:15:f3:a7:fc:84:19:e9:ec:a1:88:b4:44:69:84:
-                    83:f3:89:d1:74:06:a9:cc:0b:d6:c2:de:27:85:50:
-                    26:ca:17:b8:c9:7a:87:56:2c:1a:01:1e:6c:be:13:
-                    ad:10:ac:b5:24:f5:38:91:a1:d6:4b:da:f1:bb:d2:
-                    de:47:b5:f1:bc:81:f6:59:6b:cf:19:53:e9:8d:15:
-                    cb:4a:cb:a9:6f:44:e5:1b:41:cf:e1:86:a7:ca:d0:
-                    6a:9f:bc:4c:8d:06:33:5a:a2:85:e5:90:35:a0:62:
-                    5c:16:4e:f0:e3:a2:fa:03:1a:b4:2c:71:b3:58:2c:
-                    de:7b:0b:db:1a:0f:eb:de:21:1f:06:77:06:03:b0:
-                    c9:ef:99:fc:c0:b9:4f:0b:86:28:fe:d2:b9:ea:e3:
-                    da:a5:c3:47:69:12:e0:db:f0:f6:19:8b:ed:7b:70:
-                    d7:02:d6:ed:87:18:28:2c:04:24:4c:77:e4:48:8a:
-                    1a:c6:3b:9a:d4:0f:ca:fa:75:d2:01:40:5a:8d:79:
-                    bf:8b:cf:4b:cf:aa:16:c1:95:e4:ad:4c:8a:3e:17:
-                    91:d4:b1:62:e5:82:e5:80:04:a4:03:7e:8d:bf:da:
-                    7f:a2:0f:97:4f:0c:d3:0d:fb:d7:d1:e5:72:7e:1c:
-                    c8:77:ff:5b:9a:0f:b7:ae:05:46:e5:f1:a8:16:ec:
-                    47:a4:17
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Alternative Name: 
-                email:info@izenpe.com, DirName:/O=IZENPE S.A. - CIF A01337260-RMerc.Vitoria-Gasteiz T1055 F62 S8/street=Avda del Mediterraneo Etorbidea 14 - 01010 Vitoria-Gasteiz
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                1D:1C:65:0E:A8:F2:25:7B:B4:91:CF:E4:B1:B1:E6:BD:55:74:6C:05
-    Signature Algorithm: sha256WithRSAEncryption
-         78:a6:0c:16:4a:9f:4c:88:3a:c0:cb:0e:a5:16:7d:9f:b9:48:
-         5f:18:8f:0d:62:36:f6:cd:19:6b:ac:ab:d5:f6:91:7d:ae:71:
-         f3:3f:b3:0e:78:85:9b:95:a4:27:21:47:42:4a:7c:48:3a:f5:
-         45:7c:b3:0c:8e:51:78:ac:95:13:de:c6:fd:7d:b8:1a:90:4c:
-         ab:92:03:c7:ed:42:01:ce:0f:d8:b1:fa:a2:92:e1:60:6d:ae:
-         7a:6b:09:aa:c6:29:ee:68:49:67:30:80:24:7a:31:16:39:5b:
-         7e:f1:1c:2e:dd:6c:09:ad:f2:31:c1:82:4e:b9:bb:f9:be:bf:
-         2a:85:3f:c0:40:a3:3a:59:fc:59:4b:3c:28:24:db:b4:15:75:
-         ae:0d:88:ba:2e:73:c0:bd:58:87:e5:42:f2:eb:5e:ee:1e:30:
-         22:99:cb:37:d1:c4:21:6c:81:ec:be:6d:26:e6:1c:e4:42:20:
-         9e:47:b0:ac:83:59:70:2c:35:d6:af:36:34:b4:cd:3b:f8:32:
-         a8:ef:e3:78:89:fb:8d:45:2c:da:9c:b8:7e:40:1c:61:e7:3e:
-         a2:92:2c:4b:f2:cd:fa:98:b6:29:ff:f3:f2:7b:a9:1f:2e:a0:
-         93:57:2b:de:85:03:f9:69:37:cb:9e:78:6a:05:b4:c5:31:78:
-         89:ec:7a:a7:85:e1:b9:7b:3c:de:be:1e:79:84:ce:9f:70:0e:
-         59:c2:35:2e:90:2a:31:d9:e4:45:7a:41:a4:2e:13:9b:34:0e:
-         66:7b:49:ab:64:97:d0:46:c3:79:9d:72:50:63:a6:98:5b:06:
-         bd:48:6d:d8:39:83:70:e8:35:f0:05:d1:aa:bc:e3:db:c8:02:
-         ea:7c:fd:82:da:c2:5b:52:35:ae:98:3a:ad:ba:35:93:23:a7:
-         1f:48:dd:35:46:98:b2:10:68:e4:a5:31:c2:0a:58:2e:19:81:
-         10:c9:50:75:fc:ea:5a:16:ce:11:d7:ee:ef:50:88:2d:61:ff:
-         3f:42:73:05:94:43:d5:8e:3c:4e:01:3a:19:a5:1f:46:4e:77:
-         d0:5d:e5:81:22:21:87:fe:94:7d:84:d8:93:ad:d6:68:43:48:
-         b2:db:eb:73:24:e7:91:7f:54:a4:b6:80:3e:9d:a3:3c:4c:72:
-         c2:57:c4:a0:d4:cc:38:27:ce:d5:06:9e:a2:48:d9:e9:9f:ce:
-         82:70:36:93:9a:3b:df:96:21:e3:59:b7:0c:da:91:37:f0:fd:
-         59:5a:b3:99:c8:69:6c:43:26:01:35:63:60:55:89:03:3a:75:
-         d8:ba:4a:d9:54:ff:ee:de:80:d8:2d:d1:38:d5:5e:2d:0b:98:
-         7d:3e:6c:db:fc:26:88:c7
------BEGIN CERTIFICATE-----
-MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
-MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
-ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
-VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
-b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
-scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
-xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
-LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
-uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
-yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
-JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
-rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
-BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
-hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
-QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
-HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
-Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
-QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
-BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
-MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
-AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
-A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
-laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
-awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
-JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
-LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
-VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
-LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
-UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
-QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
-naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
-QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
------END CERTIFICATE-----
-
-# 6c61dac3a2def031506be036d2a6fe401994fbd13df9c8d466599274c446ec98
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 80544274841616 (0x49412ce40010)
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = HU, L = Budapest, O = NetLock Kft., OU = Tan\C3\BAs\C3\ADtv\C3\A1nykiad\C3\B3k (Certification Services), CN = NetLock Arany (Class Gold) F\C5\91tan\C3\BAs\C3\ADtv\C3\A1ny
-        Validity
-            Not Before: Dec 11 15:08:21 2008 GMT
-            Not After : Dec  6 15:08:21 2028 GMT
-        Subject: C = HU, L = Budapest, O = NetLock Kft., OU = Tan\C3\BAs\C3\ADtv\C3\A1nykiad\C3\B3k (Certification Services), CN = NetLock Arany (Class Gold) F\C5\91tan\C3\BAs\C3\ADtv\C3\A1ny
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (2048 bit)
-                Modulus:
-                    00:c4:24:5e:73:be:4b:6d:14:c3:a1:f4:e3:97:90:
-                    6e:d2:30:45:1e:3c:ee:67:d9:64:e0:1a:8a:7f:ca:
-                    30:ca:83:e3:20:c1:e3:f4:3a:d3:94:5f:1a:7c:5b:
-                    6d:bf:30:4f:84:27:f6:9f:1f:49:bc:c6:99:0a:90:
-                    f2:0f:f5:7f:43:84:37:63:51:8b:7a:a5:70:fc:7a:
-                    58:cd:8e:9b:ed:c3:46:6c:84:70:5d:da:f3:01:90:
-                    23:fc:4e:30:a9:7e:e1:27:63:e7:ed:64:3c:a0:b8:
-                    c9:33:63:fe:16:90:ff:b0:b8:fd:d7:a8:c0:c0:94:
-                    43:0b:b6:d5:59:a6:9e:56:d0:24:1f:70:79:af:db:
-                    39:54:0d:65:75:d9:15:41:94:01:af:5e:ec:f6:8d:
-                    f1:ff:ad:64:fe:20:9a:d7:5c:eb:fe:a6:1f:08:64:
-                    a3:8b:76:55:ad:1e:3b:28:60:2e:87:25:e8:aa:af:
-                    1f:c6:64:46:20:b7:70:7f:3c:de:48:db:96:53:b7:
-                    39:77:e4:1a:e2:c7:16:84:76:97:5b:2f:bb:19:15:
-                    85:f8:69:85:f5:99:a7:a9:f2:34:a7:a9:b6:a6:03:
-                    fc:6f:86:3d:54:7c:76:04:9b:6b:f9:40:5d:00:34:
-                    c7:2e:99:75:9d:e5:88:03:aa:4d:f8:03:d2:42:76:
-                    c0:1b
-                Exponent: 43147 (0xa88b)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE, pathlen:4
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                CC:FA:67:93:F0:B6:B8:D0:A5:C0:1E:F3:53:FD:8C:53:DF:83:D7:96
-    Signature Algorithm: sha256WithRSAEncryption
-         ab:7f:ee:1c:16:a9:9c:3c:51:00:a0:c0:11:08:05:a7:99:e6:
-         6f:01:88:54:61:6e:f1:b9:18:ad:4a:ad:fe:81:40:23:94:2f:
-         fb:75:7c:2f:28:4b:62:24:81:82:0b:f5:61:f1:1c:6e:b8:61:
-         38:eb:81:fa:62:a1:3b:5a:62:d3:94:65:c4:e1:e6:6d:82:f8:
-         2f:25:70:b2:21:26:c1:72:51:1f:8c:2c:c3:84:90:c3:5a:8f:
-         ba:cf:f4:a7:65:a5:eb:98:d1:fb:05:b2:46:75:15:23:6a:6f:
-         85:63:30:80:f0:d5:9e:1f:29:1c:c2:6c:b0:50:59:5d:90:5b:
-         3b:a8:0d:30:cf:bf:7d:7f:ce:f1:9d:83:bd:c9:46:6e:20:a6:
-         f9:61:51:ba:21:2f:7b:be:a5:15:63:a1:d4:95:87:f1:9e:b9:
-         f3:89:f3:3d:85:b8:b8:db:be:b5:b9:29:f9:da:37:05:00:49:
-         94:03:84:44:e7:bf:43:31:cf:75:8b:25:d1:f4:a6:64:f5:92:
-         f6:ab:05:eb:3d:e9:a5:0b:36:62:da:cc:06:5f:36:8b:b6:5e:
-         31:b8:2a:fb:5e:f6:71:df:44:26:9e:c4:e6:0d:91:b4:2e:75:
-         95:80:51:6a:4b:30:a6:b0:62:a1:93:f1:9b:d8:ce:c4:63:75:
-         3f:59:47:b1
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
-EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
-MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
-cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
-dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
-pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
-b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
-IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
-lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
-AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
-VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
-ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
-BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
-AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
-U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
-bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
-+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
-bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
-uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
-XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
------END CERTIFICATE-----
-
-# 001686cd181f83a1b1217d305b365c41e3470a78a1d37b134a98cd547b92dab3
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            1c:a0:2d:c1:52:3b:6a:6d:8b:5c:1f:95:4a:ed:ac:30
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=US, O=Network Solutions L.L.C., CN=Network Solutions Certificate Authority
-        Validity
-            Not Before: Jan  1 00:00:00 2011 GMT
-            Not After : Dec 31 23:59:59 2030 GMT
-        Subject: C=US, O=Network Solutions L.L.C., CN=Network Solutions Certificate Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:e4:bc:7e:92:30:6d:c6:d8:8e:2b:0b:bc:46:ce:
-                    e0:27:96:de:de:f9:fa:12:d3:3c:33:73:b3:04:2f:
-                    bc:71:8c:e5:9f:b6:22:60:3e:5f:5d:ce:09:ff:82:
-                    0c:1b:9a:51:50:1a:26:89:dd:d5:61:5d:19:dc:12:
-                    0f:2d:0a:a2:43:5d:17:d0:34:92:20:ea:73:cf:38:
-                    2c:06:26:09:7a:72:f7:fa:50:32:f8:c2:93:d3:69:
-                    a2:23:ce:41:b1:cc:e4:d5:1f:36:d1:8a:3a:f8:8c:
-                    63:e2:14:59:69:ed:0d:d3:7f:6b:e8:b8:03:e5:4f:
-                    6a:e5:98:63:69:48:05:be:2e:ff:33:b6:e9:97:59:
-                    69:f8:67:19:ae:93:61:96:44:15:d3:72:b0:3f:bc:
-                    6a:7d:ec:48:7f:8d:c3:ab:aa:71:2b:53:69:41:53:
-                    34:b5:b0:b9:c5:06:0a:c4:b0:45:f5:41:5d:6e:89:
-                    45:7b:3d:3b:26:8c:74:c2:e5:d2:d1:7d:b2:11:d4:
-                    fb:58:32:22:9a:80:c9:dc:fd:0c:e9:7f:5e:03:97:
-                    ce:3b:00:14:87:27:70:38:a9:8e:6e:b3:27:76:98:
-                    51:e0:05:e3:21:ab:1a:d5:85:22:3c:29:b5:9a:16:
-                    c5:80:a8:f4:bb:6b:30:8f:2f:46:02:a2:b1:0c:22:
-                    e0:d3
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                21:30:C9:FB:00:D7:4E:98:DA:87:AA:2A:D0:A7:2E:B1:40:31:A7:4C
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-    Signature Algorithm: sha1WithRSAEncryption
-         c2:89:84:a0:e8:8c:66:fd:ff:13:05:1b:c3:3a:8e:98:49:8a:
-         f8:aa:00:5c:26:fd:72:6a:a3:7e:12:1b:94:ae:54:f8:21:8f:
-         a7:93:4f:f7:16:ef:b9:b9:b3:32:c0:25:21:31:66:37:2c:09:
-         b0:fe:32:b0:37:ec:3c:b8:ce:8f:08:aa:08:90:07:5c:75:d5:
-         e1:4e:2c:cb:02:24:e9:a2:5e:e9:f5:78:35:22:06:1c:f2:1f:
-         88:b1:e1:5c:cc:96:54:fa:6f:49:cc:8d:f1:56:03:ed:cf:2c:
-         9f:27:de:e5:ca:83:44:be:46:40:f9:57:2e:d2:7f:31:2d:ce:
-         83:dc:fe:70:6b:84:d0:a3:9f:ff:97:d0:a8:d7:02:ec:b1:2c:
-         f0:ef:73:38:3d:99:ac:c4:4f:01:bf:d5:6a:ea:c6:2e:32:29:
-         17:0a:cb:e6:69:9e:d1:4a:b5:f6:df:8e:19:f8:95:e9:45:a9:
-         0e:cd:6d:41:59:20:9e:73:c6:6c:71:1c:9c:d4:4d:30:a8:73:
-         09:a0:15:f3:a0:45:26:c3:5b:fd:bb:b9:d8:2d:d7:1f:f5:05:
-         30:19:f6:ae:0f:8e:62:8f:df:c8:4f:86:d9:1d:61:16:b3:c9:
-         f0:bb:fb:c7:f5:af:01:22:47:ec:d8:da:cf:1c:f3:53:66:ba:
-         53:09:01:f9
------BEGIN CERTIFICATE-----
-MIIDkDCCAnigAwIBAgIQHKAtwVI7am2LXB+VSu2sMDANBgkqhkiG9w0BAQUFADBi
-MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
-MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
-dHkwHhcNMTEwMTAxMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
-UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
-ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
-c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
-OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
-mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
-BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
-qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjQjBA
-MB0GA1UdDgQWBBQhMMn7ANdOmNqHqirQpy6xQDGnTDAOBgNVHQ8BAf8EBAMCAQYw
-DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAwomEoOiMZv3/EwUb
-wzqOmEmK+KoAXCb9cmqjfhIblK5U+CGPp5NP9xbvubmzMsAlITFmNywJsP4ysDfs
-PLjOjwiqCJAHXHXV4U4sywIk6aJe6fV4NSIGHPIfiLHhXMyWVPpvScyN8VYD7c8s
-nyfe5cqDRL5GQPlXLtJ/MS3Og9z+cGuE0KOf/5fQqNcC7LEs8O9zOD2ZrMRPAb/V
-aurGLjIpFwrL5mme0Uq19t+OGfiV6UWpDs1tQVkgnnPGbHEcnNRNMKhzCaAV86BF
-JsNb/bu52C3XH/UFMBn2rg+OYo/fyE+G2R1hFrPJ8Lv7x/WvASJH7NjazxzzU2a6
-UwkB+Q==
------END CERTIFICATE-----
-
-# 6b9c08e86eb0f767cfad65cd98b62149e5494a67f5845e7bd1ed019f27b86bd6
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            76:b1:20:52:74:f0:85:87:46:b3:f8:23:1a:f6:c2:c0
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=CH, O=WISeKey, OU=OISTE Foundation Endorsed, CN=OISTE WISeKey Global Root GB CA
-        Validity
-            Not Before: Dec  1 15:00:32 2014 GMT
-            Not After : Dec  1 15:10:31 2039 GMT
-        Subject: C=CH, O=WISeKey, OU=OISTE Foundation Endorsed, CN=OISTE WISeKey Global Root GB CA
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:d8:17:b7:1c:4a:24:2a:d6:97:b1:ca:e2:1e:fb:
-                    7d:38:ef:98:f5:b2:39:98:4e:27:b8:11:5d:7b:d2:
-                    25:94:88:82:15:26:6a:1b:31:bb:a8:5b:21:21:2b:
-                    d8:0f:4e:9f:5a:f1:b1:5a:e4:79:d6:32:23:2b:e1:
-                    53:cc:99:45:5c:7b:4f:ad:bc:bf:87:4a:0b:4b:97:
-                    5a:a8:f6:48:ec:7d:7b:0d:cd:21:06:df:9e:15:fd:
-                    41:8a:48:b7:20:f4:a1:7a:1b:57:d4:5d:50:ff:ba:
-                    67:d8:23:99:1f:c8:3f:e3:de:ff:6f:5b:77:b1:6b:
-                    6e:b8:c9:64:f7:e1:ca:41:46:0e:29:71:d0:b9:23:
-                    fc:c9:81:5f:4e:f7:6f:df:bf:84:ad:73:64:bb:b7:
-                    42:8e:69:f6:d4:76:1d:7e:9d:a7:b8:57:8a:51:67:
-                    72:d7:d4:a8:b8:95:54:40:73:03:f6:ea:f4:eb:fe:
-                    28:42:77:3f:9d:23:1b:b2:b6:3d:80:14:07:4c:2e:
-                    4f:f7:d5:0a:16:0d:bd:66:43:37:7e:23:43:79:c3:
-                    40:86:f5:4c:29:da:8e:9a:ad:0d:a5:04:87:88:1e:
-                    85:e3:e9:53:d5:9b:c8:8b:03:63:78:eb:e0:19:4a:
-                    6e:bb:2f:6b:33:64:58:93:ad:69:bf:8f:1b:ef:82:
-                    48:c7
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Key Usage: 
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                35:0F:C8:36:63:5E:E2:A3:EC:F9:3B:66:15:CE:51:52:E3:91:9A:3D
-            1.3.6.1.4.1.311.21.1: 
-                ...
-    Signature Algorithm: sha256WithRSAEncryption
-         40:4c:fb:87:b2:99:81:90:7e:9d:c5:b0:b0:26:cd:88:7b:2b:
-         32:8d:6e:b8:21:71:58:97:7d:ae:37:14:af:3e:e7:f7:9a:e2:
-         7d:f6:71:98:99:04:aa:43:74:78:a3:e3:49:61:3e:73:8c:4d:
-         94:e0:f9:71:c4:b6:16:0e:53:78:1f:d6:a2:87:2f:02:39:81:
-         29:3c:af:15:98:21:30:fe:28:90:00:8c:d1:e1:cb:fa:5e:c8:
-         fd:f8:10:46:3b:a2:78:42:91:17:74:55:0a:de:50:67:4d:66:
-         d1:a7:ff:fd:d9:c0:b5:a8:a3:8a:ce:66:f5:0f:43:cd:a7:2b:
-         57:7b:63:46:6a:aa:2e:52:d8:f4:ed:e1:6d:ad:29:90:78:48:
-         ba:e1:23:aa:a3:89:ec:b5:ab:96:c0:b4:4b:a2:1d:97:9e:7a:
-         f2:6e:40:71:df:68:f1:65:4d:ce:7c:05:df:53:65:a9:a5:f0:
-         b1:97:04:70:15:46:03:98:d4:d2:bf:54:b4:a0:58:7d:52:6f:
-         da:56:26:62:d4:d8:db:89:31:6f:1c:f0:22:c2:d3:62:1c:35:
-         cd:4c:69:15:54:1a:90:98:de:eb:1e:5f:ca:77:c7:cb:8e:3d:
-         43:69:9c:9a:58:d0:24:3b:df:1b:40:96:7e:35:ad:81:c7:4e:
-         71:ba:88:13
------BEGIN CERTIFICATE-----
-MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt
-MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg
-Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i
-YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x
-CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG
-b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
-bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3
-HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx
-WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX
-1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk
-u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P
-99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r
-M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB
-BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh
-cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5
-gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO
-ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf
-aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
-Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
------END CERTIFICATE-----
-
-# 85a0dd7dd720adb7ff05f83d542b209dc7ff4528f7d677b18389fea5e5c49e86
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 1289 (0x509)
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=BM, O=QuoVadis Limited, CN=QuoVadis Root CA 2
-        Validity
-            Not Before: Nov 24 18:27:00 2006 GMT
-            Not After : Nov 24 18:23:33 2031 GMT
-        Subject: C=BM, O=QuoVadis Limited, CN=QuoVadis Root CA 2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:9a:18:ca:4b:94:0d:00:2d:af:03:29:8a:f0:0f:
-                    81:c8:ae:4c:19:85:1d:08:9f:ab:29:44:85:f3:2f:
-                    81:ad:32:1e:90:46:bf:a3:86:26:1a:1e:fe:7e:1c:
-                    18:3a:5c:9c:60:17:2a:3a:74:83:33:30:7d:61:54:
-                    11:cb:ed:ab:e0:e6:d2:a2:7e:f5:6b:6f:18:b7:0a:
-                    0b:2d:fd:e9:3e:ef:0a:c6:b3:10:e9:dc:c2:46:17:
-                    f8:5d:fd:a4:da:ff:9e:49:5a:9c:e6:33:e6:24:96:
-                    f7:3f:ba:5b:2b:1c:7a:35:c2:d6:67:fe:ab:66:50:
-                    8b:6d:28:60:2b:ef:d7:60:c3:c7:93:bc:8d:36:91:
-                    f3:7f:f8:db:11:13:c4:9c:77:76:c1:ae:b7:02:6a:
-                    81:7a:a9:45:83:e2:05:e6:b9:56:c1:94:37:8f:48:
-                    71:63:22:ec:17:65:07:95:8a:4b:df:8f:c6:5a:0a:
-                    e5:b0:e3:5f:5e:6b:11:ab:0c:f9:85:eb:44:e9:f8:
-                    04:73:f2:e9:fe:5c:98:8c:f5:73:af:6b:b4:7e:cd:
-                    d4:5c:02:2b:4c:39:e1:b2:95:95:2d:42:87:d7:d5:
-                    b3:90:43:b7:6c:13:f1:de:dd:f6:c4:f8:89:3f:d1:
-                    75:f5:92:c3:91:d5:8a:88:d0:90:ec:dc:6d:de:89:
-                    c2:65:71:96:8b:0d:03:fd:9c:bf:5b:16:ac:92:db:
-                    ea:fe:79:7c:ad:eb:af:f7:16:cb:db:cd:25:2b:e5:
-                    1f:fb:9a:9f:e2:51:cc:3a:53:0c:48:e6:0e:bd:c9:
-                    b4:76:06:52:e6:11:13:85:72:63:03:04:e0:04:36:
-                    2b:20:19:02:e8:74:a7:1f:b6:c9:56:66:f0:75:25:
-                    dc:67:c1:0e:61:60:88:b3:3e:d1:a8:fc:a3:da:1d:
-                    b0:d1:b1:23:54:df:44:76:6d:ed:41:d8:c1:b2:22:
-                    b6:53:1c:df:35:1d:dc:a1:77:2a:31:e4:2d:f5:e5:
-                    e5:db:c8:e0:ff:e5:80:d7:0b:63:a0:ff:33:a1:0f:
-                    ba:2c:15:15:ea:97:b3:d2:a2:b5:be:f2:8c:96:1e:
-                    1a:8f:1d:6c:a4:61:37:b9:86:73:33:d7:97:96:9e:
-                    23:7d:82:a4:4c:81:e2:a1:d1:ba:67:5f:95:07:a3:
-                    27:11:ee:16:10:7b:bc:45:4a:4c:b2:04:d2:ab:ef:
-                    d5:fd:0c:51:ce:50:6a:08:31:f9:91:da:0c:8f:64:
-                    5c:03:c3:3a:8b:20:3f:6e:8d:67:3d:3a:d6:fe:7d:
-                    5b:88:c9:5e:fb:cc:61:dc:8b:33:77:d3:44:32:35:
-                    09:62:04:92:16:10:d8:9e:27:47:fb:3b:21:e3:f8:
-                    eb:1d:5b
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: 
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                1A:84:62:BC:48:4C:33:25:04:D4:EE:D0:F6:03:C4:19:46:D1:94:6B
-            X509v3 Authority Key Identifier: 
-                keyid:1A:84:62:BC:48:4C:33:25:04:D4:EE:D0:F6:03:C4:19:46:D1:94:6B
-                DirName:/C=BM/O=QuoVadis Limited/CN=QuoVadis Root CA 2
-                serial:05:09
-
-    Signature Algorithm: sha1WithRSAEncryption
-         3e:0a:16:4d:9f:06:5b:a8:ae:71:5d:2f:05:2f:67:e6:13:45:
-         83:c4:36:f6:f3:c0:26:0c:0d:b5:47:64:5d:f8:b4:72:c9:46:
-         a5:03:18:27:55:89:78:7d:76:ea:96:34:80:17:20:dc:e7:83:
-         f8:8d:fc:07:b8:da:5f:4d:2e:67:b2:84:fd:d9:44:fc:77:50:
-         81:e6:7c:b4:c9:0d:0b:72:53:f8:76:07:07:41:47:96:0c:fb:
-         e0:82:26:93:55:8c:fe:22:1f:60:65:7c:5f:e7:26:b3:f7:32:
-         90:98:50:d4:37:71:55:f6:92:21:78:f7:95:79:fa:f8:2d:26:
-         87:66:56:30:77:a6:37:78:33:52:10:58:ae:3f:61:8e:f2:6a:
-         b1:ef:18:7e:4a:59:63:ca:8d:a2:56:d5:a7:2f:bc:56:1f:cf:
-         39:c1:e2:fb:0a:a8:15:2c:7d:4d:7a:63:c6:6c:97:44:3c:d2:
-         6f:c3:4a:17:0a:f8:90:d2:57:a2:19:51:a5:2d:97:41:da:07:
-         4f:a9:50:da:90:8d:94:46:e1:3e:f0:94:fd:10:00:38:f5:3b:
-         e8:40:e1:b4:6e:56:1a:20:cc:6f:58:8d:ed:2e:45:8f:d6:e9:
-         93:3f:e7:b1:2c:df:3a:d6:22:8c:dc:84:bb:22:6f:d0:f8:e4:
-         c6:39:e9:04:88:3c:c3:ba:eb:55:7a:6d:80:99:24:f5:6c:01:
-         fb:f8:97:b0:94:5b:eb:fd:d2:6f:f1:77:68:0d:35:64:23:ac:
-         b8:55:a1:03:d1:4d:42:19:dc:f8:75:59:56:a3:f9:a8:49:79:
-         f8:af:0e:b9:11:a0:7c:b7:6a:ed:34:d0:b6:26:62:38:1a:87:
-         0c:f8:e8:fd:2e:d3:90:7f:07:91:2a:1d:d6:7e:5c:85:83:99:
-         b0:38:08:3f:e9:5e:f9:35:07:e4:c9:62:6e:57:7f:a7:50:95:
-         f7:ba:c8:9b:e6:8e:a2:01:c5:d6:66:bf:79:61:f3:3c:1c:e1:
-         b9:82:5c:5d:a0:c3:e9:d8:48:bd:19:a2:11:14:19:6e:b2:86:
-         1b:68:3e:48:37:1a:88:b7:5d:96:5e:9c:c7:ef:27:62:08:e2:
-         91:19:5c:d2:f1:21:dd:ba:17:42:82:97:71:81:53:31:a9:9f:
-         f6:7d:62:bf:72:e1:a3:93:1d:cc:8a:26:5a:09:38:d0:ce:d7:
-         0d:80:16:b4:78:a5:3a:87:4c:8d:8a:a5:d5:46:97:f2:2c:10:
-         b9:bc:54:22:c0:01:50:69:43:9e:f4:b2:ef:6d:f8:ec:da:f1:
-         e3:b1:ef:df:91:8f:54:2a:0b:25:c1:26:19:c4:52:10:05:65:
-         d5:82:10:ea:c2:31:cd:2e
------BEGIN CERTIFICATE-----
-MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
-GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
-b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
-BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
-YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
-GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
-Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
-WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
-rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
-+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
-ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
-Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
-PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
-/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
-oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
-yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
-EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
-A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
-MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
-ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
-BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
-g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
-fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
-WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
-B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
-hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
-TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
-mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
-ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
-4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
-8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
------END CERTIFICATE-----
-
-# 8fe4fb0af93a4d0d67db0bebb23e37c71bf325dcbcdd240ea04daf58b47e1840
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            44:57:34:24:5b:81:89:9b:35:f2:ce:b8:2b:3b:5b:a7:26:f0:75:28
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=BM, O=QuoVadis Limited, CN=QuoVadis Root CA 2 G3
-        Validity
-            Not Before: Jan 12 18:59:32 2012 GMT
-            Not After : Jan 12 18:59:32 2042 GMT
-        Subject: C=BM, O=QuoVadis Limited, CN=QuoVadis Root CA 2 G3
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:a1:ae:25:b2:01:18:dc:57:88:3f:46:eb:f9:af:
-                    e2:eb:23:71:e2:9a:d1:61:66:21:5f:aa:af:27:51:
-                    e5:6e:1b:16:d4:2d:7d:50:b0:53:77:bd:78:3a:60:
-                    e2:64:02:9b:7c:86:9b:d6:1a:8e:ad:ff:1f:15:7f:
-                    d5:95:1e:12:cb:e6:14:84:04:c1:df:36:b3:16:9f:
-                    8a:e3:c9:db:98:34:ce:d8:33:17:28:46:fc:a7:c9:
-                    f0:d2:b4:d5:4d:09:72:49:f9:f2:87:e3:a9:da:7d:
-                    a1:7d:6b:b2:3a:25:a9:6d:52:44:ac:f8:be:6e:fb:
-                    dc:a6:73:91:90:61:a6:03:14:20:f2:e7:87:a3:88:
-                    ad:ad:a0:8c:ff:a6:0b:25:52:25:e7:16:01:d5:cb:
-                    b8:35:81:0c:a3:3b:f0:e1:e1:fc:5a:5d:ce:80:71:
-                    6d:f8:49:ab:3e:3b:ba:b8:d7:80:01:fb:a5:eb:5b:
-                    b3:c5:5e:60:2a:31:a0:af:37:e8:20:3a:9f:a8:32:
-                    2c:0c:cc:09:1d:d3:9e:8e:5d:bc:4c:98:ee:c5:1a:
-                    68:7b:ec:53:a6:e9:14:35:a3:df:cd:80:9f:0c:48:
-                    fb:1c:f4:f1:bf:4a:b8:fa:d5:8c:71:4a:c7:1f:ad:
-                    fe:41:9a:b3:83:5d:f2:84:56:ef:a5:57:43:ce:29:
-                    ad:8c:ab:55:bf:c4:fb:5b:01:dd:23:21:a1:58:00:
-                    8e:c3:d0:6a:13:ed:13:e3:12:2b:80:dc:67:e6:95:
-                    b2:cd:1e:22:6e:2a:f8:41:d4:f2:ca:14:07:8d:8a:
-                    55:12:c6:69:f5:b8:86:68:2f:53:5e:b0:d2:aa:21:
-                    c1:98:e6:30:e3:67:55:c7:9b:6e:ac:19:a8:55:a6:
-                    45:06:d0:23:3a:db:eb:65:5d:2a:11:11:f0:3b:4f:
-                    ca:6d:f4:34:c4:71:e4:ff:00:5a:f6:5c:ae:23:60:
-                    85:73:f1:e4:10:b1:25:ae:d5:92:bb:13:c1:0c:e0:
-                    39:da:b4:39:57:b5:ab:35:aa:72:21:3b:83:35:e7:
-                    31:df:7a:21:6e:b8:32:08:7d:1d:32:91:15:4a:62:
-                    72:cf:e3:77:a1:bc:d5:11:1b:76:01:67:08:e0:41:
-                    0b:c3:eb:15:6e:f8:a4:19:d9:a2:ab:af:e2:27:52:
-                    56:2b:02:8a:2c:14:24:f9:bf:42:02:bf:26:c8:c6:
-                    8f:e0:6e:38:7d:53:2d:e5:ed:98:b3:95:63:68:7f:
-                    f9:35:f4:df:88:c5:60:35:92:c0:7c:69:1c:61:95:
-                    16:d0:eb:de:0b:af:3e:04:10:45:65:58:50:38:af:
-                    48:f2:59:b6:16:f2:3c:0d:90:02:c6:70:2e:01:ad:
-                    3c:15:d7
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                ED:E7:6F:76:5A:BF:60:EC:49:5B:C6:A5:77:BB:72:16:71:9B:C4:3D
-    Signature Algorithm: sha256WithRSAEncryption
-         91:df:80:3f:43:09:7e:71:c2:f7:eb:b3:88:8f:e1:51:b2:bc:
-         3d:75:f9:28:5d:c8:bc:99:9b:7b:5d:aa:e5:ca:e1:0a:f7:e8:
-         b2:d3:9f:dd:67:31:7e:ba:01:aa:c7:6a:41:3b:90:d4:08:5c:
-         b2:60:6a:90:f0:c8:ce:03:62:f9:8b:ed:fb:6e:2a:dc:06:4d:
-         3c:29:0f:89:16:8a:58:4c:48:0f:e8:84:61:ea:3c:72:a6:77:
-         e4:42:ae:88:a3:43:58:79:7e:ae:ca:a5:53:0d:a9:3d:70:bd:
-         20:19:61:a4:6c:38:fc:43:32:e1:c1:47:ff:f8:ec:f1:11:22:
-         32:96:9c:c2:f6:5b:69:96:7b:20:0c:43:41:9a:5b:f6:59:19:
-         88:de:55:88:37:51:0b:78:5c:0a:1e:a3:42:fd:c7:9d:88:0f:
-         c0:f2:78:02:24:54:93:af:89:87:88:c9:4a:80:1d:ea:d0:6e:
-         3e:61:2e:36:bb:35:0e:27:96:fd:66:34:3b:61:72:73:f1:16:
-         5c:47:06:54:49:00:7a:58:12:b0:0a:ef:85:fd:b1:b8:33:75:
-         6a:93:1c:12:e6:60:5e:6f:1d:7f:c9:1f:23:cb:84:61:9f:1e:
-         82:44:f9:5f:ad:62:55:24:9a:52:98:ed:51:e7:a1:7e:97:3a:
-         e6:2f:1f:11:da:53:80:2c:85:9e:ab:35:10:db:22:5f:6a:c5:
-         5e:97:53:f2:32:02:09:30:a3:58:f0:0d:01:d5:72:c6:b1:7c:
-         69:7b:c3:f5:36:45:cc:61:6e:5e:4c:94:c5:5e:ae:e8:0e:5e:
-         8b:bf:f7:cd:e0:ed:a1:0e:1b:33:ee:54:18:fe:0f:be:ef:7e:
-         84:6b:43:e3:70:98:db:5d:75:b2:0d:59:07:85:15:23:39:d6:
-         f1:df:a9:26:0f:d6:48:c7:b3:a6:22:f5:33:37:5a:95:47:9f:
-         7b:ba:18:15:6f:ff:d6:14:64:83:49:d2:0a:67:21:db:0f:35:
-         63:60:28:22:e3:b1:95:83:cd:85:a6:dd:2f:0f:e7:67:52:6e:
-         bb:2f:85:7c:f5:4a:73:e7:c5:3e:c0:bd:21:12:05:3f:fc:b7:
-         03:49:02:5b:c8:25:e6:e2:54:38:f5:79:87:8c:1d:53:b2:4e:
-         85:7b:06:38:c7:2c:f8:f8:b0:72:8d:25:e5:77:52:f4:03:1c:
-         48:a6:50:5f:88:20:30:6e:f2:82:43:ab:3d:97:84:e7:53:fb:
-         21:c1:4f:0f:22:9a:86:b8:59:2a:f6:47:3d:19:88:2d:e8:85:
-         e1:9e:ec:85:08:6a:b1:6c:34:c9:1d:ec:48:2b:3b:78:ed:66:
-         c4:8e:79:69:83:de:7f:8c
------BEGIN CERTIFICATE-----
-MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL
-BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc
-BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00
-MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
-aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf
-qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW
-n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym
-c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+
-O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1
-o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j
-IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq
-IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz
-8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh
-vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l
-7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG
-cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
-BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD
-ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
-AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC
-roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga
-W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n
-lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE
-+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV
-csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd
-dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg
-KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM
-HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4
-WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M
------END CERTIFICATE-----
-
-# f1c1b50ae5a20dd8030ec9f6bc24823dd367b5255759b4e71b61fce9f7375d73
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            0c:f0:8e:5c:08:16:a5:ad:42:7f:f0:eb:27:18:59:d0
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=US, O=SecureTrust Corporation, CN=SecureTrust CA
-        Validity
-            Not Before: Nov  7 19:31:18 2006 GMT
-            Not After : Dec 31 19:40:55 2029 GMT
-        Subject: C=US, O=SecureTrust Corporation, CN=SecureTrust CA
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:ab:a4:81:e5:95:cd:f5:f6:14:8e:c2:4f:ca:d4:
-                    e2:78:95:58:9c:41:e1:0d:99:40:24:17:39:91:33:
-                    66:e9:be:e1:83:af:62:5c:89:d1:fc:24:5b:61:b3:
-                    e0:11:11:41:1c:1d:6e:f0:b8:bb:f8:de:a7:81:ba:
-                    a6:48:c6:9f:1d:bd:be:8e:a9:41:3e:b8:94:ed:29:
-                    1a:d4:8e:d2:03:1d:03:ef:6d:0d:67:1c:57:d7:06:
-                    ad:ca:c8:f5:fe:0e:af:66:25:48:04:96:0b:5d:a3:
-                    ba:16:c3:08:4f:d1:46:f8:14:5c:f2:c8:5e:01:99:
-                    6d:fd:88:cc:86:a8:c1:6f:31:42:6c:52:3e:68:cb:
-                    f3:19:34:df:bb:87:18:56:80:26:c4:d0:dc:c0:6f:
-                    df:de:a0:c2:91:16:a0:64:11:4b:44:bc:1e:f6:e7:
-                    fa:63:de:66:ac:76:a4:71:a3:ec:36:94:68:7a:77:
-                    a4:b1:e7:0e:2f:81:7a:e2:b5:72:86:ef:a2:6b:8b:
-                    f0:0f:db:d3:59:3f:ba:72:bc:44:24:9c:e3:73:b3:
-                    f7:af:57:2f:42:26:9d:a9:74:ba:00:52:f2:4b:cd:
-                    53:7c:47:0b:36:85:0e:66:a9:08:97:16:34:57:c1:
-                    66:f7:80:e3:ed:70:54:c7:93:e0:2e:28:15:59:87:
-                    ba:bb
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            1.3.6.1.4.1.311.20.2: 
-                ...C.A
-            X509v3 Key Usage: 
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                42:32:B6:16:FA:04:FD:FE:5D:4B:7A:C3:FD:F7:4C:40:1D:5A:43:AF
-            X509v3 CRL Distribution Points: 
-
-                Full Name:
-                  URI:http://crl.securetrust.com/STCA.crl
-
-            1.3.6.1.4.1.311.21.1: 
-                ...
-    Signature Algorithm: sha1WithRSAEncryption
-         30:ed:4f:4a:e1:58:3a:52:72:5b:b5:a6:a3:65:18:a6:bb:51:
-         3b:77:e9:9d:ea:d3:9f:5c:e0:45:65:7b:0d:ca:5b:e2:70:50:
-         b2:94:05:14:ae:49:c7:8d:41:07:12:73:94:7e:0c:23:21:fd:
-         bc:10:7f:60:10:5a:72:f5:98:0e:ac:ec:b9:7f:dd:7a:6f:5d:
-         d3:1c:f4:ff:88:05:69:42:a9:05:71:c8:b7:ac:26:e8:2e:b4:
-         8c:6a:ff:71:dc:b8:b1:df:99:bc:7c:21:54:2b:e4:58:a2:bb:
-         57:29:ae:9e:a9:a3:19:26:0f:99:2e:08:b0:ef:fd:69:cf:99:
-         1a:09:8d:e3:a7:9f:2b:c9:36:34:7b:24:b3:78:4c:95:17:a4:
-         06:26:1e:b6:64:52:36:5f:60:67:d9:9c:c5:05:74:0b:e7:67:
-         23:d2:08:fc:88:e9:ae:8b:7f:e1:30:f4:37:7e:fd:c6:32:da:
-         2d:9e:44:30:30:6c:ee:07:de:d2:34:fc:d2:ff:40:f6:4b:f4:
-         66:46:06:54:a6:f2:32:0a:63:26:30:6b:9b:d1:dc:8b:47:ba:
-         e1:b9:d5:62:d0:a2:a0:f4:67:05:78:29:63:1a:6f:04:d6:f8:
-         c6:4c:a3:9a:b1:37:b4:8d:e5:28:4b:1d:9e:2c:c2:b8:68:bc:
-         ed:02:ee:31
------BEGIN CERTIFICATE-----
-MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
-MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
-cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
-Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
-0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
-wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
-7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
-8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
-BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
-/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
-JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
-NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
-6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
-3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
-D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
-CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
-3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
------END CERTIFICATE-----
-
-# 4200f5043ac8590ebb527d209ed1503029fbcbd41ca1b506ec27f15ade7dac69
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            07:56:22:a4:e8:d4:8a:89:4d:f4:13:c8:f0:f8:ea:a5
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=US, O=SecureTrust Corporation, CN=Secure Global CA
-        Validity
-            Not Before: Nov  7 19:42:28 2006 GMT
-            Not After : Dec 31 19:52:06 2029 GMT
-        Subject: C=US, O=SecureTrust Corporation, CN=Secure Global CA
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:af:35:2e:d8:ac:6c:55:69:06:71:e5:13:68:24:
-                    b3:4f:d8:cc:21:47:f8:f1:60:38:89:89:03:e9:bd:
-                    ea:5e:46:53:09:dc:5c:f5:5a:e8:f7:45:2a:02:eb:
-                    31:61:d7:29:33:4c:ce:c7:7c:0a:37:7e:0f:ba:32:
-                    98:e1:1d:97:af:8f:c7:dc:c9:38:96:f3:db:1a:fc:
-                    51:ed:68:c6:d0:6e:a4:7c:24:d1:ae:42:c8:96:50:
-                    63:2e:e0:fe:75:fe:98:a7:5f:49:2e:95:e3:39:33:
-                    64:8e:1e:a4:5f:90:d2:67:3c:b2:d9:fe:41:b9:55:
-                    a7:09:8e:72:05:1e:8b:dd:44:85:82:42:d0:49:c0:
-                    1d:60:f0:d1:17:2c:95:eb:f6:a5:c1:92:a3:c5:c2:
-                    a7:08:60:0d:60:04:10:96:79:9e:16:34:e6:a9:b6:
-                    fa:25:45:39:c8:1e:65:f9:93:f5:aa:f1:52:dc:99:
-                    98:3d:a5:86:1a:0c:35:33:fa:4b:a5:04:06:15:1c:
-                    31:80:ef:aa:18:6b:c2:7b:d7:da:ce:f9:33:20:d5:
-                    f5:bd:6a:33:2d:81:04:fb:b0:5c:d4:9c:a3:e2:5c:
-                    1d:e3:a9:42:75:5e:7b:d4:77:ef:39:54:ba:c9:0a:
-                    18:1b:12:99:49:2f:88:4b:fd:50:62:d1:73:e7:8f:
-                    7a:43
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            1.3.6.1.4.1.311.20.2: 
-                ...C.A
-            X509v3 Key Usage: 
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                AF:44:04:C2:41:7E:48:83:DB:4E:39:02:EC:EC:84:7A:E6:CE:C9:A4
-            X509v3 CRL Distribution Points: 
-
-                Full Name:
-                  URI:http://crl.securetrust.com/SGCA.crl
-
-            1.3.6.1.4.1.311.21.1: 
-                ...
-    Signature Algorithm: sha1WithRSAEncryption
-         63:1a:08:40:7d:a4:5e:53:0d:77:d8:7a:ae:1f:0d:0b:51:16:
-         03:ef:18:7c:c8:e3:af:6a:58:93:14:60:91:b2:84:dc:88:4e:
-         be:39:8a:3a:f3:e6:82:89:5d:01:37:b3:ab:24:a4:15:0e:92:
-         35:5a:4a:44:5e:4e:57:fa:75:ce:1f:48:ce:66:f4:3c:40:26:
-         92:98:6c:1b:ee:24:46:0c:17:b3:52:a5:db:a5:91:91:cf:37:
-         d3:6f:e7:27:08:3a:4e:19:1f:3a:a7:58:5c:17:cf:79:3f:8b:
-         e4:a7:d3:26:23:9d:26:0f:58:69:fc:47:7e:b2:d0:8d:8b:93:
-         bf:29:4f:43:69:74:76:67:4b:cf:07:8c:e6:02:f7:b5:e1:b4:
-         43:b5:4b:2d:14:9f:f9:dc:26:0d:bf:a6:47:74:06:d8:88:d1:
-         3a:29:30:84:ce:d2:39:80:62:1b:a8:c7:57:49:bc:6a:55:51:
-         67:15:4a:be:35:07:e4:d5:75:98:37:79:30:14:db:29:9d:6c:
-         c5:69:cc:47:55:a2:30:f7:cc:5c:7f:c2:c3:98:1c:6b:4e:16:
-         80:eb:7a:78:65:45:a2:00:1a:af:0c:0d:55:64:34:48:b8:92:
-         b9:f1:b4:50:29:f2:4f:23:1f:da:6c:ac:1f:44:e1:dd:23:78:
-         51:5b:c7:16
------BEGIN CERTIFICATE-----
-MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
-MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
-GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
-MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
-Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
-iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
-/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
-jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
-HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
-sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
-gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
-MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
-KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
-AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
-URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
-H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
-I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
-iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
-f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
------END CERTIFICATE-----
-
-# 513b2cecb810d4cde5dd85391adfc6c2dd60d87bb736d2b521484aa47a0ebef6
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 0 (0x0)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=JP, O=SECOM Trust Systems CO.,LTD., OU=Security Communication RootCA2
-        Validity
-            Not Before: May 29 05:00:39 2009 GMT
-            Not After : May 29 05:00:39 2029 GMT
-        Subject: C=JP, O=SECOM Trust Systems CO.,LTD., OU=Security Communication RootCA2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:d0:15:39:52:b1:52:b3:ba:c5:59:82:c4:5d:52:
-                    ae:3a:43:65:80:4b:c7:f2:96:bc:db:36:97:d6:a6:
-                    64:8c:a8:5e:f0:e3:0a:1c:f7:df:97:3d:4b:ae:f6:
-                    5d:ec:21:b5:41:ab:cd:b9:7e:76:9f:be:f9:3e:36:
-                    34:a0:3b:c1:f6:31:11:45:74:93:3d:57:80:c5:f9:
-                    89:99:ca:e5:ab:6a:d4:b5:da:41:90:10:c1:d6:d6:
-                    42:89:c2:bf:f4:38:12:95:4c:54:05:f7:36:e4:45:
-                    83:7b:14:65:d6:dc:0c:4d:d1:de:7e:0c:ab:3b:c4:
-                    15:be:3a:56:a6:5a:6f:76:69:52:a9:7a:b9:c8:eb:
-                    6a:9a:5d:52:d0:2d:0a:6b:35:16:09:10:84:d0:6a:
-                    ca:3a:06:00:37:47:e4:7e:57:4f:3f:8b:eb:67:b8:
-                    88:aa:c5:be:53:55:b2:91:c4:7d:b9:b0:85:19:06:
-                    78:2e:db:61:1a:fa:85:f5:4a:91:a1:e7:16:d5:8e:
-                    a2:39:df:94:b8:70:1f:28:3f:8b:fc:40:5e:63:83:
-                    3c:83:2a:1a:99:6b:cf:de:59:6a:3b:fc:6f:16:d7:
-                    1f:fd:4a:10:eb:4e:82:16:3a:ac:27:0c:53:f1:ad:
-                    d5:24:b0:6b:03:50:c1:2d:3c:16:dd:44:34:27:1a:
-                    75:fb
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                0A:85:A9:77:65:05:98:7C:40:81:F8:0F:97:2C:38:F1:0A:EC:3C:CF
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-    Signature Algorithm: sha256WithRSAEncryption
-         4c:3a:a3:44:ac:b9:45:b1:c7:93:7e:c8:0b:0a:42:df:64:ea:
-         1c:ee:59:6c:08:ba:89:5f:6a:ca:4a:95:9e:7a:8f:07:c5:da:
-         45:72:82:71:0e:3a:d2:cc:6f:a7:b4:a1:23:bb:f6:24:9f:cb:
-         17:fe:8c:a6:ce:c2:d2:db:cc:8d:fc:71:fc:03:29:c1:6c:5d:
-         33:5f:64:b6:65:3b:89:6f:18:76:78:f5:dc:a2:48:1f:19:3f:
-         8e:93:eb:f1:fa:17:ee:cd:4e:e3:04:12:55:d6:e5:e4:dd:fb:
-         3e:05:7c:e2:1d:5e:c6:a7:bc:97:4f:68:3a:f5:e9:2e:0a:43:
-         b6:af:57:5c:62:68:7c:b7:fd:a3:8a:84:a0:ac:62:be:2b:09:
-         87:34:f0:6a:01:bb:9b:29:56:3c:fe:00:37:cf:23:6c:f1:4e:
-         aa:b6:74:46:12:6c:91:ee:34:d5:ec:9a:91:e7:44:be:90:31:
-         72:d5:49:02:f6:02:e5:f4:1f:eb:7c:d9:96:55:a9:ff:ec:8a:
-         f9:99:47:ff:35:5a:02:aa:04:cb:8a:5b:87:71:29:91:bd:a4:
-         b4:7a:0d:bd:9a:f5:57:23:00:07:21:17:3f:4a:39:d1:05:49:
-         0b:a7:b6:37:81:a5:5d:8c:aa:33:5e:81:28:7c:a7:7d:27:eb:
-         00:ae:8d:37
------BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
-MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
-U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
-DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
-dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
-YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
-OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
-zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
-VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
-hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
-ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
-awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
-OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
-DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
-coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
-okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
-t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
-1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
-SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
------END CERTIFICATE-----
-
-# 22a2c1f7bded704cc1e701b5f408c310880fe956b5de2a4a44f99c873a25a7c8
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 3182246526754555285 (0x2c299c5b16ed0595)
-        Signature Algorithm: ecdsa-with-SHA256
-        Issuer: C = US, ST = Texas, L = Houston, O = SSL Corporation, CN = SSL.com EV Root Certification Authority ECC
-        Validity
-            Not Before: Feb 12 18:15:23 2016 GMT
-            Not After : Feb 12 18:15:23 2041 GMT
-        Subject: C = US, ST = Texas, L = Houston, O = SSL Corporation, CN = SSL.com EV Root Certification Authority ECC
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub:
-                    04:aa:12:47:90:98:1b:fb:ef:c3:40:07:83:20:4e:
-                    f1:30:82:a2:06:d1:f2:92:86:61:f2:f6:21:68:ca:
-                    00:c4:c7:ea:43:00:54:86:dc:fd:1f:df:00:b8:41:
-                    62:5c:dc:70:16:32:de:1f:99:d4:cc:c5:07:c8:08:
-                    1f:61:16:07:51:3d:7d:5c:07:53:e3:35:38:8c:df:
-                    cd:9f:d9:2e:0d:4a:b6:19:2e:5a:70:5a:06:ed:be:
-                    f0:a1:b0:ca:d0:09:29
-                ASN1 OID: secp384r1
-                NIST CURVE: P-384
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                5B:CA:5E:E5:DE:D2:81:AA:CD:A8:2D:64:51:B6:D9:72:9B:97:E6:4F
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Authority Key Identifier: 
-                keyid:5B:CA:5E:E5:DE:D2:81:AA:CD:A8:2D:64:51:B6:D9:72:9B:97:E6:4F
-
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-    Signature Algorithm: ecdsa-with-SHA256
-         30:65:02:31:00:8a:e6:40:89:37:eb:e9:d5:13:d9:ca:d4:6b:
-         24:f3:b0:3d:87:46:58:1a:ec:b1:df:6f:fb:56:ba:70:6b:c7:
-         38:cc:e8:b1:8c:4f:0f:f7:f1:67:76:0e:83:d0:1e:51:8f:02:
-         30:3d:f6:23:28:26:4c:c6:60:87:93:26:9b:b2:35:1e:ba:d6:
-         f7:3c:d1:1c:ce:fa:25:3c:a6:1a:81:15:5b:f3:12:0f:6c:ee:
-         65:8a:c9:87:a8:f9:07:e0:62:9a:8c:5c:4a
------BEGIN CERTIFICATE-----
-MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC
-VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T
-U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx
-NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv
-dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv
-bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49
-AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA
-VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku
-WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP
-MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX
-5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ
-ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg
-h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
------END CERTIFICATE-----
-
-# 2e7bf16cc22485a7bbe2aa8696750761b0ae39be3b2fe9d0cc6d4ef73491425c
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 6248227494352943350 (0x56b629cd34bc78f6)
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = US, ST = Texas, L = Houston, O = SSL Corporation, CN = SSL.com EV Root Certification Authority RSA R2
-        Validity
-            Not Before: May 31 18:14:37 2017 GMT
-            Not After : May 30 18:14:37 2042 GMT
-        Subject: C = US, ST = Texas, L = Houston, O = SSL Corporation, CN = SSL.com EV Root Certification Authority RSA R2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (4096 bit)
-                Modulus:
-                    00:8f:36:65:40:e1:d6:4d:c0:d7:b4:e9:46:da:6b:
-                    ea:33:47:cd:4c:f9:7d:7d:be:bd:2d:3d:f0:db:78:
-                    e1:86:a5:d9:ba:09:57:68:ed:57:3e:a0:d0:08:41:
-                    83:e7:28:41:24:1f:e3:72:15:d0:01:1a:fb:5e:70:
-                    23:b2:cb:9f:39:e3:cf:c5:4e:c6:92:6d:26:c6:7b:
-                    bb:b3:da:27:9d:0a:86:e9:81:37:05:fe:f0:71:71:
-                    ec:c3:1c:e9:63:a2:17:14:9d:ef:1b:67:d3:85:55:
-                    02:02:d6:49:c9:cc:5a:e1:b1:f7:6f:32:9f:c9:d4:
-                    3b:88:41:a8:9c:bd:cb:ab:db:6d:7b:09:1f:a2:4c:
-                    72:90:da:2b:08:fc:cf:3c:54:ce:67:0f:a8:cf:5d:
-                    96:19:0b:c4:e3:72:eb:ad:d1:7d:1d:27:ef:92:eb:
-                    10:bf:5b:eb:3b:af:cf:80:dd:c1:d2:96:04:5b:7a:
-                    7e:a4:a9:3c:38:76:a4:62:8e:a0:39:5e:ea:77:cf:
-                    5d:00:59:8f:66:2c:3e:07:a2:a3:05:26:11:69:97:
-                    ea:85:b7:0f:96:0b:4b:c8:40:e1:50:ba:2e:8a:cb:
-                    f7:0f:9a:22:e7:7f:9a:37:13:cd:f2:4d:13:6b:21:
-                    d1:c0:cc:22:f2:a1:46:f6:44:69:9c:ca:61:35:07:
-                    00:6f:d6:61:08:11:ea:ba:b8:f6:e9:b3:60:e5:4d:
-                    b9:ec:9f:14:66:c9:57:58:db:cd:87:69:f8:8a:86:
-                    12:03:47:bf:66:13:76:ac:77:7d:34:24:85:83:cd:
-                    d7:aa:9c:90:1a:9f:21:2c:7f:78:b7:64:b8:d8:e8:
-                    a6:f4:78:b3:55:cb:84:d2:32:c4:78:ae:a3:8f:61:
-                    dd:ce:08:53:ad:ec:88:fc:15:e4:9a:0d:e6:9f:1a:
-                    77:ce:4c:8f:b8:14:15:3d:62:9c:86:38:06:00:66:
-                    12:e4:59:76:5a:53:c0:02:98:a2:10:2b:68:44:7b:
-                    8e:79:ce:33:4a:76:aa:5b:81:16:1b:b5:8a:d8:d0:
-                    00:7b:5e:62:b4:09:d6:86:63:0e:a6:05:95:49:ba:
-                    28:8b:88:93:b2:34:1c:d8:a4:55:6e:b7:1c:d0:de:
-                    99:55:3b:23:f4:22:e0:f9:29:66:26:ec:20:50:77:
-                    db:4a:0b:8f:be:e5:02:60:70:41:5e:d4:ae:50:39:
-                    22:14:26:cb:b2:3b:73:74:55:47:07:79:81:39:a8:
-                    30:13:44:e5:04:8a:ae:96:13:25:42:0f:b9:53:c4:
-                    9b:fc:cd:e4:1c:de:3c:fa:ab:d6:06:4a:1f:67:a6:
-                    98:30:1c:dd:2c:db:dc:18:95:57:66:c6:ff:5c:8b:
-                    56:f5:77
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Authority Key Identifier: 
-                keyid:F9:60:BB:D4:E3:D5:34:F6:B8:F5:06:80:25:A7:73:DB:46:69:A8:9E
-
-            X509v3 Subject Key Identifier: 
-                F9:60:BB:D4:E3:D5:34:F6:B8:F5:06:80:25:A7:73:DB:46:69:A8:9E
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-    Signature Algorithm: sha256WithRSAEncryption
-         56:b3:8e:cb:0a:9d:49:8e:bf:a4:c4:91:bb:66:17:05:51:98:
-         75:fb:e5:50:2c:7a:9e:f1:14:fa:ab:d3:8a:3e:ff:91:29:8f:
-         63:8b:d8:b4:a9:54:01:0d:be:93:86:2f:f9:4a:6d:c7:5e:f5:
-         57:f9:ca:55:1c:12:be:47:0f:36:c5:df:6a:b7:db:75:c2:47:
-         25:7f:b9:f1:63:f8:68:2d:55:04:d1:f2:8d:b0:a4:cf:bc:3c:
-         5e:1f:78:e7:a5:a0:20:70:b0:04:c5:b7:f7:72:a7:de:22:0d:
-         bd:33:25:46:8c:64:92:26:e3:3e:2e:63:96:da:9b:8c:3d:f8:
-         18:09:d7:03:cc:7d:86:82:e0:ca:04:07:51:50:d7:ff:92:d5:
-         0c:ef:da:86:9f:99:d7:eb:b7:af:68:e2:39:26:94:ba:68:b7:
-         bf:83:d3:ea:7a:67:3d:62:67:ae:25:e5:72:e8:e2:e4:ec:ae:
-         12:f6:4b:2b:3c:9f:e9:b0:40:f3:38:54:b3:fd:b7:68:c8:da:
-         c6:8f:51:3c:b2:fb:91:dc:1c:e7:9b:9d:e1:b7:0d:72:8f:e2:
-         a4:c4:a9:78:f9:eb:14:ac:c6:43:05:c2:65:39:28:18:02:c3:
-         82:b2:9d:05:be:65:ed:96:5f:65:74:3c:fb:09:35:2e:7b:9c:
-         13:fd:1b:0f:5d:c7:6d:81:3a:56:0f:cc:3b:e1:af:02:2f:22:
-         ac:46:ca:46:3c:a0:1c:4c:d6:44:b4:5e:2e:5c:15:66:09:e1:
-         26:29:fe:c6:52:61:ba:b1:73:ff:c3:0c:9c:e5:6c:6a:94:3f:
-         14:ca:40:16:95:84:f3:59:a9:ac:5f:4c:61:93:6d:d1:3b:cc:
-         a2:95:0c:22:a6:67:67:44:2e:b9:d9:d2:8a:41:b3:66:0b:5a:
-         fb:7d:23:a5:f2:1a:b0:ff:de:9b:83:94:2e:d1:3f:df:92:b7:
-         91:af:05:3b:65:c7:a0:6c:b1:cd:62:12:c3:90:1b:e3:25:ce:
-         34:bc:6f:77:76:b1:10:c3:f7:05:1a:c0:d6:af:74:62:48:17:
-         77:92:69:90:61:1c:de:95:80:74:54:8f:18:1c:c3:f3:03:d0:
-         bf:a4:43:75:86:53:18:7a:0a:2e:09:1c:36:9f:91:fd:82:8a:
-         22:4b:d1:0e:50:25:dd:cb:03:0c:17:c9:83:00:08:4e:35:4d:
-         8a:8b:ed:f0:02:94:66:2c:44:7f:cb:95:27:96:17:ad:09:30:
-         ac:b6:71:17:6e:8b:17:f6:1c:09:d4:2d:3b:98:a5:71:d3:54:
-         13:d9:60:f3:f5:4b:66:4f:fa:f1:ee:20:12:8d:b4:ac:57:b1:
-         45:63:a1:ac:76:a9:c2:fb
------BEGIN CERTIFICATE-----
-MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV
-BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE
-CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy
-MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G
-A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD
-DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
-MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq
-M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf
-OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa
-4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9
-HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR
-aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA
-b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ
-Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV
-PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO
-pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu
-UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY
-MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
-HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4
-9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW
-s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5
-Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg
-cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM
-79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz
-/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt
-ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm
-Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK
-QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ
-w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi
-S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07
-mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
------END CERTIFICATE-----
-
-# 4d2491414cfe956746ec4cefa6cf6f72e28a1329432f9d8a907ac4cb5dadc15a
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 10000013 (0x98968d)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=NL, O=Staat der Nederlanden, CN=Staat der Nederlanden EV Root CA
-        Validity
-            Not Before: Dec  8 11:19:29 2010 GMT
-            Not After : Dec  8 11:10:28 2022 GMT
-        Subject: C=NL, O=Staat der Nederlanden, CN=Staat der Nederlanden EV Root CA
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:e3:c7:7e:89:f9:24:4b:3a:d2:33:83:35:2c:69:
-                    ec:dc:09:a4:e3:51:a8:25:2b:79:b8:08:3d:e0:91:
-                    ba:84:85:c6:85:a4:ca:e6:c9:2e:53:a4:c9:24:1e:
-                    fd:55:66:71:5d:2c:c5:60:68:04:b7:d9:c2:52:26:
-                    38:88:a4:d6:3b:40:a6:c2:cd:3f:cd:98:93:b3:54:
-                    14:58:96:55:d5:50:fe:86:ad:a4:63:7f:5c:87:f6:
-                    8e:e6:27:92:67:17:92:02:03:2c:dc:d6:66:74:ed:
-                    dd:67:ff:c1:61:8d:63:4f:0f:9b:6d:17:30:26:ef:
-                    ab:d2:1f:10:a0:f9:c5:7f:16:69:81:03:47:ed:1e:
-                    68:8d:72:a1:4d:b2:26:c6:ba:6c:5f:6d:d6:af:d1:
-                    b1:13:8e:a9:ad:f3:5e:69:75:26:18:3e:41:2b:21:
-                    7f:ee:8b:5d:07:06:9d:43:c4:29:0a:2b:fc:2a:3e:
-                    86:cb:3c:83:3a:f9:c9:0d:da:c5:99:e2:bc:78:41:
-                    33:76:e1:bf:2f:5d:e5:a4:98:50:0c:15:dd:e0:fa:
-                    9c:7f:38:68:d0:b2:a6:7a:a7:d1:31:bd:7e:8a:58:
-                    27:43:b3:ba:33:91:d3:a7:98:15:5c:9a:e6:d3:0f:
-                    75:d9:fc:41:98:97:3e:aa:25:db:8f:92:2e:b0:7b:
-                    0c:5f:f1:63:a9:37:f9:9b:75:69:4c:28:26:25:da:
-                    d5:f2:12:70:45:55:e3:df:73:5e:37:f5:21:6c:90:
-                    8e:35:5a:c9:d3:23:eb:d3:c0:be:78:ac:42:28:58:
-                    66:a5:46:6d:70:02:d7:10:f9:4b:54:fc:5d:86:4a:
-                    87:cf:7f:ca:45:ac:11:5a:b5:20:51:8d:2f:88:47:
-                    97:39:c0:cf:ba:c0:42:01:40:99:48:21:0b:6b:a7:
-                    d2:fd:96:d5:d1:be:46:9d:49:e0:0b:a6:a0:22:4e:
-                    38:d0:c1:3c:30:bc:70:8f:2c:75:cc:d0:c5:8c:51:
-                    3b:3d:94:08:64:26:61:7d:b9:c3:65:8f:14:9c:21:
-                    d0:aa:fd:17:72:03:8f:bd:9b:8c:e6:5e:53:9e:b9:
-                    9d:ef:82:bb:e1:bc:e2:72:41:5b:21:94:d3:45:37:
-                    94:d1:df:09:39:5d:e7:23:aa:9a:1d:ca:6d:a8:0a:
-                    86:85:8a:82:be:42:07:d6:f2:38:82:73:da:87:5b:
-                    e5:3c:d3:9e:3e:a7:3b:9e:f4:03:b3:f9:f1:7d:13:
-                    74:02:ff:bb:a1:e5:fa:00:79:1c:a6:66:41:88:5c:
-                    60:57:a6:2e:09:c4:ba:fd:9a:cf:a7:1f:40:c3:bb:
-                    cc:5a:0a:55:4b:3b:38:76:51:b8:63:8b:84:94:16:
-                    e6:56:f3
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                FE:AB:00:90:98:9E:24:FC:A9:CC:1A:8A:FB:27:B8:BF:30:6E:A8:3B
-    Signature Algorithm: sha256WithRSAEncryption
-         cf:77:2c:6e:56:be:4e:b3:b6:84:00:94:ab:47:c9:0d:d2:76:
-         c7:86:9f:1d:07:d3:b6:b4:bb:08:78:af:69:d2:0b:49:de:33:
-         c5:ac:ad:c2:88:02:7d:06:b7:35:02:c1:60:c9:bf:c4:e8:94:
-         de:d4:d3:a9:13:25:5a:fe:6e:a2:ae:7d:05:dc:7d:f3:6c:f0:
-         7e:a6:8d:ee:d9:d7:ce:58:17:e8:a9:29:ae:73:48:87:e7:9b:
-         ca:6e:29:a1:64:5f:19:13:f7:ae:06:10:ff:51:c6:9b:4d:55:
-         25:4f:93:99:10:01:53:75:f1:13:ce:c7:a6:41:41:d2:bf:88:
-         a5:7f:45:fc:ac:b8:a5:b5:33:0c:82:c4:fb:07:f6:6a:e5:25:
-         84:5f:06:ca:c1:86:39:11:db:58:cd:77:3b:2c:c2:4c:0f:5e:
-         9a:e3:f0:ab:3e:61:1b:50:24:c2:c0:f4:f1:19:f0:11:29:b6:
-         a5:18:02:9b:d7:63:4c:70:8c:47:a3:03:43:5c:b9:5d:46:a0:
-         0d:6f:ff:59:8e:be:dd:9f:72:c3:5b:2b:df:8c:5b:ce:e5:0c:
-         46:6c:92:b2:0a:a3:4c:54:42:18:15:12:18:bd:da:fc:ba:74:
-         6e:ff:c1:b6:a0:64:d8:a9:5f:55:ae:9f:5c:6a:76:96:d8:73:
-         67:87:fb:4d:7f:5c:ee:69:ca:73:10:fb:8a:a9:fd:9e:bd:36:
-         38:49:49:87:f4:0e:14:f0:e9:87:b8:3f:a7:4f:7a:5a:8e:79:
-         d4:93:e4:bb:68:52:84:ac:6c:e9:f3:98:70:55:72:32:f9:34:
-         ab:2b:49:b5:cd:20:62:e4:3a:7a:67:63:ab:96:dc:6d:ae:97:
-         ec:fc:9f:76:56:88:2e:66:cf:5b:b6:c9:a4:b0:d7:05:ba:e1:
-         27:2f:93:bb:26:2a:a2:93:b0:1b:f3:8e:be:1d:40:a3:b9:36:
-         8f:3e:82:1a:1a:5e:88:ea:50:f8:59:e2:83:46:29:0b:e3:44:
-         5c:e1:95:b6:69:90:9a:14:6f:97:ae:81:cf:68:ef:99:9a:be:
-         b5:e7:e1:7f:f8:fa:13:47:16:4c:cc:6d:08:40:e7:8b:78:6f:
-         50:82:44:50:3f:66:06:8a:ab:43:84:56:4a:0f:20:2d:86:0e:
-         f5:d2:db:d2:7a:8a:4b:cd:a5:e8:4e:f1:5e:26:25:01:59:23:
-         a0:7e:d2:f6:7e:21:57:d7:27:bc:15:57:4c:a4:46:c1:e0:83:
-         1e:0c:4c:4d:1f:4f:06:19:e2:f9:a8:f4:3a:82:a1:b2:79:43:
-         79:d6:ad:6f:7a:27:90:03:a4:ea:24:87:3f:d9:bd:d9:e9:f2:
-         5f:50:49:1c:ee:ec:d7:2e
------BEGIN CERTIFICATE-----
-MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO
-TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh
-dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y
-MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg
-TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS
-b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS
-M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC
-UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d
-Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p
-rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l
-pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb
-j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC
-KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS
-/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X
-cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH
-1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP
-px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
-/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7
-MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
-eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u
-2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS
-v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC
-wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy
-CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e
-vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6
-Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa
-Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL
-eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8
-FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc
-7uzXLg==
------END CERTIFICATE-----
-
-# 1465fa205397b876faa6f0a9958e5590e40fcc7faa4fb7c2c8677521fb5fb658
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 0 (0x0)
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=US, O=Starfield Technologies, Inc., OU=Starfield Class 2 Certification Authority
-        Validity
-            Not Before: Jun 29 17:39:16 2004 GMT
-            Not After : Jun 29 17:39:16 2034 GMT
-        Subject: C=US, O=Starfield Technologies, Inc., OU=Starfield Class 2 Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:b7:32:c8:fe:e9:71:a6:04:85:ad:0c:11:64:df:
-                    ce:4d:ef:c8:03:18:87:3f:a1:ab:fb:3c:a6:9f:f0:
-                    c3:a1:da:d4:d8:6e:2b:53:90:fb:24:a4:3e:84:f0:
-                    9e:e8:5f:ec:e5:27:44:f5:28:a6:3f:7b:de:e0:2a:
-                    f0:c8:af:53:2f:9e:ca:05:01:93:1e:8f:66:1c:39:
-                    a7:4d:fa:5a:b6:73:04:25:66:eb:77:7f:e7:59:c6:
-                    4a:99:25:14:54:eb:26:c7:f3:7f:19:d5:30:70:8f:
-                    af:b0:46:2a:ff:ad:eb:29:ed:d7:9f:aa:04:87:a3:
-                    d4:f9:89:a5:34:5f:db:43:91:82:36:d9:66:3c:b1:
-                    b8:b9:82:fd:9c:3a:3e:10:c8:3b:ef:06:65:66:7a:
-                    9b:19:18:3d:ff:71:51:3c:30:2e:5f:be:3d:77:73:
-                    b2:5d:06:6c:c3:23:56:9a:2b:85:26:92:1c:a7:02:
-                    b3:e4:3f:0d:af:08:79:82:b8:36:3d:ea:9c:d3:35:
-                    b3:bc:69:ca:f5:cc:9d:e8:fd:64:8d:17:80:33:6e:
-                    5e:4a:5d:99:c9:1e:87:b4:9d:1a:c0:d5:6e:13:35:
-                    23:5e:df:9b:5f:3d:ef:d6:f7:76:c2:ea:3e:bb:78:
-                    0d:1c:42:67:6b:04:d8:f8:d6:da:6f:8b:f2:44:a0:
-                    01:ab
-                Exponent: 3 (0x3)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                BF:5F:B7:D1:CE:DD:1F:86:F4:5B:55:AC:DC:D7:10:C2:0E:A9:88:E7
-            X509v3 Authority Key Identifier: 
-                keyid:BF:5F:B7:D1:CE:DD:1F:86:F4:5B:55:AC:DC:D7:10:C2:0E:A9:88:E7
-                DirName:/C=US/O=Starfield Technologies, Inc./OU=Starfield Class 2 Certification Authority
-                serial:00
-
-            X509v3 Basic Constraints: 
-                CA:TRUE
-    Signature Algorithm: sha1WithRSAEncryption
-         05:9d:3f:88:9d:d1:c9:1a:55:a1:ac:69:f3:f3:59:da:9b:01:
-         87:1a:4f:57:a9:a1:79:09:2a:db:f7:2f:b2:1e:cc:c7:5e:6a:
-         d8:83:87:a1:97:ef:49:35:3e:77:06:41:58:62:bf:8e:58:b8:
-         0a:67:3f:ec:b3:dd:21:66:1f:c9:54:fa:72:cc:3d:4c:40:d8:
-         81:af:77:9e:83:7a:bb:a2:c7:f5:34:17:8e:d9:11:40:f4:fc:
-         2c:2a:4d:15:7f:a7:62:5d:2e:25:d3:00:0b:20:1a:1d:68:f9:
-         17:b8:f4:bd:8b:ed:28:59:dd:4d:16:8b:17:83:c8:b2:65:c7:
-         2d:7a:a5:aa:bc:53:86:6d:dd:57:a4:ca:f8:20:41:0b:68:f0:
-         f4:fb:74:be:56:5d:7a:79:f5:f9:1d:85:e3:2d:95:be:f5:71:
-         90:43:cc:8d:1f:9a:00:0a:87:29:e9:55:22:58:00:23:ea:e3:
-         12:43:29:5b:47:08:dd:8c:41:6a:65:06:a8:e5:21:aa:41:b4:
-         95:21:95:b9:7d:d1:34:ab:13:d6:ad:bc:dc:e2:3d:39:cd:bd:
-         3e:75:70:a1:18:59:03:c9:22:b4:8f:9c:d5:5e:2a:d7:a5:b6:
-         d4:0a:6d:f8:b7:40:11:46:9a:1f:79:0e:62:bf:0f:97:ec:e0:
-         2f:1f:17:94
------BEGIN CERTIFICATE-----
-MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
-MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
-U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
-NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
-ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
-ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
-DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
-8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
-+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
-X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
-K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
-1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
-A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
-zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
-YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
-bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
-DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
-L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
-eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
-xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
-VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
-WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
------END CERTIFICATE-----
-
-# 2ce1cb0bf9d2f9e102993fbe215152c3b2dd0cabde1c68e5319b839154dbb7f5
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 0 (0x0)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Root Certificate Authority - G2
-        Validity
-            Not Before: Sep  1 00:00:00 2009 GMT
-            Not After : Dec 31 23:59:59 2037 GMT
-        Subject: C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Root Certificate Authority - G2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:bd:ed:c1:03:fc:f6:8f:fc:02:b1:6f:5b:9f:48:
-                    d9:9d:79:e2:a2:b7:03:61:56:18:c3:47:b6:d7:ca:
-                    3d:35:2e:89:43:f7:a1:69:9b:de:8a:1a:fd:13:20:
-                    9c:b4:49:77:32:29:56:fd:b9:ec:8c:dd:22:fa:72:
-                    dc:27:61:97:ee:f6:5a:84:ec:6e:19:b9:89:2c:dc:
-                    84:5b:d5:74:fb:6b:5f:c5:89:a5:10:52:89:46:55:
-                    f4:b8:75:1c:e6:7f:e4:54:ae:4b:f8:55:72:57:02:
-                    19:f8:17:71:59:eb:1e:28:07:74:c5:9d:48:be:6c:
-                    b4:f4:a4:b0:f3:64:37:79:92:c0:ec:46:5e:7f:e1:
-                    6d:53:4c:62:af:cd:1f:0b:63:bb:3a:9d:fb:fc:79:
-                    00:98:61:74:cf:26:82:40:63:f3:b2:72:6a:19:0d:
-                    99:ca:d4:0e:75:cc:37:fb:8b:89:c1:59:f1:62:7f:
-                    5f:b3:5f:65:30:f8:a7:b7:4d:76:5a:1e:76:5e:34:
-                    c0:e8:96:56:99:8a:b3:f0:7f:a4:cd:bd:dc:32:31:
-                    7c:91:cf:e0:5f:11:f8:6b:aa:49:5c:d1:99:94:d1:
-                    a2:e3:63:5b:09:76:b5:56:62:e1:4b:74:1d:96:d4:
-                    26:d4:08:04:59:d0:98:0e:0e:e6:de:fc:c3:ec:1f:
-                    90:f1
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                7C:0C:32:1F:A7:D9:30:7F:C4:7D:68:A3:62:A8:A1:CE:AB:07:5B:27
-    Signature Algorithm: sha256WithRSAEncryption
-         11:59:fa:25:4f:03:6f:94:99:3b:9a:1f:82:85:39:d4:76:05:
-         94:5e:e1:28:93:6d:62:5d:09:c2:a0:a8:d4:b0:75:38:f1:34:
-         6a:9d:e4:9f:8a:86:26:51:e6:2c:d1:c6:2d:6e:95:20:4a:92:
-         01:ec:b8:8a:67:7b:31:e2:67:2e:8c:95:03:26:2e:43:9d:4a:
-         31:f6:0e:b5:0c:bb:b7:e2:37:7f:22:ba:00:a3:0e:7b:52:fb:
-         6b:bb:3b:c4:d3:79:51:4e:cd:90:f4:67:07:19:c8:3c:46:7a:
-         0d:01:7d:c5:58:e7:6d:e6:85:30:17:9a:24:c4:10:e0:04:f7:
-         e0:f2:7f:d4:aa:0a:ff:42:1d:37:ed:94:e5:64:59:12:20:77:
-         38:d3:32:3e:38:81:75:96:73:fa:68:8f:b1:cb:ce:1f:c5:ec:
-         fa:9c:7e:cf:7e:b1:f1:07:2d:b6:fc:bf:ca:a4:bf:d0:97:05:
-         4a:bc:ea:18:28:02:90:bd:54:78:09:21:71:d3:d1:7d:1d:d9:
-         16:b0:a9:61:3d:d0:0a:00:22:fc:c7:7b:cb:09:64:45:0b:3b:
-         40:81:f7:7d:7c:32:f5:98:ca:58:8e:7d:2a:ee:90:59:73:64:
-         f9:36:74:5e:25:a1:f5:66:05:2e:7f:39:15:a9:2a:fb:50:8b:
-         8e:85:69:f4
------BEGIN CERTIFICATE-----
-MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
-ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
-MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
-b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
-aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
-Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
-nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
-HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
-Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
-dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
-HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
-BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
-CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
-sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
-4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
-8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
-pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
-mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
------END CERTIFICATE-----
-
-# 568d6905a2c88708a4b3025190edcfedb1974a606a13c6e5290fcb2ae63edab5
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 0 (0x0)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Services Root Certificate Authority - G2
-        Validity
-            Not Before: Sep  1 00:00:00 2009 GMT
-            Not After : Dec 31 23:59:59 2037 GMT
-        Subject: C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Services Root Certificate Authority - G2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:d5:0c:3a:c4:2a:f9:4e:e2:f5:be:19:97:5f:8e:
-                    88:53:b1:1f:3f:cb:cf:9f:20:13:6d:29:3a:c8:0f:
-                    7d:3c:f7:6b:76:38:63:d9:36:60:a8:9b:5e:5c:00:
-                    80:b2:2f:59:7f:f6:87:f9:25:43:86:e7:69:1b:52:
-                    9a:90:e1:71:e3:d8:2d:0d:4e:6f:f6:c8:49:d9:b6:
-                    f3:1a:56:ae:2b:b6:74:14:eb:cf:fb:26:e3:1a:ba:
-                    1d:96:2e:6a:3b:58:94:89:47:56:ff:25:a0:93:70:
-                    53:83:da:84:74:14:c3:67:9e:04:68:3a:df:8e:40:
-                    5a:1d:4a:4e:cf:43:91:3b:e7:56:d6:00:70:cb:52:
-                    ee:7b:7d:ae:3a:e7:bc:31:f9:45:f6:c2:60:cf:13:
-                    59:02:2b:80:cc:34:47:df:b9:de:90:65:6d:02:cf:
-                    2c:91:a6:a6:e7:de:85:18:49:7c:66:4e:a3:3a:6d:
-                    a9:b5:ee:34:2e:ba:0d:03:b8:33:df:47:eb:b1:6b:
-                    8d:25:d9:9b:ce:81:d1:45:46:32:96:70:87:de:02:
-                    0e:49:43:85:b6:6c:73:bb:64:ea:61:41:ac:c9:d4:
-                    54:df:87:2f:c7:22:b2:26:cc:9f:59:54:68:9f:fc:
-                    be:2a:2f:c4:55:1c:75:40:60:17:85:02:55:39:8b:
-                    7f:05
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                9C:5F:00:DF:AA:01:D7:30:2B:38:88:A2:B8:6D:4A:9C:F2:11:91:83
-    Signature Algorithm: sha256WithRSAEncryption
-         4b:36:a6:84:77:69:dd:3b:19:9f:67:23:08:6f:0e:61:c9:fd:
-         84:dc:5f:d8:36:81:cd:d8:1b:41:2d:9f:60:dd:c7:1a:68:d9:
-         d1:6e:86:e1:88:23:cf:13:de:43:cf:e2:34:b3:04:9d:1f:29:
-         d5:bf:f8:5e:c8:d5:c1:bd:ee:92:6f:32:74:f2:91:82:2f:bd:
-         82:42:7a:ad:2a:b7:20:7d:4d:bc:7a:55:12:c2:15:ea:bd:f7:
-         6a:95:2e:6c:74:9f:cf:1c:b4:f2:c5:01:a3:85:d0:72:3e:ad:
-         73:ab:0b:9b:75:0c:6d:45:b7:8e:94:ac:96:37:b5:a0:d0:8f:
-         15:47:0e:e3:e8:83:dd:8f:fd:ef:41:01:77:cc:27:a9:62:85:
-         33:f2:37:08:ef:71:cf:77:06:de:c8:19:1d:88:40:cf:7d:46:
-         1d:ff:1e:c7:e1:ce:ff:23:db:c6:fa:8d:55:4e:a9:02:e7:47:
-         11:46:3e:f4:fd:bd:7b:29:26:bb:a9:61:62:37:28:b6:2d:2a:
-         f6:10:86:64:c9:70:a7:d2:ad:b7:29:70:79:ea:3c:da:63:25:
-         9f:fd:68:b7:30:ec:70:fb:75:8a:b7:6d:60:67:b2:1e:c8:b9:
-         e9:d8:a8:6f:02:8b:67:0d:4d:26:57:71:da:20:fc:c1:4a:50:
-         8d:b1:28:ba
------BEGIN CERTIFICATE-----
-MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
-EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
-HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
-ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
-MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
-VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
-ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
-dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
-OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
-8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
-Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
-hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
-6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
-DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
-AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
-bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
-ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
-qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
-iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
-0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
-sSi6
------END CERTIFICATE-----
-
-# 62dd0be9b9f50a163ea0f8e75c053b1eca57ea55c8688f647c6881f2c8357b95
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 13492815561806991280 (0xbb401c43f55e4fb0)
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=CH, O=SwissSign AG, CN=SwissSign Gold CA - G2
-        Validity
-            Not Before: Oct 25 08:30:35 2006 GMT
-            Not After : Oct 25 08:30:35 2036 GMT
-        Subject: C=CH, O=SwissSign AG, CN=SwissSign Gold CA - G2
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:af:e4:ee:7e:8b:24:0e:12:6e:a9:50:2d:16:44:
-                    3b:92:92:5c:ca:b8:5d:84:92:42:13:2a:bc:65:57:
-                    82:40:3e:57:24:cd:50:8b:25:2a:b7:6f:fc:ef:a2:
-                    d0:c0:1f:02:24:4a:13:96:8f:23:13:e6:28:58:00:
-                    a3:47:c7:06:a7:84:23:2b:bb:bd:96:2b:7f:55:cc:
-                    8b:c1:57:1f:0e:62:65:0f:dd:3d:56:8a:73:da:ae:
-                    7e:6d:ba:81:1c:7e:42:8c:20:35:d9:43:4d:84:fa:
-                    84:db:52:2c:f3:0e:27:77:0b:6b:bf:11:2f:72:78:
-                    9f:2e:d8:3e:e6:18:37:5a:2a:72:f9:da:62:90:92:
-                    95:ca:1f:9c:e9:b3:3c:2b:cb:f3:01:13:bf:5a:cf:
-                    c1:b5:0a:60:bd:dd:b5:99:64:53:b8:a0:96:b3:6f:
-                    e2:26:77:91:8c:e0:62:10:02:9f:34:0f:a4:d5:92:
-                    33:51:de:be:8d:ba:84:7a:60:3c:6a:db:9f:2b:ec:
-                    de:de:01:3f:6e:4d:e5:50:86:cb:b4:af:ed:44:40:
-                    c5:ca:5a:8c:da:d2:2b:7c:a8:ee:be:a6:e5:0a:aa:
-                    0e:a5:df:05:52:b7:55:c7:22:5d:32:6a:97:97:63:
-                    13:db:c9:db:79:36:7b:85:3a:4a:c5:52:89:f9:24:
-                    e7:9d:77:a9:82:ff:55:1c:a5:71:69:2b:d1:02:24:
-                    f2:b3:26:d4:6b:da:04:55:e5:c1:0a:c7:6d:30:37:
-                    90:2a:e4:9e:14:33:5e:16:17:55:c5:5b:b5:cb:34:
-                    89:92:f1:9d:26:8f:a1:07:d4:c6:b2:78:50:db:0c:
-                    0c:0b:7c:0b:8c:41:d7:b9:e9:dd:8c:88:f7:a3:4d:
-                    b2:32:cc:d8:17:da:cd:b7:ce:66:9d:d4:fd:5e:ff:
-                    bd:97:3e:29:75:e7:7e:a7:62:58:af:25:34:a5:41:
-                    c7:3d:bc:0d:50:ca:03:03:0f:08:5a:1f:95:73:78:
-                    62:bf:af:72:14:69:0e:a5:e5:03:0e:78:8e:26:28:
-                    42:f0:07:0b:62:20:10:67:39:46:fa:a9:03:cc:04:
-                    38:7a:66:ef:20:83:b5:8c:4a:56:8e:91:00:fc:8e:
-                    5c:82:de:88:a0:c3:e2:68:6e:7d:8d:ef:3c:dd:65:
-                    f4:5d:ac:51:ef:24:80:ae:aa:56:97:6f:f9:ad:7d:
-                    da:61:3f:98:77:3c:a5:91:b6:1c:8c:26:da:65:a2:
-                    09:6d:c1:e2:54:e3:b9:ca:4c:4c:80:8f:77:7b:60:
-                    9a:1e:df:b6:f2:48:1e:0e:ba:4e:54:6d:98:e0:e1:
-                    a2:1a:a2:77:50:cf:c4:63:92:ec:47:19:9d:eb:e6:
-                    6b:ce:c1
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                5B:25:7B:96:A4:65:51:7E:B8:39:F3:C0:78:66:5E:E8:3A:E7:F0:EE
-            X509v3 Authority Key Identifier: 
-                keyid:5B:25:7B:96:A4:65:51:7E:B8:39:F3:C0:78:66:5E:E8:3A:E7:F0:EE
-
-            X509v3 Certificate Policies: 
-                Policy: 2.16.756.1.89.1.2.1.1
-                  CPS: http://repository.swisssign.com/
-
-    Signature Algorithm: sha1WithRSAEncryption
-         27:ba:e3:94:7c:f1:ae:c0:de:17:e6:e5:d8:d5:f5:54:b0:83:
-         f4:bb:cd:5e:05:7b:4f:9f:75:66:af:3c:e8:56:7e:fc:72:78:
-         38:03:d9:2b:62:1b:00:b9:f8:e9:60:cd:cc:ce:51:8a:c7:50:
-         31:6e:e1:4a:7e:18:2f:69:59:b6:3d:64:81:2b:e3:83:84:e6:
-         22:87:8e:7d:e0:ee:02:99:61:b8:1e:f4:b8:2b:88:12:16:84:
-         c2:31:93:38:96:31:a6:b9:3b:53:3f:c3:24:93:56:5b:69:92:
-         ec:c5:c1:bb:38:00:e3:ec:17:a9:b8:dc:c7:7c:01:83:9f:32:
-         47:ba:52:22:34:1d:32:7a:09:56:a7:7c:25:36:a9:3d:4b:da:
-         c0:82:6f:0a:bb:12:c8:87:4b:27:11:f9:1e:2d:c7:93:3f:9e:
-         db:5f:26:6b:52:d9:2e:8a:f1:14:c6:44:8d:15:a9:b7:bf:bd:
-         de:a6:1a:ee:ae:2d:fb:48:77:17:fe:bb:ec:af:18:f5:2a:51:
-         f0:39:84:97:95:6c:6e:1b:c3:2b:c4:74:60:79:25:b0:0a:27:
-         df:df:5e:d2:39:cf:45:7d:42:4b:df:b3:2c:1e:c5:c6:5d:ca:
-         55:3a:a0:9c:69:9a:8f:da:ef:b2:b0:3c:9f:87:6c:12:2b:65:
-         70:15:52:31:1a:24:cf:6f:31:23:50:1f:8c:4f:8f:23:c3:74:
-         41:63:1c:55:a8:14:dd:3e:e0:51:50:cf:f1:1b:30:56:0e:92:
-         b0:82:85:d8:83:cb:22:64:bc:2d:b8:25:d5:54:a2:b8:06:ea:
-         ad:92:a4:24:a0:c1:86:b5:4a:13:6a:47:cf:2e:0b:56:95:54:
-         cb:ce:9a:db:6a:b4:a6:b2:db:41:08:86:27:77:f7:6a:a0:42:
-         6c:0b:38:ce:d7:75:50:32:92:c2:df:2b:30:22:48:d0:d5:41:
-         38:25:5d:a4:e9:5d:9f:c6:94:75:d0:45:fd:30:97:43:8f:90:
-         ab:0a:c7:86:73:60:4a:69:2d:de:a5:78:d7:06:da:6a:9e:4b:
-         3e:77:3a:20:13:22:01:d0:bf:68:9e:63:60:6b:35:4d:0b:6d:
-         ba:a1:3d:c0:93:e0:7f:23:b3:55:ad:72:25:4e:46:f9:d2:16:
-         ef:b0:64:c1:01:9e:e9:ca:a0:6a:98:0e:cf:d8:60:f2:2f:49:
-         b8:e4:42:e1:38:35:16:f4:c8:6e:4f:f7:81:56:e8:ba:a3:be:
-         23:af:ae:fd:6f:03:e0:02:3b:30:76:fa:1b:6d:41:cf:01:b1:
-         e9:b8:c9:66:f4:db:26:f3:3a:a4:74:f2:49:24:5b:c9:b0:d0:
-         57:c1:fa:3e:7a:e1:97:c9
------BEGIN CERTIFICATE-----
-MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
-BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
-biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
-MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
-d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
-CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
-76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
-bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
-6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
-emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
-MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
-MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
-MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
-FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
-aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
-gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
-qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
-lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
-8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
-L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
-45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
-UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
-O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
-bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
-GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
-77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
-hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
-92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
-Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
-ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
-Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
------END CERTIFICATE-----
-
-# 59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 3262 (0xcbe)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=TW, O=TAIWAN-CA, OU=Root CA, CN=TWCA Global Root CA
-        Validity
-            Not Before: Jun 27 06:28:33 2012 GMT
-            Not After : Dec 31 15:59:59 2030 GMT
-        Subject: C=TW, O=TAIWAN-CA, OU=Root CA, CN=TWCA Global Root CA
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:b0:05:db:c8:eb:8c:c4:6e:8a:21:ef:8e:4d:9c:
-                    71:0a:1f:52:70:ed:6d:82:9c:97:c5:d7:4c:4e:45:
-                    49:cb:40:42:b5:12:34:6c:19:c2:74:a4:31:5f:85:
-                    02:97:ec:43:33:0a:53:d2:9c:8c:8e:b7:b8:79:db:
-                    2b:d5:6a:f2:8e:66:c4:ee:2b:01:07:92:d4:b3:d0:
-                    02:df:50:f6:55:af:66:0e:cb:e0:47:60:2f:2b:32:
-                    39:35:52:3a:28:83:f8:7b:16:c6:18:b8:62:d6:47:
-                    25:91:ce:f0:19:12:4d:ad:63:f5:d3:3f:75:5f:29:
-                    f0:a1:30:1c:2a:a0:98:a6:15:bd:ee:fd:19:36:f0:
-                    e2:91:43:8f:fa:ca:d6:10:27:49:4c:ef:dd:c1:f1:
-                    85:70:9b:ca:ea:a8:5a:43:fc:6d:86:6f:73:e9:37:
-                    45:a9:f0:36:c7:cc:88:75:1e:bb:6c:06:ff:9b:6b:
-                    3e:17:ec:61:aa:71:7c:c6:1d:a2:f7:49:e9:15:b5:
-                    3c:d6:a1:61:f5:11:f7:05:6f:1d:fd:11:be:d0:30:
-                    07:c2:29:b0:09:4e:26:dc:e3:a2:a8:91:6a:1f:c2:
-                    91:45:88:5c:e5:98:b8:71:a5:15:19:c9:7c:75:11:
-                    cc:70:74:4f:2d:9b:1d:91:44:fd:56:28:a0:fe:bb:
-                    86:6a:c8:fa:5c:0b:58:dc:c6:4b:76:c8:ab:22:d9:
-                    73:0f:a5:f4:5a:02:89:3f:4f:9e:22:82:ee:a2:74:
-                    53:2a:3d:53:27:69:1d:6c:8e:32:2c:64:00:26:63:
-                    61:36:4e:a3:46:b7:3f:7d:b3:2d:ac:6d:90:a2:95:
-                    a2:ce:cf:da:82:e7:07:34:19:96:e9:b8:21:aa:29:
-                    7e:a6:38:be:8e:29:4a:21:66:79:1f:b3:c3:b5:09:
-                    67:de:d6:d4:07:46:f3:2a:da:e6:22:37:60:cb:81:
-                    b6:0f:a0:0f:e9:c8:95:7f:bf:55:91:05:7a:cf:3d:
-                    15:c0:6f:de:09:94:01:83:d7:34:1b:cc:40:a5:f0:
-                    b8:9b:67:d5:98:91:3b:a7:84:78:95:26:a4:5a:08:
-                    f8:2b:74:b4:00:04:3c:df:b8:14:8e:e8:df:a9:8d:
-                    6c:67:92:33:1d:c0:b7:d2:ec:92:c8:be:09:bf:2c:
-                    29:05:6f:02:6b:9e:ef:bc:bf:2a:bc:5b:c0:50:8f:
-                    41:70:71:87:b2:4d:b7:04:a9:84:a3:32:af:ae:ee:
-                    6b:17:8b:b2:b1:fe:6c:e1:90:8c:88:a8:97:48:ce:
-                    c8:4d:cb:f3:06:cf:5f:6a:0a:42:b1:1e:1e:77:2f:
-                    8e:a0:e6:92:0e:06:fc:05:22:d2:26:e1:31:51:7d:
-                    32:dc:0f
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-    Signature Algorithm: sha256WithRSAEncryption
-         5f:34:81:76:ef:96:1d:d5:e5:b5:d9:02:63:84:16:c1:ae:a0:
-         70:51:a7:f7:4c:47:35:c8:0b:d7:28:3d:89:71:d9:aa:33:41:
-         ea:14:1b:6c:21:00:c0:6c:42:19:7e:9f:69:5b:20:42:df:a2:
-         d2:da:c4:7c:97:4b:8d:b0:e8:ac:c8:ee:a5:69:04:99:0a:92:
-         a6:ab:27:2e:1a:4d:81:bf:84:d4:70:1e:ad:47:fe:fd:4a:9d:
-         33:e0:f2:b9:c4:45:08:21:0a:da:69:69:73:72:0d:be:34:fe:
-         94:8b:ad:c3:1e:35:d7:a2:83:ef:e5:38:c7:a5:85:1f:ab:cf:
-         34:ec:3f:28:fe:0c:f1:57:86:4e:c9:55:f7:1c:d4:d8:a5:7d:
-         06:7a:6f:d5:df:10:df:81:4e:21:65:b1:b6:e1:17:79:95:45:
-         06:ce:5f:cc:dc:46:89:63:68:44:8d:93:f4:64:70:a0:3d:9d:
-         28:05:c3:39:70:b8:62:7b:20:fd:e4:db:e9:08:a1:b8:9e:3d:
-         09:c7:4f:fb:2c:f8:93:76:41:de:52:e0:e1:57:d2:9d:03:bc:
-         77:9e:fe:9e:29:5e:f7:c1:51:60:1f:de:da:0b:b2:2d:75:b7:
-         43:48:93:e7:f6:79:c6:84:5d:80:59:60:94:fc:78:98:8f:3c:
-         93:51:ed:40:90:07:df:64:63:24:cb:4e:71:05:a1:d7:94:1a:
-         88:32:f1:22:74:22:ae:a5:a6:d8:12:69:4c:60:a3:02:ee:2b:
-         ec:d4:63:92:0b:5e:be:2f:76:6b:a3:b6:26:bc:8f:03:d8:0a:
-         f2:4c:64:46:bd:39:62:e5:96:eb:34:63:11:28:cc:95:f1:ad:
-         ef:ef:dc:80:58:48:e9:4b:b8:ea:65:ac:e9:fc:80:b5:b5:c8:
-         45:f9:ac:c1:9f:d9:b9:ea:62:88:8e:c4:f1:4b:83:12:ad:e6:
-         8b:84:d6:9e:c2:eb:83:18:9f:6a:bb:1b:24:60:33:70:cc:ec:
-         f7:32:f3:5c:d9:79:7d:ef:9e:a4:fe:c9:23:c3:24:ee:15:92:
-         b1:3d:91:4f:26:86:bd:66:73:24:13:ea:a4:ae:63:c1:ad:7d:
-         84:03:3c:10:78:86:1b:79:e3:c4:f3:f2:04:95:20:ae:23:82:
-         c4:b3:3a:00:62:bf:e6:36:24:e1:57:ba:c7:1e:90:75:d5:5f:
-         3f:95:61:2b:c1:3b:cd:e5:b3:68:61:d0:46:26:a9:21:52:69:
-         2d:eb:2e:c7:eb:77:ce:a6:3a:b5:03:33:4f:76:d1:e7:5c:54:
-         01:5d:cb:78:f4:c9:0c:bf:cf:12:8e:17:2d:23:68:94:e7:ab:
-         fe:a9:b2:2b:06:d0:04:cd
------BEGIN CERTIFICATE-----
-MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx
-EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT
-VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5
-NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT
-B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG
-SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF
-10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz
-0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh
-MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH
-zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc
-46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2
-yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi
-laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP
-oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA
-BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE
-qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm
-4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
-/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL
-1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
-LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF
-H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo
-RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+
-nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh
-15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW
-6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW
-nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j
-wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz
-aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy
-KwbQBM0=
------END CERTIFICATE-----
-
-# bfd88fe1101c41ae3e801bf8be56350ee9bad1a6b9bd515edc5c6d5b8711ac44
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 1 (0x1)
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=TW, O=TAIWAN-CA, OU=Root CA, CN=TWCA Root Certification Authority
-        Validity
-            Not Before: Aug 28 07:24:33 2008 GMT
-            Not After : Dec 31 15:59:59 2030 GMT
-        Subject: C=TW, O=TAIWAN-CA, OU=Root CA, CN=TWCA Root Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:b0:7e:72:b8:a4:03:94:e6:a7:de:09:38:91:4a:
-                    11:40:87:a7:7c:59:64:14:7b:b5:11:10:dd:fe:bf:
-                    d5:c0:bb:56:e2:85:25:f4:35:72:0f:f8:53:d0:41:
-                    e1:44:01:c2:b4:1c:c3:31:42:16:47:85:33:22:76:
-                    b2:0a:6f:0f:e5:25:50:4f:85:86:be:bf:98:2e:10:
-                    67:1e:be:11:05:86:05:90:c4:59:d0:7c:78:10:b0:
-                    80:5c:b7:e1:c7:2b:75:cb:7c:9f:ae:b5:d1:9d:23:
-                    37:63:a7:dc:42:a2:2d:92:04:1b:50:c1:7b:b8:3e:
-                    1b:c9:56:04:8b:2f:52:9b:ad:a9:56:e9:c1:ff:ad:
-                    a9:58:87:30:b6:81:f7:97:45:fc:19:57:3b:2b:6f:
-                    e4:47:f4:99:45:fe:1d:f1:f8:97:a3:88:1d:37:1c:
-                    5c:8f:e0:76:25:9a:50:f8:a0:54:ff:44:90:76:23:
-                    d2:32:c6:c3:ab:06:bf:fc:fb:bf:f3:ad:7d:92:62:
-                    02:5b:29:d3:35:a3:93:9a:43:64:60:5d:b2:fa:32:
-                    ff:3b:04:af:4d:40:6a:f9:c7:e3:ef:23:fd:6b:cb:
-                    e5:0f:8b:38:0d:ee:0a:fc:fe:0f:98:9f:30:31:dd:
-                    6c:52:65:f9:8b:81:be:22:e1:1c:58:03:ba:91:1b:
-                    89:07
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                6A:38:5B:26:8D:DE:8B:5A:F2:4F:7A:54:83:19:18:E3:08:35:A6:BA
-    Signature Algorithm: sha1WithRSAEncryption
-         3c:d5:77:3d:da:df:89:ba:87:0c:08:54:6a:20:50:92:be:b0:
-         41:3d:b9:26:64:83:0a:2f:e8:40:c0:97:28:27:82:30:4a:c9:
-         93:ff:6a:e7:a6:00:7f:89:42:9a:d6:11:e5:53:ce:2f:cc:f2:
-         da:05:c4:fe:e2:50:c4:3a:86:7d:cc:da:7e:10:09:3b:92:35:
-         2a:53:b2:fe:eb:2b:05:d9:6c:5d:e6:d0:ef:d3:6a:66:9e:15:
-         28:85:7a:e8:82:00:ac:1e:a7:09:69:56:42:d3:68:51:18:be:
-         54:9a:bf:44:41:ba:49:be:20:ba:69:5c:ee:b8:77:cd:ce:6c:
-         1f:ad:83:96:18:7d:0e:b5:14:39:84:f1:28:e9:2d:a3:9e:7b:
-         1e:7a:72:5a:83:b3:79:6f:ef:b4:fc:d0:0a:a5:58:4f:46:df:
-         fb:6d:79:59:f2:84:22:52:ae:0f:cc:fb:7c:3b:e7:6a:ca:47:
-         61:c3:7a:f8:d3:92:04:1f:b8:20:84:e1:36:54:16:c7:40:de:
-         3b:8a:73:dc:df:c6:09:4c:df:ec:da:ff:d4:53:42:a1:c9:f2:
-         62:1d:22:83:3c:97:c5:f9:19:62:27:ac:65:22:d7:d3:3c:c6:
-         e5:8e:b2:53:cc:49:ce:bc:30:fe:7b:0e:33:90:fb:ed:d2:14:
-         91:1f:07:af
------BEGIN CERTIFICATE-----
-MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
-MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
-V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
-WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
-LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
-AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
-AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
-K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
-RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
-rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
-3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
-hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
-MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
-XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
-lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
-aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
-YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
------END CERTIFICATE-----
-
-# fd73dad31c644ff1b43bef0ccdda96710b9cd9875eca7e31707af3e96d522bbd
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 1 (0x1)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=DE, O=T-Systems Enterprise Services GmbH, OU=T-Systems Trust Center, CN=T-TeleSec GlobalRoot Class 3
-        Validity
-            Not Before: Oct  1 10:29:56 2008 GMT
-            Not After : Oct  1 23:59:59 2033 GMT
-        Subject: C=DE, O=T-Systems Enterprise Services GmbH, OU=T-Systems Trust Center, CN=T-TeleSec GlobalRoot Class 3
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:bd:75:93:f0:62:22:6f:24:ae:e0:7a:76:ac:7d:
-                    bd:d9:24:d5:b8:b7:fc:cd:f0:42:e0:eb:78:88:56:
-                    5e:9b:9a:54:1d:4d:0c:8a:f6:d3:cf:70:f4:52:b5:
-                    d8:93:04:e3:46:86:71:41:4a:2b:f0:2a:2c:55:03:
-                    d6:48:c3:e0:39:38:ed:f2:5c:3c:3f:44:bc:93:3d:
-                    61:ab:4e:cd:0d:be:f0:20:27:58:0e:44:7f:04:1a:
-                    87:a5:d7:96:14:36:90:d0:49:7b:a1:75:fb:1a:6b:
-                    73:b1:f8:ce:a9:09:2c:f2:53:d5:c3:14:44:b8:86:
-                    a5:f6:8b:2b:39:da:a3:33:54:d9:fa:72:1a:f7:22:
-                    15:1c:88:91:6b:7f:66:e5:c3:6a:80:b0:24:f3:df:
-                    86:45:88:fd:19:7f:75:87:1f:1f:b1:1b:0a:73:24:
-                    5b:b9:65:e0:2c:54:c8:60:d3:66:17:3f:e1:cc:54:
-                    33:73:91:02:3a:a6:7f:7b:76:39:a2:1f:96:b6:38:
-                    ae:b5:c8:93:74:1d:9e:b9:b4:e5:60:9d:2f:56:d1:
-                    e0:eb:5e:5b:4c:12:70:0c:6c:44:20:ab:11:d8:f4:
-                    19:f6:d2:9c:52:37:e7:fa:b6:c2:31:3b:4a:d4:14:
-                    99:ad:c7:1a:f5:5d:5f:fa:07:b8:7c:0d:1f:d6:83:
-                    1e:b3
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Subject Key Identifier: 
-                B5:03:F7:76:3B:61:82:6A:12:AA:18:53:EB:03:21:94:BF:FE:CE:CA
-    Signature Algorithm: sha256WithRSAEncryption
-         56:3d:ef:94:d5:bd:da:73:b2:58:be:ae:90:ad:98:27:97:fe:
-         01:b1:b0:52:00:b8:4d:e4:1b:21:74:1b:7e:c0:ee:5e:69:2a:
-         25:af:5c:d6:1d:da:d2:79:c9:f3:97:29:e0:86:87:de:04:59:
-         0f:f1:59:d4:64:85:4b:99:af:25:04:1e:c9:46:a9:97:de:82:
-         b2:1b:70:9f:9c:f6:af:71:31:dd:7b:05:a5:2c:d3:b9:ca:47:
-         f6:ca:f2:f6:e7:ad:b9:48:3f:bc:16:b7:c1:6d:f4:ea:09:af:
-         ec:f3:b5:e7:05:9e:a6:1e:8a:53:51:d6:93:81:cc:74:93:f6:
-         b9:da:a6:25:05:74:79:5a:7e:40:3e:82:4b:26:11:30:6e:e1:
-         3f:41:c7:47:00:35:d5:f5:d3:f7:54:3e:81:3d:da:49:6a:9a:
-         b3:ef:10:3d:e6:eb:6f:d1:c8:22:47:cb:cc:cf:01:31:92:d9:
-         18:e3:22:be:09:1e:1a:3e:5a:b2:e4:6b:0c:54:7a:7d:43:4e:
-         b8:89:a5:7b:d7:a2:3d:96:86:cc:f2:26:34:2d:6a:92:9d:9a:
-         1a:d0:30:e2:5d:4e:04:b0:5f:8b:20:7e:77:c1:3d:95:82:d1:
-         46:9a:3b:3c:78:b8:6f:a1:d0:0d:64:a2:78:1e:29:4e:93:c3:
-         a4:54:14:5b
------BEGIN CERTIFICATE-----
-MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
-KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
-BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
-YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
-OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
-aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
-ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
-CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
-8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
-RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
-hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
-ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
-EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
-QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
-A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
-WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
-1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
-6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
-91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
-e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
-TpPDpFQUWw==
------END CERTIFICATE-----
-
-# d43af9b35473755c9684fc06d7d8cb70ee5c28e773fb294eb41ee71722924d24
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            4f:d2:2b:8f:f5:64:c8:33:9e:4f:34:58:66:23:70:60
-        Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C = CN, O = UniTrust, CN = UCA Extended Validation Root
-        Validity
-            Not Before: Mar 13 00:00:00 2015 GMT
-            Not After : Dec 31 00:00:00 2038 GMT
-        Subject: C = CN, O = UniTrust, CN = UCA Extended Validation Root
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                RSA Public-Key: (4096 bit)
-                Modulus:
-                    00:a9:09:07:28:13:02:b0:99:e0:64:aa:1e:43:16:
-                    7a:73:b1:91:a0:75:3e:a8:fa:e3:38:00:7a:ec:89:
-                    6a:20:0f:8b:c5:b0:9b:33:03:5a:86:c6:58:86:d5:
-                    c1:85:bb:4f:c6:9c:40:4d:ca:be:ee:69:96:b8:ad:
-                    81:30:9a:7c:92:05:eb:05:2b:9a:48:d0:b8:76:3e:
-                    96:c8:20:bb:d2:b0:f1:8f:d8:ac:45:46:ff:aa:67:
-                    60:b4:77:7e:6a:1f:3c:1a:52:7a:04:3d:07:3c:85:
-                    0d:84:d0:1f:76:0a:f7:6a:14:df:72:e3:34:7c:57:
-                    4e:56:01:3e:79:f1:aa:29:3b:6c:fa:f8:8f:6d:4d:
-                    c8:35:df:ae:eb:dc:24:ee:79:45:a7:85:b6:05:88:
-                    de:88:5d:25:7c:97:64:67:09:d9:bf:5a:15:05:86:
-                    f3:09:1e:ec:58:32:33:11:f3:77:64:b0:76:1f:e4:
-                    10:35:17:1b:f2:0e:b1:6c:a4:2a:a3:73:fc:09:1f:
-                    1e:32:19:53:11:e7:d9:b3:2c:2e:76:2e:a1:a3:de:
-                    7e:6a:88:09:e8:f2:07:8a:f8:b2:cd:10:e7:e2:73:
-                    40:93:bb:08:d1:3f:e1:fc:0b:94:b3:25:ef:7c:a6:
-                    d7:d1:af:9f:ff:96:9a:f5:91:7b:98:0b:77:d4:7e:
-                    e8:07:d2:62:b5:95:39:e3:f3:f1:6d:0f:0e:65:84:
-                    8a:63:54:c5:80:b6:e0:9e:4b:7d:47:26:a7:01:08:
-                    5d:d1:88:9e:d7:c3:32:44:fa:82:4a:0a:68:54:7f:
-                    38:53:03:cc:a4:00:33:64:51:59:0b:a3:82:91:7a:
-                    5e:ec:16:c2:f3:2a:e6:62:da:2a:db:59:62:10:25:
-                    4a:2a:81:0b:47:07:43:06:70:87:d2:fa:93:11:29:
-                    7a:48:4d:eb:94:c7:70:4d:af:67:d5:51:b1:80:20:
-                    01:01:b4:7a:08:a6:90:7f:4e:e0:ef:07:41:87:af:
-                    6a:a5:5e:8b:fb:cf:50:b2:9a:54:af:c3:89:ba:58:
-                    2d:f5:30:98:b1:36:72:39:7e:49:04:fd:29:a7:4c:
-                    79:e4:05:57:db:94:b9:16:53:8d:46:b3:1d:95:61:
-                    57:56:7f:af:f0:16:5b:61:58:6f:36:50:11:0b:d8:
-                    ac:2b:95:16:1a:0e:1f:08:cd:36:34:65:10:62:66:
-                    d5:80:5f:14:20:5f:2d:0c:a0:78:0a:68:d6:2c:d7:
-                    e9:6f:2b:d2:4a:05:93:fc:9e:6f:6b:67:ff:88:f1:
-                    4e:a5:69:4a:52:37:05:ea:c6:16:8d:d2:c4:99:d1:
-                    82:2b:3b:ba:35:75:f7:51:51:58:f3:c8:07:dd:e4:
-                    b4:03:7f
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                D9:74:3A:E4:30:3D:0D:F7:12:DC:7E:5A:05:9F:1E:34:9A:F7:E1:14
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Key Usage: critical
-                Digital Signature, Certificate Sign, CRL Sign
-    Signature Algorithm: sha256WithRSAEncryption
-         36:8d:97:cc:42:15:64:29:37:9b:26:2c:d6:fb:ae:15:69:2c:
-         6b:1a:1a:f7:5f:b6:f9:07:4c:59:ea:f3:c9:c8:b9:ae:cc:ba:
-         2e:7a:dc:c0:f5:b0:2d:c0:3b:af:9f:70:05:11:6a:9f:25:4f:
-         01:29:70:e3:e5:0c:e1:ea:5a:7c:dc:49:bb:c1:1e:2a:81:f5:
-         16:4b:72:91:c8:a2:31:b9:aa:da:fc:9d:1f:f3:5d:40:02:13:
-         fc:4e:1c:06:ca:b3:14:90:54:17:19:12:1a:f1:1f:d7:0c:69:
-         5a:f6:71:78:f4:94:7d:91:0b:8e:ec:90:54:8e:bc:6f:a1:4c:
-         ab:fc:74:64:fd:71:9a:f8:41:07:a1:cd:91:e4:3c:9a:e0:9b:
-         32:39:73:ab:2a:d5:69:c8:78:91:26:31:7d:e2:c7:30:f1:fc:
-         14:78:77:12:0e:13:f4:dd:16:94:bf:4b:67:7b:70:53:85:ca:
-         b0:bb:f3:38:4d:2c:90:39:c0:0d:c2:5d:6b:e9:e2:e5:d5:88:
-         8d:d6:2c:bf:ab:1b:be:b5:28:87:12:17:74:6e:fc:7d:fc:8f:
-         d0:87:26:b0:1b:fb:b9:6c:ab:e2:9e:3d:15:c1:3b:2e:67:02:
-         58:91:9f:ef:f8:42:1f:2c:b7:68:f5:75:ad:cf:b5:f6:ff:11:
-         7d:c2:f0:24:a5:ad:d3:fa:a0:3c:a9:fa:5d:dc:a5:a0:ef:44:
-         a4:be:d6:e8:e5:e4:13:96:17:7b:06:3e:32:ed:c7:b7:42:bc:
-         76:a3:d8:65:38:2b:38:35:51:21:0e:0e:6f:2e:34:13:40:e1:
-         2b:67:0c:6d:4a:41:30:18:23:5a:32:55:99:c9:17:e0:3c:de:
-         f6:ec:79:ad:2b:58:19:a2:ad:2c:22:1a:95:8e:be:96:90:5d:
-         42:57:c4:f9:14:03:35:2b:1c:2d:51:57:08:a7:3a:de:3f:e4:
-         c8:b4:03:73:c2:c1:26:80:bb:0b:42:1f:ad:0d:af:26:72:da:
-         cc:be:b3:a3:83:58:0d:82:c5:1f:46:51:e3:9c:18:cc:8d:9b:
-         8d:ec:49:eb:75:50:d5:8c:28:59:ca:74:34:da:8c:0b:21:ab:
-         1e:ea:1b:e5:c7:fd:15:3e:c0:17:aa:fb:23:6e:26:46:cb:fa:
-         f9:b1:72:6b:69:cf:22:84:0b:62:0f:ac:d9:19:00:94:a2:76:
-         3c:d4:2d:9a:ed:04:9e:2d:06:62:10:37:52:1c:85:72:1b:27:
-         e5:cc:c6:31:ec:37:ec:63:59:9b:0b:1d:76:cc:7e:32:9a:88:
-         95:08:36:52:bb:de:76:5f:76:49:49:ad:7f:bd:65:20:b2:c9:
-         c1:2b:76:18:76:9f:56:b1
------BEGIN CERTIFICATE-----
-MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH
-MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF
-eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx
-MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV
-BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB
-AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog
-D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS
-sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop
-O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk
-sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi
-c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj
-VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz
-KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/
-TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G
-sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs
-1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD
-fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN
-l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
-ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ
-VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5
-c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp
-4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s
-t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj
-2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO
-vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C
-xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx
-cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM
-fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax
------END CERTIFICATE-----
-
-# 4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            5c:8b:99:c5:5a:94:c5:d2:71:56:de:cd:89:80:cc:26
-    Signature Algorithm: ecdsa-with-SHA384
-        Issuer: C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust ECC Certification Authority
-        Validity
-            Not Before: Feb  1 00:00:00 2010 GMT
-            Not After : Jan 18 23:59:59 2038 GMT
-        Subject: C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust ECC Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: id-ecPublicKey
-                Public-Key: (384 bit)
-                pub: 
-                    04:1a:ac:54:5a:a9:f9:68:23:e7:7a:d5:24:6f:53:
-                    c6:5a:d8:4b:ab:c6:d5:b6:d1:e6:73:71:ae:dd:9c:
-                    d6:0c:61:fd:db:a0:89:03:b8:05:14:ec:57:ce:ee:
-                    5d:3f:e2:21:b3:ce:f7:d4:8a:79:e0:a3:83:7e:2d:
-                    97:d0:61:c4:f1:99:dc:25:91:63:ab:7f:30:a3:b4:
-                    70:e2:c7:a1:33:9c:f3:bf:2e:5c:53:b1:5f:b3:7d:
-                    32:7f:8a:34:e3:79:79
-                ASN1 OID: secp384r1
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                3A:E1:09:86:D4:CF:19:C2:96:76:74:49:76:DC:E0:35:C6:63:63:9A
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-    Signature Algorithm: ecdsa-with-SHA384
-         30:65:02:30:36:67:a1:16:08:dc:e4:97:00:41:1d:4e:be:e1:
-         63:01:cf:3b:aa:42:11:64:a0:9d:94:39:02:11:79:5c:7b:1d:
-         fa:64:b9:ee:16:42:b3:bf:8a:c2:09:c4:ec:e4:b1:4d:02:31:
-         00:e9:2a:61:47:8c:52:4a:4b:4e:18:70:f6:d6:44:d6:6e:f5:
-         83:ba:6d:58:bd:24:d9:56:48:ea:ef:c4:a2:46:81:88:6a:3a:
-         46:d1:a9:9b:4d:c9:61:da:d1:5d:57:6a:18
------BEGIN CERTIFICATE-----
-MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL
-MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl
-eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT
-JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx
-MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
-Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg
-VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo
-I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng
-o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G
-A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD
-VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB
-zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW
-RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
------END CERTIFICATE-----
-
-# e793c9b02fd8aa13e21c31228accb08119643b749c898964b1746d46c3d4cbd2
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            01:fd:6d:30:fc:a3:ca:51:a8:1b:bc:64:0e:35:03:2d
-    Signature Algorithm: sha384WithRSAEncryption
-        Issuer: C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust RSA Certification Authority
-        Validity
-            Not Before: Feb  1 00:00:00 2010 GMT
-            Not After : Jan 18 23:59:59 2038 GMT
-        Subject: C=US, ST=New Jersey, L=Jersey City, O=The USERTRUST Network, CN=USERTrust RSA Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (4096 bit)
-                Modulus:
-                    00:80:12:65:17:36:0e:c3:db:08:b3:d0:ac:57:0d:
-                    76:ed:cd:27:d3:4c:ad:50:83:61:e2:aa:20:4d:09:
-                    2d:64:09:dc:ce:89:9f:cc:3d:a9:ec:f6:cf:c1:dc:
-                    f1:d3:b1:d6:7b:37:28:11:2b:47:da:39:c6:bc:3a:
-                    19:b4:5f:a6:bd:7d:9d:a3:63:42:b6:76:f2:a9:3b:
-                    2b:91:f8:e2:6f:d0:ec:16:20:90:09:3e:e2:e8:74:
-                    c9:18:b4:91:d4:62:64:db:7f:a3:06:f1:88:18:6a:
-                    90:22:3c:bc:fe:13:f0:87:14:7b:f6:e4:1f:8e:d4:
-                    e4:51:c6:11:67:46:08:51:cb:86:14:54:3f:bc:33:
-                    fe:7e:6c:9c:ff:16:9d:18:bd:51:8e:35:a6:a7:66:
-                    c8:72:67:db:21:66:b1:d4:9b:78:03:c0:50:3a:e8:
-                    cc:f0:dc:bc:9e:4c:fe:af:05:96:35:1f:57:5a:b7:
-                    ff:ce:f9:3d:b7:2c:b6:f6:54:dd:c8:e7:12:3a:4d:
-                    ae:4c:8a:b7:5c:9a:b4:b7:20:3d:ca:7f:22:34:ae:
-                    7e:3b:68:66:01:44:e7:01:4e:46:53:9b:33:60:f7:
-                    94:be:53:37:90:73:43:f3:32:c3:53:ef:db:aa:fe:
-                    74:4e:69:c7:6b:8c:60:93:de:c4:c7:0c:df:e1:32:
-                    ae:cc:93:3b:51:78:95:67:8b:ee:3d:56:fe:0c:d0:
-                    69:0f:1b:0f:f3:25:26:6b:33:6d:f7:6e:47:fa:73:
-                    43:e5:7e:0e:a5:66:b1:29:7c:32:84:63:55:89:c4:
-                    0d:c1:93:54:30:19:13:ac:d3:7d:37:a7:eb:5d:3a:
-                    6c:35:5c:db:41:d7:12:da:a9:49:0b:df:d8:80:8a:
-                    09:93:62:8e:b5:66:cf:25:88:cd:84:b8:b1:3f:a4:
-                    39:0f:d9:02:9e:eb:12:4c:95:7c:f3:6b:05:a9:5e:
-                    16:83:cc:b8:67:e2:e8:13:9d:cc:5b:82:d3:4c:b3:
-                    ed:5b:ff:de:e5:73:ac:23:3b:2d:00:bf:35:55:74:
-                    09:49:d8:49:58:1a:7f:92:36:e6:51:92:0e:f3:26:
-                    7d:1c:4d:17:bc:c9:ec:43:26:d0:bf:41:5f:40:a9:
-                    44:44:f4:99:e7:57:87:9e:50:1f:57:54:a8:3e:fd:
-                    74:63:2f:b1:50:65:09:e6:58:42:2e:43:1a:4c:b4:
-                    f0:25:47:59:fa:04:1e:93:d4:26:46:4a:50:81:b2:
-                    de:be:78:b7:fc:67:15:e1:c9:57:84:1e:0f:63:d6:
-                    e9:62:ba:d6:5f:55:2e:ea:5c:c6:28:08:04:25:39:
-                    b8:0e:2b:a9:f2:4c:97:1c:07:3f:0d:52:f5:ed:ef:
-                    2f:82:0f
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            X509v3 Subject Key Identifier: 
-                53:79:BF:5A:AA:2B:4A:CF:54:80:E1:D8:9B:C0:9D:F2:B2:03:66:CB
-            X509v3 Key Usage: critical
-                Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-    Signature Algorithm: sha384WithRSAEncryption
-         5c:d4:7c:0d:cf:f7:01:7d:41:99:65:0c:73:c5:52:9f:cb:f8:
-         cf:99:06:7f:1b:da:43:15:9f:9e:02:55:57:96:14:f1:52:3c:
-         27:87:94:28:ed:1f:3a:01:37:a2:76:fc:53:50:c0:84:9b:c6:
-         6b:4e:ba:8c:21:4f:a2:8e:55:62:91:f3:69:15:d8:bc:88:e3:
-         c4:aa:0b:fd:ef:a8:e9:4b:55:2a:06:20:6d:55:78:29:19:ee:
-         5f:30:5c:4b:24:11:55:ff:24:9a:6e:5e:2a:2b:ee:0b:4d:9f:
-         7f:f7:01:38:94:14:95:43:07:09:fb:60:a9:ee:1c:ab:12:8c:
-         a0:9a:5e:a7:98:6a:59:6d:8b:3f:08:fb:c8:d1:45:af:18:15:
-         64:90:12:0f:73:28:2e:c5:e2:24:4e:fc:58:ec:f0:f4:45:fe:
-         22:b3:eb:2f:8e:d2:d9:45:61:05:c1:97:6f:a8:76:72:8f:8b:
-         8c:36:af:bf:0d:05:ce:71:8d:e6:a6:6f:1f:6c:a6:71:62:c5:
-         d8:d0:83:72:0c:f1:67:11:89:0c:9c:13:4c:72:34:df:bc:d5:
-         71:df:aa:71:dd:e1:b9:6c:8c:3c:12:5d:65:da:bd:57:12:b6:
-         43:6b:ff:e5:de:4d:66:11:51:cf:99:ae:ec:17:b6:e8:71:91:
-         8c:de:49:fe:dd:35:71:a2:15:27:94:1c:cf:61:e3:26:bb:6f:
-         a3:67:25:21:5d:e6:dd:1d:0b:2e:68:1b:3b:82:af:ec:83:67:
-         85:d4:98:51:74:b1:b9:99:80:89:ff:7f:78:19:5c:79:4a:60:
-         2e:92:40:ae:4c:37:2a:2c:c9:c7:62:c8:0e:5d:f7:36:5b:ca:
-         e0:25:25:01:b4:dd:1a:07:9c:77:00:3f:d0:dc:d5:ec:3d:d4:
-         fa:bb:3f:cc:85:d6:6f:7f:a9:2d:df:b9:02:f7:f5:97:9a:b5:
-         35:da:c3:67:b0:87:4a:a9:28:9e:23:8e:ff:5c:27:6b:e1:b0:
-         4f:f3:07:ee:00:2e:d4:59:87:cb:52:41:95:ea:f4:47:d7:ee:
-         64:41:55:7c:8d:59:02:95:dd:62:9d:c2:b9:ee:5a:28:74:84:
-         a5:9b:b7:90:c7:0c:07:df:f5:89:36:74:32:d6:28:c1:b0:b0:
-         0b:e0:9c:4c:c3:1c:d6:fc:e3:69:b5:47:46:81:2f:a2:82:ab:
-         d3:63:44:70:c4:8d:ff:2d:33:ba:ad:8f:7b:b5:70:88:ae:3e:
-         19:cf:40:28:d8:fc:c8:90:bb:5d:99:22:f5:52:e6:58:c5:1f:
-         88:31:43:ee:88:1d:d7:c6:8e:3c:43:6a:1d:a7:18:de:7d:3d:
-         16:f1:62:f9:ca:90:a8:fd
------BEGIN CERTIFICATE-----
-MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
-iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
-cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
-BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
-MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
-BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
-aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
-AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
-3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
-tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
-Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
-VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
-79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
-c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
-Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
-c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
-UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
-Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
-BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
-Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
-VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
-ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
-8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
-iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
-Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
-XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
-qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
-VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
-L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
-jjxDah2nGN59PRbxYvnKkKj9
------END CERTIFICATE-----
-
-# cecddc905099d8dadfc5b1d209b737cbe2c18cfb2c10c0ff0bcf0d3286fc1aa2
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number:
-            50:94:6c:ec:18:ea:d5:9c:4d:d5:97:ef:75:8f:a0:ad
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: C=US, OU=www.xrampsecurity.com, O=XRamp Security Services Inc, CN=XRamp Global Certification Authority
-        Validity
-            Not Before: Nov  1 17:14:04 2004 GMT
-            Not After : Jan  1 05:37:19 2035 GMT
-        Subject: C=US, OU=www.xrampsecurity.com, O=XRamp Security Services Inc, CN=XRamp Global Certification Authority
-        Subject Public Key Info:
-            Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
-                Modulus:
-                    00:98:24:1e:bd:15:b4:ba:df:c7:8c:a5:27:b6:38:
-                    0b:69:f3:b6:4e:a8:2c:2e:21:1d:5c:44:df:21:5d:
-                    7e:23:74:fe:5e:7e:b4:4a:b7:a6:ad:1f:ae:e0:06:
-                    16:e2:9b:5b:d9:67:74:6b:5d:80:8f:29:9d:86:1b:
-                    d9:9c:0d:98:6d:76:10:28:58:e4:65:b0:7f:4a:98:
-                    79:9f:e0:c3:31:7e:80:2b:b5:8c:c0:40:3b:11:86:
-                    d0:cb:a2:86:36:60:a4:d5:30:82:6d:d9:6e:d0:0f:
-                    12:04:33:97:5f:4f:61:5a:f0:e4:f9:91:ab:e7:1d:
-                    3b:bc:e8:cf:f4:6b:2d:34:7c:e2:48:61:1c:8e:f3:
-                    61:44:cc:6f:a0:4a:a9:94:b0:4d:da:e7:a9:34:7a:
-                    72:38:a8:41:cc:3c:94:11:7d:eb:c8:a6:8c:b7:86:
-                    cb:ca:33:3b:d9:3d:37:8b:fb:7a:3e:86:2c:e7:73:
-                    d7:0a:57:ac:64:9b:19:eb:f4:0f:04:08:8a:ac:03:
-                    17:19:64:f4:5a:25:22:8d:34:2c:b2:f6:68:1d:12:
-                    6d:d3:8a:1e:14:da:c4:8f:a6:e2:23:85:d5:7a:0d:
-                    bd:6a:e0:e9:ec:ec:17:bb:42:1b:67:aa:25:ed:45:
-                    83:21:fc:c1:c9:7c:d5:62:3e:fa:f2:c5:2d:d3:fd:
-                    d4:65
-                Exponent: 65537 (0x10001)
-        X509v3 extensions:
-            1.3.6.1.4.1.311.20.2: 
-                ...C.A
-            X509v3 Key Usage: 
-                Digital Signature, Certificate Sign, CRL Sign
-            X509v3 Basic Constraints: critical
-                CA:TRUE
-            X509v3 Subject Key Identifier: 
-                C6:4F:A2:3D:06:63:84:09:9C:CE:62:E4:04:AC:8D:5C:B5:E9:B6:1B
-            X509v3 CRL Distribution Points: 
-
-                Full Name:
-                  URI:http://crl.xrampsecurity.com/XGCA.crl
-
-            1.3.6.1.4.1.311.21.1: 
-                ...
-    Signature Algorithm: sha1WithRSAEncryption
-         91:15:39:03:01:1b:67:fb:4a:1c:f9:0a:60:5b:a1:da:4d:97:
-         62:f9:24:53:27:d7:82:64:4e:90:2e:c3:49:1b:2b:9a:dc:fc:
-         a8:78:67:35:f1:1d:f0:11:bd:b7:48:e3:10:f6:0d:df:3f:d2:
-         c9:b6:aa:55:a4:48:ba:02:db:de:59:2e:15:5b:3b:9d:16:7d:
-         47:d7:37:ea:5f:4d:76:12:36:bb:1f:d7:a1:81:04:46:20:a3:
-         2c:6d:a9:9e:01:7e:3f:29:ce:00:93:df:fd:c9:92:73:89:89:
-         64:9e:e7:2b:e4:1c:91:2c:d2:b9:ce:7d:ce:6f:31:99:d3:e6:
-         be:d2:1e:90:f0:09:14:79:5c:23:ab:4d:d2:da:21:1f:4d:99:
-         79:9d:e1:cf:27:9f:10:9b:1c:88:0d:b0:8a:64:41:31:b8:0e:
-         6c:90:24:a4:9b:5c:71:8f:ba:bb:7e:1c:1b:db:6a:80:0f:21:
-         bc:e9:db:a6:b7:40:f4:b2:8b:a9:b1:e4:ef:9a:1a:d0:3d:69:
-         99:ee:a8:28:a3:e1:3c:b3:f0:b2:11:9c:cf:7c:40:e6:dd:e7:
-         43:7d:a2:d8:3a:b5:a9:8d:f2:34:99:c4:d4:10:e1:06:fd:09:
-         84:10:3b:ee:c4:4c:f4:ec:27:7c:42:c2:74:7c:82:8a:09:c9:
-         b4:03:25:bc
------BEGIN CERTIFICATE-----
-MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
-gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
-MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
-UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
-NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
-dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
-dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
-38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
-KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
-DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
-qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
-JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
-PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
-BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
-jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
-eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
-ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
-vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
-qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
-IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
-i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
-O+7ETPTsJ3xCwnR8gooJybQDJbw=
------END CERTIFICATE-----
diff --git a/net/data/ssl/ev_roots/ev_roots.textproto b/net/data/ssl/ev_roots/ev_roots.textproto
deleted file mode 100644
index 14e3f7ab..0000000
--- a/net/data/ssl/ev_roots/ev_roots.textproto
+++ /dev/null
@@ -1,506 +0,0 @@
-# Copyright 2021 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# Actalis Authentication Root CA
-# https://ssltest-a.actalis.it:8443
-trust_anchors {
-  sha256_hex: "55926084ec963a64b96e2abe01ce0ba86a64fbfebcc7aab5afc155b37fd76066"
-  ev_policy_oids: "1.3.159.1.17.1"
-}
-
-# AffirmTrust Commercial
-# https://commercial.affirmtrust.com/
-trust_anchors {
-  sha256_hex: "0376ab1d54c5f9803ce4b2e201a0ee7eef7b57b636e8a93c9b8d4860c96f5fa7"
-  ev_policy_oids: "1.3.6.1.4.1.34697.2.1"
-}
-
-# AffirmTrust Networking
-# https://networking.affirmtrust.com:4431
-trust_anchors {
-  sha256_hex: "0a81ec5a929777f145904af38d5d509f66b5e2c58fcdb531058b0e17f3f0b41b"
-  ev_policy_oids: "1.3.6.1.4.1.34697.2.2"
-}
-
-# AffirmTrust Premium
-# https://premium.affirmtrust.com:4432/
-trust_anchors {
-  sha256_hex: "70a73f7f376b60074248904534b11482d5bf0e698ecc498df52577ebf2e93b9a"
-  ev_policy_oids: "1.3.6.1.4.1.34697.2.3"
-}
-
-# AffirmTrust Premium ECC
-# https://premiumecc.affirmtrust.com:4433/
-trust_anchors {
-  sha256_hex: "bd71fdf6da97e4cf62d1647add2581b07d79adf8397eb4ecba9c5e8488821423"
-  ev_policy_oids: "1.3.6.1.4.1.34697.2.4"
-}
-
-# Amazon Root CA 1
-# https://good.sca1a.amazontrust.com/
-trust_anchors {
-  sha256_hex: "8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Amazon Root CA 2
-# https://good.sca2a.amazontrust.com/
-trust_anchors {
-  sha256_hex: "1ba5b2aa8c65401a82960118f80bec4f62304d83cec4713a19c39c011ea46db4"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Amazon Root CA 3
-# https://good.sca3a.amazontrust.com/
-trust_anchors {
-  sha256_hex: "18ce6cfe7bf14e60b2e347b8dfe868cb31d02ebb3ada271569f50343b46db3a4"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Amazon Root CA 4
-# https://good.sca4a.amazontrust.com/
-trust_anchors {
-  sha256_hex: "e35d28419ed02025cfa69038cd623962458da5c695fbdea3c22b0bfb25897092"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Autoridad de Certificacion Firmaprofesional CIF A62634068
-# https://publifirma.firmaprofesional.com/
-trust_anchors {
-  sha256_hex: "57de0583efd2b26e0361da99da9df4648def7ee8441c3b728afa9bcde0f9b26a"
-  ev_policy_oids: "1.3.6.1.4.1.13177.10.1.3.10"
-}
-
-# Buypass Class 3 Root CA
-# https://valid.evident.ca23.ssl.buypass.no/
-trust_anchors {
-  sha256_hex: "edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d"
-  ev_policy_oids: "2.16.578.1.26.1.3.3"
-}
-
-# certSIGN ROOT CA G2
-# https://testssl-valid-evcp.certsign.ro/
-trust_anchors {
-  sha256_hex: "657cfe2fa73faa38462571f332a2363a46fce7020951710702cdfbb6eeda3305"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Certum Trusted Network CA
-# https://juice.certum.pl/
-trust_anchors {
-  sha256_hex: "5c58468d55f58e497e743982d2b50010b6d165374acf83a7d4a32db768c4408e"
-  ev_policy_oids: "1.2.616.1.113527.2.5.1.1"
-}
-
-# CFCA EV ROOT
-# https://www.erenepu.com/
-trust_anchors {
-  sha256_hex: "5cc3d78e4e1d5e45547a04e6873e64f90cf9536d1ccc2ef800f355c4c5fd70fd"
-  ev_policy_oids: "2.16.156.112554.3"
-}
-
-# COMODO Certification Authority
-# https://secure.comodo.com/
-trust_anchors {
-  sha256_hex: "1a0d20445de5ba1862d19ef880858cbce50102b36e8f0a040c3c69e74522fe6e"
-
-  ev_policy_oids: "1.3.6.1.4.1.6449.1.2.1.5.1"
-}
-
-# COMODO ECC Certification Authority
-# https://comodoecccertificationauthority-ev.comodoca.com/
-trust_anchors {
-  sha256_hex: "1793927a0614549789adce2f8f34f7f0b66d0f3ae3a3b84d21ec15dbba4fadc7"
-
-  ev_policy_oids: "1.3.6.1.4.1.6449.1.2.1.5.1"
-}
-
-# COMODO RSA Certification Authority
-# https://comodorsacertificationauthority-ev.comodoca.com/
-trust_anchors {
-  sha256_hex: "52f0e1c4e58ec629291b60317f074671b85d7ea80d5b07273463534b32b40234"
-
-  ev_policy_oids: "1.3.6.1.4.1.6449.1.2.1.5.1"
-}
-
-# DigiCert Assured ID Root G2
-# https://assured-id-root-g2.chain-demos.digicert.com/
-trust_anchors {
-  sha256_hex: "7d05ebb682339f8c9451ee094eebfefa7953a114edb2f44949452fab7d2fc185"
-
-  ev_policy_oids: "2.16.840.1.114412.2.1"
-}
-
-# DigiCert Assured ID Root G3
-# https://assured-id-root-g3.chain-demos.digicert.com/
-trust_anchors {
-  sha256_hex: "7e37cb8b4c47090cab36551ba6f45db840680fba166a952db100717f43053fc2"
-
-  ev_policy_oids: "2.16.840.1.114412.2.1"
-}
-
-# DigiCert Global Root G2
-# https://global-root-g2.chain-demos.digicert.com/
-trust_anchors {
-  sha256_hex: "cb3ccbb76031e5e0138f8dd39a23f9de47ffc35e43c1144cea27d46a5ab1cb5f"
-
-  ev_policy_oids: "2.16.840.1.114412.2.1"
-}
-
-# DigiCert Global Root G3
-# https://global-root-g3.chain-demos.digicert.com/
-trust_anchors {
-  sha256_hex: "31ad6648f8104138c738f39ea4320133393e3a18cc02296ef97c2ac9ef6731d0"
-
-  ev_policy_oids: "2.16.840.1.114412.2.1"
-}
-
-# DigiCert High Assurance EV Root CA
-# https://www.digicert.com
-trust_anchors {
-  sha256_hex: "7431e5f4c3c1ce4690774f0b61e05440883ba9a01ed00ba6abd7806ed3b118cf"
-
-  ev_policy_oids: "2.16.840.1.114412.2.1"
-}
-
-# DigiCert Trusted Root G4
-# https://trusted-root-g4.chain-demos.digicert.com/
-trust_anchors {
-  sha256_hex: "552f7bdcf1a7af9e6ce672017f4f12abf77240c78e761ac203d1d9d20ac89988"
-
-  ev_policy_oids: "2.16.840.1.114412.2.1"
-}
-
-# D-TRUST Root Class 3 CA 2 EV 2009
-# https://certdemo-ev-valid.ssl.d-trust.net/
-trust_anchors {
-  sha256_hex: "eec5496b988ce98625b934092eec2908bed0b0f316c2d4730c84eaf1f3d34881"
-
-  ev_policy_oids: "1.3.6.1.4.1.4788.2.202.1"
-}
-
-# emSign Root CA - G1
-# https://testevg1.emsign.com/
-trust_anchors {
-  sha256_hex: "40f6af0346a99aa1cd1d555a4e9cce62c7f9634603ee406615833dc8c8d00367"
-
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Entrust Root Certification Authority
-# https://www.entrust.net/
-trust_anchors {
-  sha256_hex: "73c176434f1bc6d5adf45b0e76e727287c8de57616c1e6e6141a2b2cbc7d8e4c"
-
-  ev_policy_oids: "2.16.840.1.114028.10.1.2"
-}
-
-# Entrust Root Certification Authority – G2
-# https://validg2.entrust.net
-trust_anchors {
-  sha256_hex: "43df5774b03e7fef5fe40d931a7bedf1bb2e6b42738c4e6d3841103d3aa7f339"
-
-  ev_policy_oids: "2.16.840.1.114028.10.1.2"
-}
-
-# Entrust Root Certification Authority - G4
-# https://validg4.entrust.net
-trust_anchors {
-  sha256_hex: "db3517d1f6732a2d5ab97c533ec70779ee3270a62fb4ac4238372460e6f01e88"
-  ev_policy_oids: "2.16.840.1.114028.10.1.2"
-}
-
-# Entrust Root Certification Authority – EC1
-# https://validec.entrust.net
-trust_anchors {
-  sha256_hex: "02ed0eb28c14da45165c566791700d6451d7fb56f0b2ab1d3b8eb070e56edff5"
-
-  ev_policy_oids: "2.16.840.1.114028.10.1.2"
-}
-
-# E-Tugra Certification Authority
-# https://sslev.e-tugra.com.tr
-trust_anchors {
-  sha256_hex: "b0bfd52bb0d7d9bd92bf5d4dc13da255c02c542f378365ea893911f55e55f23c"
-
-  ev_policy_oids: "2.16.792.3.0.4.1.1.4"
-}
-
-# GlobalSign Root CA
-trust_anchors {
-  sha256_hex: "ebd41040e4bb3ec742c9e381d31ef2a41a48b6685c96e7cef3c1df6cd4331c99"
-
-  ev_policy_oids: "1.3.6.1.4.1.4146.1.1"
-}
-
-# GlobalSign Root CA - R3
-# https://2029.globalsign.com/
-trust_anchors {
-  sha256_hex: "cbb522d7b7f127ad6a0113865bdf1cd4102e7d0759af635a7cf4720dc963c53b"
-
-  ev_policy_oids: "1.3.6.1.4.1.4146.1.1"
-}
-
-# GlobalSign ECC Root CA - R5
-# https://2038r5.globalsign.com/
-trust_anchors {
-  sha256_hex: "179fbc148a3dd00fd24ea13458cc43bfa7f59c8182d783a513f6ebec100c8924"
-
-  ev_policy_oids: "1.3.6.1.4.1.4146.1.1"
-}
-
-# GLOBALTRUST 2020
-# https://testok-2020-server-qualified-ev-1.e-monitoring.at/
-trust_anchors {
-  sha256_hex: "9a296a5182d1d451a2e37f439b74daafa267523329f90f9a0d2007c334e23c9a"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Go Daddy Class 2 Certification Authority
-# https://www.godaddy.com/
-trust_anchors {
-  sha256_hex: "c3846bf24b9e93ca64274c0ec67c1ecc5e024ffcacd2d74019350e81fe546ae4"
-
-  ev_policy_oids: "2.16.840.1.114413.1.7.23.3"
-}
-
-# Go Daddy Root Certificate Authority - G2
-# https://valid.gdig2.catest.godaddy.com/
-trust_anchors {
-  sha256_hex: "45140b3247eb9cc8c5b4f0d7b53091f73292089e6e5a63e2749dd3aca9198eda"
-
-  ev_policy_oids: "2.16.840.1.114413.1.7.23.3"
-}
-
-# HARICA TLS ECC Root CA 2021
-# https://tls-ecc-valid-ev.root2021.harica.gr
-trust_anchors {
-  sha256_hex: "3f99cc474acfce4dfed58794665e478d1547739f2e780f1bb4ca9b133097d401"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# HARICA TLS RSA Root CA 2021
-# https://tls-rsa-valid-ev.root2021.harica.gr
-trust_anchors {
-  sha256_hex: "d95d0e8eda79525bf9beb11b14d2100d3294985f0c62d9fabd9cd999eccb7b1d"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Hellenic Academic and Research Institutions ECC RootCA 2015
-# https://haricaeccrootca2015-valid-ev.harica.gr
-trust_anchors {
-  sha256_hex: "44b545aa8a25e65a73ca15dc27fc36d24c1cb9953a066539b11582dc487b4833"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Hellenic Academic and Research Institutions RootCA 2015
-# https://haricarootca2015-valid-ev.harica.gr
-trust_anchors {
-  sha256_hex: "a040929a02ce53b4acf4f2ffc6981ce4496f755e6d45fe0b2a692bcd52523f36"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Hongkong Post Root CA 3
-# https://valid-ev.ecert.gov.hk/
-trust_anchors {
-  sha256_hex: "5a2fc03f0c83b090bbfa40604b0988446c7636183df9846e17101a447fb8efd6"
-
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# IdenTrust Commercial Root CA 1
-# https://identrust-commercial-ev-valid.identrustssl.com/
-trust_anchors {
-  sha256_hex: "5d56499be4d2e08bcfcad08a3e38723d50503bde706948e42f55603019e528ae"
-  ev_policy_oids: "2.23.140.1.1"
-  ev_policy_oids: "2.16.840.1.113839.0.6.9"
-}
-
-# Izenpe.com - SHA256 root
-# The first OID is for businesses and the second for government entities.
-# These are the test sites, respectively:
-# https://servicios.izenpe.com
-# https://servicios1.izenpe.com
-trust_anchors {
-  sha256_hex: "2530cc8e98321502bad96f9b1fba1b099e2d299e0f4548bb914f363bc0d4531f"
-
-  ev_policy_oids: "1.3.6.1.4.1.14777.6.1.1",
-  ev_policy_oids: "1.3.6.1.4.1.14777.6.1.2"
-}
-
-# NetLock Arany (Class Gold) Főtanúsítvány
-# https://valid.ev.tanusitvany.hu
-trust_anchors {
-  sha256_hex: "6c61dac3a2def031506be036d2a6fe401994fbd13df9c8d466599274c446ec98"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Network Solutions Certificate Authority (reissued certificate with
-# NotBefore of Jan  1 00:00:00 2011 GMT).
-# https://www.networksolutions.com/website-packages/index.jsp
-trust_anchors {
-  sha256_hex: "001686cd181f83a1b1217d305b365c41e3470a78a1d37b134a98cd547b92dab3"
-
-  ev_policy_oids: "1.3.6.1.4.1.782.1.2.1.8.1"
-}
-
-# OISTE WISeKey Global Root GB CA
-# https://goodevssl.wisekey.com
-trust_anchors {
-  sha256_hex: "6b9c08e86eb0f767cfad65cd98b62149e5494a67f5845e7bd1ed019f27b86bd6"
-
-  ev_policy_oids: "2.16.756.5.14.7.4.8"
-}
-
-# QuoVadis Root CA 2
-# https://www.quovadis.bm/
-trust_anchors {
-  sha256_hex: "85a0dd7dd720adb7ff05f83d542b209dc7ff4528f7d677b18389fea5e5c49e86"
-
-  ev_policy_oids: "1.3.6.1.4.1.8024.0.2.100.1.2"
-}
-
-# QuoVadis Root CA 2 G3
-# https://evsslicag3-v.quovadisglobal.com/
-trust_anchors {
-  sha256_hex: "8fe4fb0af93a4d0d67db0bebb23e37c71bf325dcbcdd240ea04daf58b47e1840"
-
-  ev_policy_oids: "1.3.6.1.4.1.8024.0.2.100.1.2"
-}
-
-# SecureTrust CA, SecureTrust Corporation
-# https://www.securetrust.com
-# https://www.trustwave.com/
-trust_anchors {
-  sha256_hex: "f1c1b50ae5a20dd8030ec9f6bc24823dd367b5255759b4e71b61fce9f7375d73"
-
-  ev_policy_oids: "2.16.840.1.114404.1.1.2.4.1"
-}
-
-# Secure Global CA, SecureTrust Corporation
-trust_anchors {
-  sha256_hex: "4200f5043ac8590ebb527d209ed1503029fbcbd41ca1b506ec27f15ade7dac69"
-
-  ev_policy_oids: "2.16.840.1.114404.1.1.2.4.1"
-}
-
-# Security Communication EV RootCA2
-# https://www.secomtrust.net/contact/form.html
-trust_anchors {
-  sha256_hex: "513b2cecb810d4cde5dd85391adfc6c2dd60d87bb736d2b521484aa47a0ebef6"
-
-  ev_policy_oids: "1.2.392.200091.100.721.1"
-}
-
-# SSL.com EV Root Certification Authority ECC
-# https://test-ev-ecc.ssl.com/
-trust_anchors {
-  sha256_hex: "22a2c1f7bded704cc1e701b5f408c310880fe956b5de2a4a44f99c873a25a7c8"
-
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# SSL.com EV Root Certification Authority RSA R2
-# https://test-ev-rsa.ssl.com/
-trust_anchors {
-  sha256_hex: "2e7bf16cc22485a7bbe2aa8696750761b0ae39be3b2fe9d0cc6d4ef73491425c"
-
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# Staat der Nederlanden EV Root CA
-# https://pkioevssl-v.quovadisglobal.com/
-trust_anchors {
-  sha256_hex: "4d2491414cfe956746ec4cefa6cf6f72e28a1329432f9d8a907ac4cb5dadc15a"
-
-  ev_policy_oids: "2.16.528.1.1003.1.2.7"
-}
-
-# Starfield Class 2 Certification Authority
-# https://www.starfieldtech.com/
-trust_anchors {
-  sha256_hex: "1465fa205397b876faa6f0a9958e5590e40fcc7faa4fb7c2c8677521fb5fb658"
-
-  ev_policy_oids: "2.16.840.1.114414.1.7.23.3"
-}
-
-# Starfield Root Certificate Authority - G2
-# https://valid.sfig2.catest.starfieldtech.com/
-trust_anchors {
-  sha256_hex: "2ce1cb0bf9d2f9e102993fbe215152c3b2dd0cabde1c68e5319b839154dbb7f5"
-
-  ev_policy_oids: "2.16.840.1.114414.1.7.23.3"
-}
-
-# Starfield Services Root Certificate Authority - G2
-# https://valid.sfsg2.catest.starfieldtech.com/
-trust_anchors {
-  sha256_hex: "568d6905a2c88708a4b3025190edcfedb1974a606a13c6e5290fcb2ae63edab5"
-
-  ev_policy_oids: "2.16.840.1.114414.1.7.24.3"
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# SwissSign Gold CA - G2
-# https://testevg2.swisssign.net/
-trust_anchors {
-  sha256_hex: "62dd0be9b9f50a163ea0f8e75c053b1eca57ea55c8688f647c6881f2c8357b95"
-
-  ev_policy_oids: "2.16.756.1.89.1.2.1.1"
-}
-
-# TWCA Global Root CA
-# https://evssldemo3.twca.com.tw/index.html
-trust_anchors {
-  sha256_hex: "59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b"
-
-  ev_policy_oids: "1.3.6.1.4.1.40869.1.1.22.3"
-}
-
-# TWCA Root Certification Authority
-# https://evssldemo.twca.com.tw/index.html
-trust_anchors {
-  sha256_hex: "bfd88fe1101c41ae3e801bf8be56350ee9bad1a6b9bd515edc5c6d5b8711ac44"
-
-  ev_policy_oids: "1.3.6.1.4.1.40869.1.1.22.3"
-}
-
-# T-TeleSec GlobalRoot Class 3
-# http://www.telesec.de/ / https://root-class3.test.telesec.de/
-trust_anchors {
-  sha256_hex: "fd73dad31c644ff1b43bef0ccdda96710b9cd9875eca7e31707af3e96d522bbd"
-
-  ev_policy_oids: "1.3.6.1.4.1.7879.13.24.1"
-}
-
-# UCA Extended Validation Root
-# https://rsaevg1.good.sheca.com/
-trust_anchors {
-  sha256_hex: "d43af9b35473755c9684fc06d7d8cb70ee5c28e773fb294eb41ee71722924d24"
-
-  ev_policy_oids: "2.23.140.1.1"
-}
-
-# USERTrust ECC Certification Authority
-# https://usertrustecccertificationauthority-ev.comodoca.com/
-trust_anchors {
-  sha256_hex: "4ff460d54b9c86dabfbcfc5712e0400d2bed3fbc4d4fbdaa86e06adcd2a9ad7a"
-
-  ev_policy_oids: "1.3.6.1.4.1.6449.1.2.1.5.1"
-}
-
-# USERTrust RSA Certification Authority
-# https://usertrustrsacertificationauthority-ev.comodoca.com/
-trust_anchors {
-  sha256_hex: "e793c9b02fd8aa13e21c31228accb08119643b749c898964b1746d46c3d4cbd2"
-
-  ev_policy_oids: "1.3.6.1.4.1.6449.1.2.1.5.1"
-}
-
-# XRamp Global Certification Authority
-trust_anchors {
-  sha256_hex: "cecddc905099d8dadfc5b1d209b737cbe2c18cfb2c10c0ff0bcf0d3286fc1aa2"
-
-  ev_policy_oids: "2.16.840.1.114404.1.1.2.4.1"
-}
diff --git a/net/tools/root_store_tool/root_store_tool.cc b/net/tools/root_store_tool/root_store_tool.cc
index 7bbaade..09a1b69e3 100644
--- a/net/tools/root_store_tool/root_store_tool.cc
+++ b/net/tools/root_store_tool/root_store_tool.cc
@@ -192,6 +192,12 @@
   for (auto& anchor : root_store.trust_anchors()) {
     // Every trust anchor at this point should have a DER.
     CHECK(!anchor.der().empty());
+    if (anchor.ev_policy_oids_size() == 0) {
+      // The same input file is used for the Chrome Root Store and EV enabled
+      // certificates. Skip anchors that have no EV policy OIDs when generating
+      // the EV include file.
+      continue;
+    }
 
     std::string sha256_hash = crypto::SHA256HashString(anchor.der());
 
@@ -231,9 +237,6 @@
     if (oids_size > kMaxPolicyOids) {
       PLOG(ERROR) << hexencode_hash << " has too many OIDs!";
       return false;
-    } else if (oids_size < 1) {
-      PLOG(ERROR) << hexencode_hash << " has no OIDs!";
-      return false;
     }
     for (int i = 0; i < kMaxPolicyOids; i++) {
       std::string oid;
@@ -255,10 +258,6 @@
   return true;
 }
 
-bool ValidCppOutputFormatValue(base::StringPiece value) {
-  return (value == "root" || value == "ev");
-}
-
 }  // namespace
 
 int main(int argc, char** argv) {
@@ -274,23 +273,23 @@
 
   base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess();
   base::FilePath proto_path = command_line.GetSwitchValuePath("write-proto");
-  base::FilePath cpp_path = command_line.GetSwitchValuePath("write-cpp");
-  std::string cpp_output_format =
-      command_line.GetSwitchValueASCII("cpp-output-format");
+  base::FilePath root_store_cpp_path =
+      command_line.GetSwitchValuePath("write-cpp-root-store");
+  base::FilePath ev_roots_cpp_path =
+      command_line.GetSwitchValuePath("write-cpp-ev-roots");
   base::FilePath root_store_path =
       command_line.GetSwitchValuePath("root-store");
   base::FilePath certs_path = command_line.GetSwitchValuePath("certs");
 
-  if ((proto_path.empty() && cpp_path.empty()) || root_store_path.empty() ||
-      command_line.HasSwitch("help") ||
-      (!cpp_path.empty() && !ValidCppOutputFormatValue(cpp_output_format))) {
-    std::cerr << cpp_output_format << " ";
+  if ((proto_path.empty() && root_store_cpp_path.empty() &&
+       ev_roots_cpp_path.empty()) ||
+      root_store_path.empty() || command_line.HasSwitch("help")) {
     std::cerr << "Usage: root_store_tool "
               << "--root-store=TEXTPROTO_FILE "
               << "[--certs=CERTS_FILE] "
               << "[--write-proto=PROTO_FILE] "
-              << "[--write-cpp=CPP_FILE --cpp-output-format=[ev|root]] "
-              << std::endl;
+              << "[--write-cpp-root-store=CPP_FILE] "
+              << "[--write-cpp-ev-roots=CPP_FILE] " << std::endl;
     return 1;
   }
 
@@ -317,20 +316,15 @@
     }
   }
 
-  if (!cpp_path.empty()) {
-    bool success;
-    if (cpp_output_format == "root") {
-      success = WriteRootCppFile(*root_store, cpp_path);
-    } else if (cpp_output_format == "ev") {
-      success = WriteEvCppFile(*root_store, cpp_path);
-    } else {
-      // Unknown format.
-      success = false;
-    }
-    if (!success) {
-      PLOG(ERROR) << "Error writing cpp include file";
-      return 1;
-    }
+  if (!root_store_cpp_path.empty() &&
+      !WriteRootCppFile(*root_store, root_store_cpp_path)) {
+    PLOG(ERROR) << "Error writing root store C++ include file";
+    return 1;
+  }
+  if (!ev_roots_cpp_path.empty() &&
+      !WriteEvCppFile(*root_store, ev_roots_cpp_path)) {
+    PLOG(ERROR) << "Error writing EV roots C++ include file";
+    return 1;
   }
 
   return 0;
diff --git a/remoting/host/basic_desktop_environment.cc b/remoting/host/basic_desktop_environment.cc
index 162f08eb..662a7b5 100644
--- a/remoting/host/basic_desktop_environment.cc
+++ b/remoting/host/basic_desktop_environment.cc
@@ -155,18 +155,7 @@
 }
 
 std::string BasicDesktopEnvironment::GetCapabilities() const {
-  // These capabilities are added here because they are not supported by
-  // multi-process hosts, so they should not be returned by the overridden
-  // method IpcDesktopEnvironment::GetCapabilities().
-  //
-  // TODO(lambroslambrou): When these features are working for multi-process
-  // hosts, move them from here to ClientSession::OnConnectionAuthenticated().
-  std::string capabilities = protocol::kMultiStreamCapability;
-#if BUILDFLAG(IS_LINUX) && defined(REMOTING_USE_X11)
-  capabilities.append(" ");
-  capabilities.append(protocol::kClientControlledLayoutCapability);
-#endif
-  return capabilities;
+  return std::string();
 }
 
 void BasicDesktopEnvironment::SetCapabilities(const std::string& capabilities) {
diff --git a/remoting/host/me2me_desktop_environment.cc b/remoting/host/me2me_desktop_environment.cc
index 772fffd..45c4bd32 100644
--- a/remoting/host/me2me_desktop_environment.cc
+++ b/remoting/host/me2me_desktop_environment.cc
@@ -103,6 +103,15 @@
     capabilities += protocol::kRemoteWebAuthnCapability;
   }
 
+#if BUILDFLAG(IS_LINUX)
+  capabilities += " ";
+  capabilities += protocol::kMultiStreamCapability;
+#if defined(REMOTING_USE_X11)
+  capabilities += " ";
+  capabilities += protocol::kClientControlledLayoutCapability;
+#endif  // defined(REMOTING_USE_X11)
+#endif  // BUILDFLAG(IS_LINUX)
+
   return capabilities;
 }
 
diff --git a/services/metrics/public/cpp/ukm_source.cc b/services/metrics/public/cpp/ukm_source.cc
index ca09497..20530b69 100644
--- a/services/metrics/public/cpp/ukm_source.cc
+++ b/services/metrics/public/cpp/ukm_source.cc
@@ -24,10 +24,8 @@
 
 // Using a simple global assumes that all access to it will be done on the same
 // thread, namely the UI thread. If this becomes not the case then it can be
-// changed to an Atomic32 (make CustomTabState derive from int32_t) and accessed
-// with no-barrier loads and stores.
-UkmSource::CustomTabState g_custom_tab_state = UkmSource::kCustomTabUnset;
-// TODO(crbug/1228735): This will be replacing g_custom_tab_state above.
+// changed to an Atomic32 (make AndroidActivityTypeState derive from int32_t)
+// and accessed with no-barrier loads and stores.
 int32_t g_android_activity_type_state = -1;
 
 // Returns a URL that is under the length limit, by returning a constant
@@ -87,11 +85,6 @@
 }  // namespace
 
 // static
-void UkmSource::SetCustomTabVisible(bool visible) {
-  g_custom_tab_state = visible ? kCustomTabTrue : kCustomTabFalse;
-}
-
-// static
 void UkmSource::SetAndroidActivityTypeState(int32_t activity_type) {
   g_android_activity_type_state = activity_type;
 }
@@ -128,7 +121,6 @@
 UkmSource::UkmSource(ukm::SourceId id, const GURL& url)
     : id_(id),
       type_(GetSourceIdType(id_)),
-      custom_tab_state_(g_custom_tab_state),
       android_activity_type_state_(g_android_activity_type_state),
       creation_time_(base::TimeTicks::Now()) {
   navigation_data_.urls = {url};
@@ -139,7 +131,6 @@
     : id_(id),
       type_(GetSourceIdType(id_)),
       navigation_data_(navigation_data),
-      custom_tab_state_(g_custom_tab_state),
       android_activity_type_state_(g_android_activity_type_state),
       creation_time_(base::TimeTicks::Now()) {
   DCHECK(type_ == SourceIdType::NAVIGATION_ID);
@@ -169,9 +160,6 @@
     proto_source->add_urls()->set_url(GetShortenedURL(url));
   }
 
-  if (custom_tab_state_ != kCustomTabUnset)
-    proto_source->set_is_custom_tab(custom_tab_state_ == kCustomTabTrue);
-
   // -1 corresponds to the unset state. Android activity type values start at 0.
   // See chrome/browser/flags/ActivityType.java
   if (android_activity_type_state_ != -1)
diff --git a/services/metrics/public/cpp/ukm_source.h b/services/metrics/public/cpp/ukm_source.h
index ec6efacb..fe3c210 100644
--- a/services/metrics/public/cpp/ukm_source.h
+++ b/services/metrics/public/cpp/ukm_source.h
@@ -23,12 +23,6 @@
 // Contains UKM URL data for a single source id.
 class METRICS_EXPORT UkmSource {
  public:
-  enum CustomTabState {
-    kCustomTabUnset,
-    kCustomTabTrue,
-    kCustomTabFalse,
-  };
-
   // Extra navigation data associated with a particular Source. Currently, all
   // of these members except |url| are only set for navigation id sources.
   //
@@ -133,10 +127,7 @@
   // Serializes the members of the class into the supplied proto.
   void PopulateProto(Source* proto_source) const;
 
-  // Sets the current "custom tab" state. This can be called from any thread.
-  static void SetCustomTabVisible(bool visible);
-  // Sets the current "android_activity_type" state, this will replace the
-  // "custom tab" state.
+  // Sets the current "android_activity_type" state.
   static void SetAndroidActivityTypeState(int32_t android_activity_type);
 
  private:
@@ -145,11 +136,9 @@
 
   NavigationData navigation_data_;
 
-  // A flag indicating if metric was collected in a custom tab. This is set
-  // automatically when the object is created and so represents the state when
-  // the metric was created.
-  // TODO(crbug/1228735): To be replaced by |android_activity_type_state_|.
-  const CustomTabState custom_tab_state_;
+  // The type of the visible activity when the metric was collected. This is
+  // set automatically when the object is created and so represents the state
+  // when the metric was created.
   const int32_t android_activity_type_state_ = -1;
 
   // When this object was created.
diff --git a/services/network/first_party_sets/first_party_sets_manager_unittest.cc b/services/network/first_party_sets/first_party_sets_manager_unittest.cc
index b10f049..2985eb4 100644
--- a/services/network/first_party_sets/first_party_sets_manager_unittest.cc
+++ b/services/network/first_party_sets/first_party_sets_manager_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "services/network/first_party_sets/first_party_sets_manager.h"
 
+#include <initializer_list>
 #include <set>
 #include <string>
 
@@ -154,22 +155,21 @@
 }
 
 TEST_F(FirstPartySetsEnabledTest, SetCompleteSets_Idempotent) {
+  net::SchemefulSite example(GURL("https://example.test"));
+  net::SchemefulSite aaaa(GURL("https://aaaa.test"));
+
   SetCompleteSets({}, {});
   EXPECT_THAT(FindEntriesAndWait({}), IsEmpty());
 
   // The second call to SetCompleteSets should have no effect.
-  SetCompleteSets({{net::SchemefulSite(GURL("https://aaaa.test")),
-                    net::FirstPartySetEntry(
-                        net::SchemefulSite(GURL("https://example.test")),
-                        net::SiteType::kAssociated, 0)},
-                   {net::SchemefulSite(GURL("https://example.test")),
-                    net::FirstPartySetEntry(
-                        net::SchemefulSite(GURL("https://example.test")),
-                        net::SiteType::kPrimary, absl::nullopt)}},
-                  {});
+  SetCompleteSets(
+      {{aaaa, net::FirstPartySetEntry(example, net::SiteType::kAssociated, 0)},
+       {example, net::FirstPartySetEntry(example, net::SiteType::kPrimary,
+                                         absl::nullopt)}},
+      {});
   EXPECT_THAT(FindEntriesAndWait({
-                  net::SchemefulSite(GURL("https://aaaa.test")),
-                  net::SchemefulSite(GURL("https://example.test")),
+                  aaaa,
+                  example,
               }),
               IsEmpty());
 }
@@ -283,12 +283,10 @@
 
   for (const net::SchemefulSite* top_frame :
        std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    EXPECT_EQ(
-        ComputeMetadataAndWait(
-            net::SchemefulSite(GURL("https://nonmember.test")), top_frame, {})
-            .context()
-            .context_type(),
-        Type::kCrossParty);
+    EXPECT_EQ(ComputeMetadataAndWait(nonmember, top_frame, {})
+                  .context()
+                  .context_type(),
+              Type::kCrossParty);
 
     EXPECT_EQ(ComputeMetadataAndWait(example_site, top_frame, {})
                   .context()
@@ -314,79 +312,54 @@
 }
 
 TEST_F(PopulatedFirstPartySetsManagerTest, ComputeMetadata_ContextIsNonmember) {
-  std::set<net::SchemefulSite> context({
-      net::SchemefulSite(GURL("https://nonmember.test")),
-  });
+  net::SchemefulSite nonmember(GURL("https://nonmember.test"));
+  std::set<net::SchemefulSite> context({nonmember});
 
   net::SchemefulSite example_site(GURL("https://example.test"));
 
   for (const net::SchemefulSite* top_frame :
        std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("http://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member1.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://foo.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member2.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(
-                  net::SchemefulSite(GURL("https://nonmember.test")), top_frame,
-                  context)
-                  .context()
-                  .context_type(),
-              Type::kCrossParty);
+    for (const net::SchemefulSite& site :
+         std::initializer_list<net::SchemefulSite>{
+             example_site,
+             net::SchemefulSite(GURL("http://example.test")),
+             net::SchemefulSite(GURL("http://member1.test")),
+             net::SchemefulSite(GURL("http://foo.test")),
+             net::SchemefulSite(GURL("http://member2.test")),
+             nonmember,
+         }) {
+      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
+                    .context()
+                    .context_type(),
+                Type::kCrossParty)
+          << site;
+    }
   }
 }
 
 TEST_F(PopulatedFirstPartySetsManagerTest, ComputeMetadata_ContextIsOwner) {
-  std::set<net::SchemefulSite> context(
-      {net::SchemefulSite(GURL("https://example.test"))});
-
   net::SchemefulSite example_site(GURL("https://example.test"));
+  std::set<net::SchemefulSite> context({example_site});
 
   for (const net::SchemefulSite* top_frame :
        std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kSameParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("http://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
+    for (const net::SchemefulSite& site :
+         std::initializer_list<net::SchemefulSite>{
+             net::SchemefulSite(GURL("http://example.test")),
+             net::SchemefulSite(GURL("https://foo.test")),
+             net::SchemefulSite(GURL("https://member2.test")),
+             net::SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
+                    .context()
+                    .context_type(),
+                Type::kCrossParty)
+          << site;
+    }
+    EXPECT_EQ(ComputeMetadataAndWait(example_site, top_frame, context)
+                  .context()
+                  .context_type(),
+              Type::kSameParty);
 
     EXPECT_EQ(
         ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member1.test")),
@@ -394,120 +367,77 @@
             .context()
             .context_type(),
         Type::kSameParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://foo.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member2.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(
-                  net::SchemefulSite(GURL("https://nonmember.test")), top_frame,
-                  context)
-                  .context()
-                  .context_type(),
-              Type::kCrossParty);
   }
 }
 
 TEST_F(PopulatedFirstPartySetsManagerTest, ComputeMetadata_ContextIsMember) {
-  std::set<net::SchemefulSite> context(
-      {net::SchemefulSite(GURL("https://member1.test"))});
+  net::SchemefulSite member1(GURL("https://member1.test"));
+  std::set<net::SchemefulSite> context({member1});
 
   net::SchemefulSite example_site(GURL("https://example.test"));
 
   for (const net::SchemefulSite* top_frame :
        std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kSameParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("http://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kSameParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member1.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kSameParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://foo.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member2.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(
-                  net::SchemefulSite(GURL("https://nonmember.test")), top_frame,
-                  context)
+    for (const net::SchemefulSite& site :
+         std::initializer_list<net::SchemefulSite>{
+             net::SchemefulSite(GURL("http://example.test")),
+             net::SchemefulSite(GURL("https://foo.test")),
+             net::SchemefulSite(GURL("https://member2.test")),
+             net::SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
+                    .context()
+                    .context_type(),
+                Type::kCrossParty)
+          << site;
+    }
+    EXPECT_EQ(ComputeMetadataAndWait(example_site, top_frame, context)
                   .context()
                   .context_type(),
-              Type::kCrossParty);
+              Type::kSameParty);
+
+    EXPECT_EQ(ComputeMetadataAndWait(example_site, top_frame, context)
+                  .context()
+                  .context_type(),
+              Type::kSameParty);
+
+    EXPECT_EQ(ComputeMetadataAndWait(member1, top_frame, context)
+                  .context()
+                  .context_type(),
+              Type::kSameParty);
   }
 }
 
 TEST_F(PopulatedFirstPartySetsManagerTest,
        ComputeMetadata_ContextIsOwnerAndMember) {
-  std::set<net::SchemefulSite> context({
-      net::SchemefulSite(GURL("https://example.test")),
-      net::SchemefulSite(GURL("https://member1.test")),
-  });
-
   net::SchemefulSite example_site(GURL("https://example.test"));
+  net::SchemefulSite member1(GURL("https://member1.test"));
+  std::set<net::SchemefulSite> context({example_site, member1});
 
   for (const net::SchemefulSite* top_frame :
        std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kSameParty);
+    for (const net::SchemefulSite& site :
+         std::initializer_list<net::SchemefulSite>{
+             net::SchemefulSite(GURL("http://example.test")),
+             net::SchemefulSite(GURL("https://foo.test")),
+             net::SchemefulSite(GURL("https://member2.test")),
+             net::SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
+                    .context()
+                    .context_type(),
+                Type::kCrossParty)
+          << site;
+    }
+    EXPECT_EQ(ComputeMetadataAndWait(example_site, top_frame, context)
+                  .context()
+                  .context_type(),
+              Type::kSameParty);
 
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("http://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member1.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kSameParty);
+    EXPECT_EQ(ComputeMetadataAndWait(member1, top_frame, context)
+                  .context()
+                  .context_type(),
+              Type::kSameParty);
 
     EXPECT_EQ(
         ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member3.test")),
@@ -515,195 +445,90 @@
             .context()
             .context_type(),
         Type::kSameParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://foo.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member2.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(
-                  net::SchemefulSite(GURL("https://nonmember.test")), top_frame,
-                  context)
-                  .context()
-                  .context_type(),
-              Type::kCrossParty);
   }
 }
 
 TEST_F(PopulatedFirstPartySetsManagerTest,
        ComputeMetadata_ContextMixesParties) {
-  std::set<net::SchemefulSite> context({
-      net::SchemefulSite(GURL("https://example.test")),
-      net::SchemefulSite(GURL("https://member1.test")),
-      net::SchemefulSite(GURL("https://foo.test")),
-  });
-
   net::SchemefulSite example_site(GURL("https://example.test"));
+  net::SchemefulSite member1(GURL("https://member1.test"));
+  net::SchemefulSite foo(GURL("https://foo.test"));
+  std::set<net::SchemefulSite> context({example_site, member1, foo});
 
   for (const net::SchemefulSite* top_frame :
        std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("http://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member1.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://foo.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member2.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(
-                  net::SchemefulSite(GURL("https://nonmember.test")), top_frame,
-                  context)
-                  .context()
-                  .context_type(),
-              Type::kCrossParty);
+    for (const net::SchemefulSite& site :
+         std::initializer_list<net::SchemefulSite>{
+             example_site,
+             net::SchemefulSite(GURL("http://example.test")),
+             member1,
+             foo,
+             net::SchemefulSite(GURL("https://member2.test")),
+             net::SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
+                    .context()
+                    .context_type(),
+                Type::kCrossParty)
+          << site;
+    }
   }
 }
 
 TEST_F(PopulatedFirstPartySetsManagerTest,
        ComputeMetadata_ContextMixesMembersAndNonmembers) {
+  net::SchemefulSite example_site(GURL("https://example.test"));
+  net::SchemefulSite member1(GURL("https://member1.test"));
   std::set<net::SchemefulSite> context({
-      net::SchemefulSite(GURL("https://example.test")),
-      net::SchemefulSite(GURL("https://member1.test")),
+      example_site,
+      member1,
       net::SchemefulSite(GURL("http://nonmember.test")),
   });
 
-  net::SchemefulSite example_site(GURL("https://example.test"));
-
   for (const net::SchemefulSite* top_frame :
        std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("http://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member1.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://foo.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member2.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(
-                  net::SchemefulSite(GURL("https://nonmember.test")), top_frame,
-                  context)
-                  .context()
-                  .context_type(),
-              Type::kCrossParty);
+    for (const net::SchemefulSite& site :
+         std::initializer_list<net::SchemefulSite>{
+             example_site,
+             net::SchemefulSite(GURL("http://example.test")),
+             member1,
+             net::SchemefulSite(GURL("https://foo.test")),
+             net::SchemefulSite(GURL("https://member2.test")),
+             net::SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
+                    .context()
+                    .context_type(),
+                Type::kCrossParty)
+          << site;
+    }
   }
 }
 
 TEST_F(PopulatedFirstPartySetsManagerTest,
        ComputeMetadata_ContextMixesSchemes) {
-  std::set<net::SchemefulSite> context({
-      net::SchemefulSite(GURL("https://example.test")),
-      net::SchemefulSite(GURL("https://member1.test")),
-      net::SchemefulSite(GURL("http://example.test")),
-  });
-
   net::SchemefulSite example_site(GURL("https://example.test"));
+  net::SchemefulSite example_http(GURL("http://example.test"));
+  net::SchemefulSite member1(GURL("https://member1.test"));
+  std::set<net::SchemefulSite> context({example_site, member1, example_http});
 
   for (const net::SchemefulSite* top_frame :
        std::initializer_list<net::SchemefulSite*>{&example_site, nullptr}) {
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("http://example.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member1.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://foo.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(
-        ComputeMetadataAndWait(net::SchemefulSite(GURL("https://member2.test")),
-                               top_frame, context)
-            .context()
-            .context_type(),
-        Type::kCrossParty);
-
-    EXPECT_EQ(ComputeMetadataAndWait(
-                  net::SchemefulSite(GURL("https://nonmember.test")), top_frame,
-                  context)
-                  .context()
-                  .context_type(),
-              Type::kCrossParty);
+    for (const net::SchemefulSite& site :
+         std::initializer_list<net::SchemefulSite>{
+             example_site,
+             example_http,
+             net::SchemefulSite(GURL("https://member1.test")),
+             net::SchemefulSite(GURL("https://foo.test")),
+             net::SchemefulSite(GURL("https://member2.test")),
+             net::SchemefulSite(GURL("https://nonmember.test")),
+         }) {
+      EXPECT_EQ(ComputeMetadataAndWait(site, top_frame, context)
+                    .context()
+                    .context_type(),
+                Type::kCrossParty)
+          << site;
+    }
   }
 }
 
@@ -760,77 +585,21 @@
                                        &associated_entry, &associated_entry));
 }
 
-TEST_F(PopulatedFirstPartySetsManagerTest, FindEntries) {
-  net::SchemefulSite example(GURL("https://example.test"));
-  net::SchemefulSite foo(GURL("https://foo.test"));
-  net::SchemefulSite member1(GURL("https://member1.test"));
-  net::SchemefulSite member2(GURL("https://member2.test"));
-  net::SchemefulSite nonmember(GURL("https://nonmember.test"));
-
-  EXPECT_THAT(
-      FindEntriesAndWait({example}),
-      UnorderedElementsAre(
-          Pair(example, net::FirstPartySetEntry(
-                            example, net::SiteType::kPrimary, absl::nullopt))));
-  EXPECT_THAT(FindEntriesAndWait({member1}),
-              UnorderedElementsAre(
-                  Pair(member1, net::FirstPartySetEntry(
-                                    example, net::SiteType::kAssociated, 0))));
-  EXPECT_THAT(FindEntriesAndWait({nonmember}), IsEmpty());
-
-  EXPECT_THAT(
-      FindEntriesAndWait({example, nonmember}),
-      UnorderedElementsAre(
-          Pair(example, net::FirstPartySetEntry(
-                            example, net::SiteType::kPrimary, absl::nullopt))));
-  EXPECT_THAT(FindEntriesAndWait({member1, nonmember}),
-              UnorderedElementsAre(
-                  Pair(member1, net::FirstPartySetEntry(
-                                    example, net::SiteType::kAssociated, 0))));
-
-  EXPECT_THAT(
-      FindEntriesAndWait({example, foo}),
-      UnorderedElementsAre(
-          Pair(example, net::FirstPartySetEntry(
-                            example, net::SiteType::kPrimary, absl::nullopt)),
-          Pair(foo, net::FirstPartySetEntry(foo, net::SiteType::kPrimary,
-                                            absl::nullopt))));
-  EXPECT_THAT(FindEntriesAndWait({member1, foo}),
-              UnorderedElementsAre(
-                  Pair(member1, net::FirstPartySetEntry(
-                                    example, net::SiteType::kAssociated, 0)),
-                  Pair(foo, net::FirstPartySetEntry(
-                                foo, net::SiteType::kPrimary, absl::nullopt))));
-  EXPECT_THAT(
-      FindEntriesAndWait({example, member2}),
-      UnorderedElementsAre(
-          Pair(example, net::FirstPartySetEntry(
-                            example, net::SiteType::kPrimary, absl::nullopt)),
-          Pair(member2,
-               net::FirstPartySetEntry(foo, net::SiteType::kAssociated, 0))));
-  EXPECT_THAT(FindEntriesAndWait({member1, member2}),
-              UnorderedElementsAre(
-                  Pair(member1, net::FirstPartySetEntry(
-                                    example, net::SiteType::kAssociated, 0)),
-                  Pair(member2, net::FirstPartySetEntry(
-                                    foo, net::SiteType::kAssociated, 0))));
-}
-
 class OverrideSetsFirstPartySetsManagerTest : public FirstPartySetsEnabledTest {
  public:
   OverrideSetsFirstPartySetsManagerTest() {
     net::SchemefulSite foo(GURL("https://foo.test"));
     net::SchemefulSite example_test(GURL("https://example.test"));
     net::SchemefulSite example_cctld(GURL("https://example.cctld"));
+    net::SchemefulSite member1(GURL("https://member1.test"));
+    net::SchemefulSite member2(GURL("https://member2.test"));
 
     SetCompleteSets(
         {
-            {net::SchemefulSite(GURL("https://member1.test")),
-             net::FirstPartySetEntry(example_test, net::SiteType::kAssociated,
-                                     0)},
-            {net::SchemefulSite(GURL("https://member2.test")),
-             net::FirstPartySetEntry(example_test, net::SiteType::kAssociated,
-                                     0)},
+            {member1, net::FirstPartySetEntry(example_test,
+                                              net::SiteType::kAssociated, 0)},
+            {member2, net::FirstPartySetEntry(example_test,
+                                              net::SiteType::kAssociated, 0)},
             // Below are the owner self mappings.
             {example_test,
              net::FirstPartySetEntry(example_test, net::SiteType::kPrimary,
@@ -844,9 +613,9 @@
          {net::FirstPartySetEntry(foo, net::SiteType::kPrimary,
                                   absl::nullopt)}},
         // Removed entry:
-        {net::SchemefulSite(GURL("https://member1.test")), absl::nullopt},
+        {member1, absl::nullopt},
         // Remapped entry:
-        {net::SchemefulSite(GURL("https://member2.test")),
+        {member2,
          {net::FirstPartySetEntry(foo, net::SiteType::kAssociated, 0)}},
         // Removed alias:
         {example_cctld, absl::nullopt},
@@ -854,32 +623,6 @@
   }
 };
 
-TEST_F(OverrideSetsFirstPartySetsManagerTest, FindEntries) {
-  net::SchemefulSite foo(GURL("https://foo.test"));
-  net::SchemefulSite example_test(GURL("https://example.test"));
-  net::SchemefulSite example_cctld(GURL("https://example.cctld"));
-  net::SchemefulSite member2(GURL("https://member2.test"));
-
-  EXPECT_THAT(FindEntriesAndWait({
-                  net::SchemefulSite(GURL("https://member1.test")),
-                  member2,
-                  foo,
-                  // No entry for example_cctld since it's been deleted in the
-                  // override, even though it's an alias and its canonical site
-                  // still has a valid entry.
-                  example_cctld,
-                  example_test,
-              }),
-              UnorderedElementsAre(
-                  Pair(foo, net::FirstPartySetEntry(
-                                foo, net::SiteType::kPrimary, absl::nullopt)),
-                  Pair(member2, net::FirstPartySetEntry(
-                                    foo, net::SiteType::kAssociated, 0)),
-                  Pair(example_test, net::FirstPartySetEntry(
-                                         example_test, net::SiteType::kPrimary,
-                                         absl::nullopt))));
-}
-
 TEST_F(OverrideSetsFirstPartySetsManagerTest, ComputeMetadata) {
   net::SchemefulSite example(GURL("https://example.test"));
   net::SchemefulSite foo(GURL("https://foo.test"));
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index cec7dbf..0a7bf4f2 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -227,6 +227,8 @@
     "ext/SkMemory_new_handler.cpp",
     "ext/benchmarking_canvas.cc",
     "ext/benchmarking_canvas.h",
+    "ext/cicp.cc",
+    "ext/cicp.h",
     "ext/convolver.cc",
     "ext/convolver.h",
     "ext/event_tracer_impl.cc",
@@ -244,6 +246,7 @@
     "ext/rgba_to_yuva.h",
     "ext/skcolorspace_primaries.cc",
     "ext/skcolorspace_primaries.h",
+    "ext/skcolorspace_trfn.h",
     "ext/skia_histogram.cc",
     "ext/skia_histogram.h",
     "ext/skia_memory_dump_provider.cc",
diff --git a/skia/ext/cicp.cc b/skia/ext/cicp.cc
new file mode 100644
index 0000000..7f43a34
--- /dev/null
+++ b/skia/ext/cicp.cc
@@ -0,0 +1,215 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "skia/ext/cicp.h"
+#include "skia/ext/skcolorspace_primaries.h"
+#include "skia/ext/skcolorspace_trfn.h"
+
+namespace skia {
+
+bool CICPGetPrimaries(uint8_t primaries, SkColorSpacePrimaries& sk_primaries) {
+  // Rec. ITU-T H.273, Table 2.
+  switch (primaries) {
+    case 0:
+      // Reserved.
+      break;
+    case 1:
+      sk_primaries = SkNamedPrimariesExt::kRec709;
+      return true;
+    case 2:
+      // Unspecified.
+      break;
+    case 3:
+      // Reserved.
+      break;
+    case 4:
+      sk_primaries = SkNamedPrimariesExt::kRec470SystemM;
+      return true;
+    case 5:
+      sk_primaries = SkNamedPrimariesExt::kRec470SystemBG;
+      return true;
+    case 6:
+      sk_primaries = SkNamedPrimariesExt::kRec601;
+      return true;
+    case 7:
+      sk_primaries = SkNamedPrimariesExt::kSMPTE_ST_240;
+      return true;
+    case 8:
+      sk_primaries = SkNamedPrimariesExt::kGenericFilm;
+      return true;
+    case 9:
+      sk_primaries = SkNamedPrimariesExt::kRec2020;
+      return true;
+    case 10:
+      sk_primaries = SkNamedPrimariesExt::kSMPTE_ST_428_1;
+      return true;
+    case 11:
+      sk_primaries = SkNamedPrimariesExt::kSMPTE_RP_431_2;
+      return true;
+    case 12:
+      sk_primaries = SkNamedPrimariesExt::kSMPTE_EG_432_1;
+      return true;
+    case 22:
+      sk_primaries = SkNamedPrimariesExt::kITU_T_H273_Value22;
+      return true;
+    default:
+      // Reserved.
+      break;
+  }
+  sk_primaries = SkNamedPrimariesExt::kInvalid;
+  return false;
+}
+
+bool CICPGetTransferFn(uint8_t transfer_characteristics,
+                       bool prefer_srgb,
+                       skcms_TransferFunction& trfn) {
+  // Rec. ITU-T H.273, Table 3.
+  switch (transfer_characteristics) {
+    case 0:
+      // Reserved.
+      break;
+    case 1:
+      trfn = prefer_srgb ? SkNamedTransferFnExt::kSRGB
+                         : SkNamedTransferFnExt::kRec709;
+      return true;
+    case 2:
+      // Unspecified.
+      break;
+    case 3:
+      // Reserved.
+      break;
+    case 4:
+      trfn = SkNamedTransferFnExt::kRec470SystemM;
+      return true;
+    case 5:
+      trfn = SkNamedTransferFnExt::kRec470SystemBG;
+      return true;
+    case 6:
+      trfn = prefer_srgb ? SkNamedTransferFnExt::kSRGB
+                         : SkNamedTransferFnExt::kRec601;
+      return true;
+    case 7:
+      trfn = SkNamedTransferFnExt::kSMPTE_ST_240;
+      return true;
+    case 8:
+      trfn = SkNamedTransferFn::kLinear;
+      return true;
+    case 9:
+      // Logarithmic transfer characteristic (100:1 range).
+      break;
+    case 10:
+      // Logarithmic transfer characteristic (100 * Sqrt( 10 ) : 1 range).
+      break;
+    case 11:
+      trfn = prefer_srgb ? SkNamedTransferFnExt::kSRGB
+                         : SkNamedTransferFnExt::kIEC61966_2_4;
+      break;
+    case 12:
+      // Rec. ITU-R BT.1361-0 extended colour gamut system (historical).
+      // Same as kRec709 on positive values, differs on negative values.
+      break;
+    case 13:
+      // IEC 61966-2-1.
+      trfn = SkNamedTransferFnExt::kSRGB;
+      return true;
+    case 14:
+      trfn = SkNamedTransferFnExt::kRec2020_10bit;
+      return true;
+    case 15:
+      trfn = SkNamedTransferFnExt::kRec2020_12bit;
+      return true;
+    case 16:
+      trfn = SkNamedTransferFn::kPQ;
+      return true;
+    case 17:
+      trfn = SkNamedTransferFnExt::kSMPTE_ST_428_1;
+      return true;
+    case 18:
+      trfn = SkNamedTransferFn::kHLG;
+      return true;
+    default:
+      // 19-255 Reserved.
+      break;
+  }
+
+  trfn = SkNamedTransferFnExt::kInvalid;
+  return false;
+}
+
+bool CICPGetSkYUVColorSpace(uint8_t matrix_coefficients,
+                            uint8_t full_range_flag,
+                            uint8_t bits_per_color,
+                            SkYUVColorSpace& yuv_color_space) {
+  // Rec. ITU-T H.273, Table 4.
+  switch (matrix_coefficients) {
+    case 0:
+      // The identity matrix.
+      if (full_range_flag) {
+        yuv_color_space = kIdentity_SkYUVColorSpace;
+        return true;
+      }
+      break;
+    case 1:
+      // Rec. ITU-R BT.709-6.
+      yuv_color_space = full_range_flag ? kRec709_Full_SkYUVColorSpace
+                                        : kRec709_Limited_SkYUVColorSpace;
+      return true;
+    case 5:
+      // Rec. ITU-R BT.470-6 System B, G (historical).
+    case 6:
+      // Rec. ITU-R BT.601-7.
+      yuv_color_space = full_range_flag ? kJPEG_SkYUVColorSpace
+                                        : kRec601_Limited_SkYUVColorSpace;
+      return true;
+    case 9:
+      // Rec. ITU-R BT.2020-2 (non-constant luminance)
+    case 10:
+      // Rec. ITU-R BT.2020-2 (constant luminance)
+      switch (bits_per_color) {
+        case 8:
+          yuv_color_space = full_range_flag
+                                ? kBT2020_8bit_Full_SkYUVColorSpace
+                                : kBT2020_8bit_Limited_SkYUVColorSpace;
+          return true;
+        case 10:
+          yuv_color_space = full_range_flag
+                                ? kBT2020_10bit_Full_SkYUVColorSpace
+                                : kBT2020_10bit_Limited_SkYUVColorSpace;
+          return true;
+        case 12:
+          yuv_color_space = full_range_flag
+                                ? kBT2020_12bit_Full_SkYUVColorSpace
+                                : kBT2020_12bit_Limited_SkYUVColorSpace;
+          return true;
+        default:
+          break;
+      }
+      break;
+    case 2:
+      // Unspecified.
+    case 3:
+      // Reserved.
+    case 4:
+      // United States Federal Communications Commission.
+    case 7:
+      // SMPTE ST 240.
+    case 8:
+      // YCgCo
+    case 11:
+      // YDZDX
+    case 12:
+      // Chromaticity-derived non-constant luminance system.
+    case 13:
+      // Chromaticity-derived constant luminance system.
+    case 14:
+      // ICTCP
+    default:
+      // Reserved.
+      break;
+  }
+  yuv_color_space = kIdentity_SkYUVColorSpace;
+  return false;
+}
+
+}  // namespace skia
diff --git a/skia/ext/cicp.h b/skia/ext/cicp.h
new file mode 100644
index 0000000..8323cbce
--- /dev/null
+++ b/skia/ext/cicp.h
@@ -0,0 +1,42 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SKIA_EXT_CICP_H_
+#define SKIA_EXT_CICP_H_
+
+#include <stdint.h>
+
+#include "third_party/skia/include/core/SkColorSpace.h"
+#include "third_party/skia/include/core/SkImageInfo.h"
+
+namespace skia {
+
+// Convert from a CICP primary value listed in Rec. ITU-T H.273, Table 2 to an
+// SkColorSpacePrimaries. Return true if `primaries` is valid. All valid values
+// are supported.
+SK_API bool CICPGetPrimaries(uint8_t primaries,
+                             SkColorSpacePrimaries& sk_primaries);
+
+// Convert from a CICP transfer value listed in Rec. ITU-T H.273, Table 3 to an
+// skcms_TransferFunction. Return true if `transfer_characteristics` is valid
+// and can be represented using an skcms_TransferFunction (several valid values
+// cannot). If `prefer_srgb` is set to true, then use the sRGB transfer function
+// for all Rec709-like content.
+SK_API bool CICPGetTransferFn(uint8_t transfer_characteristics,
+                              bool prefer_srgb,
+                              skcms_TransferFunction& sk_trfn);
+
+// Convert from a CICP matrix value listed in Rec. ITU-T H.273, Table 4 to an
+// SkYUVColorSpace. The result depends on full or limited range as well as
+// the number of bits per color. Return true if the combination of
+// `matrix_coefficients`, `full_range_flag`, and `bits_per_color` is valid and
+// supported (several valid combinations are not supported).
+SK_API bool CICPGetSkYUVColorSpace(uint8_t matrix_coefficients,
+                                   uint8_t full_range_flag,
+                                   uint8_t bits_per_color,
+                                   SkYUVColorSpace& yuv_color_space);
+
+}  // namespace skia
+
+#endif  // SKIA_EXT_CICP_H_
diff --git a/skia/ext/skcolorspace_primaries.cc b/skia/ext/skcolorspace_primaries.cc
index c8e6f0f..1b4fb02a 100644
--- a/skia/ext/skcolorspace_primaries.cc
+++ b/skia/ext/skcolorspace_primaries.cc
@@ -22,17 +22,17 @@
 
 std::string SkColorSpacePrimariesToString(
     const SkColorSpacePrimaries& primaries) {
-  if (primaries == kSkColorSpacePrimariesZero)
+  if (primaries == SkNamedPrimariesExt::kInvalid)
     return "invalid";
 
   std::stringstream ss;
   ss << std::fixed << std::setprecision(4);
   ss << "{";
-  if (primaries == kSkColorSpacePrimariesSRGB)
+  if (primaries == SkNamedPrimariesExt::kSRGB)
     ss << "name:'srgb', ";
-  else if (primaries == kSkColorSpacePrimariesP3)
+  else if (primaries == SkNamedPrimariesExt::kP3)
     ss << "name:'p3', ";
-  else if (primaries == kSkColorSpacePrimariesRec2020)
+  else if (primaries == SkNamedPrimariesExt::kRec2020)
     ss << "name:'rec2020', ";
   ss << "r:[" << primaries.fRX << ", " << primaries.fRY << "], ";
   ss << "g:[" << primaries.fGX << ", " << primaries.fGY << "], ";
@@ -68,26 +68,4 @@
   return primaries;
 }
 
-SkColorSpacePrimaries kSkColorSpacePrimariesZero = {0};
-
-SkColorSpacePrimaries kSkColorSpacePrimariesSRGB = {
-    0.640f, 0.330f, 0.300f, 0.600f, 0.150f, 0.060f, 0.3127f, 0.3290f,
-};
-
-SkColorSpacePrimaries kSkColorSpacePrimariesP3 = {
-    0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f, 0.3127f, 0.3290f,
-};
-
-SkColorSpacePrimaries kSkColorSpacePrimariesRec2020 = {
-    0.708f, 0.292f, 0.170f, 0.797f, 0.131f, 0.046f, 0.3127f, 0.3290f,
-};
-
-SkColorSpacePrimaries kSkColorSpacePrimariesProPhotoD50 = {
-    0.7347f, 0.2653f, 0.1596f, 0.8404f, 0.0366f, 0.0001f, 0.34567f, 0.35850f,
-};
-
-SkColorSpacePrimaries kSkColorSpacePrimariesWideGamutColorSpin = {
-    0.01f, 0.98f, 0.01f, 0.01f, 0.98f, 0.01f, 0.3127f, 0.3290f,
-};
-
 }  // namespace skia
diff --git a/skia/ext/skcolorspace_primaries.h b/skia/ext/skcolorspace_primaries.h
index faeba94..fba487d 100644
--- a/skia/ext/skcolorspace_primaries.h
+++ b/skia/ext/skcolorspace_primaries.h
@@ -27,25 +27,103 @@
 SK_API SkColorSpacePrimaries
 GetD65PrimariesFromToXYZD50Matrix(const skcms_Matrix3x3& m);
 
-// Primaries initialized to zero (an invalid value).
-extern SK_API SkColorSpacePrimaries kSkColorSpacePrimariesZero;
+}  // namespace skia
 
-// The sRGB or BT709 primaries.
-extern SK_API SkColorSpacePrimaries kSkColorSpacePrimariesSRGB;
+namespace SkNamedPrimariesExt {
 
-// P3 primaries.
-extern SK_API SkColorSpacePrimaries kSkColorSpacePrimariesP3;
+////////////////////////////////////////////////////////////////////////////////
+// Color primaries defined by ITU-T H.273, table 2. Names are given by the first
+// specification referenced in the value's row.
 
-// Rec2020 primaries.
-extern SK_API SkColorSpacePrimaries kSkColorSpacePrimariesRec2020;
+// Rec. ITU-R BT.709-6, value 1.
+static constexpr SkColorSpacePrimaries kRec709 = {
+    0.64f, 0.33f, 0.3f, 0.6f, 0.15f, 0.06f, 0.3127f, 0.329f};
 
-// ProPhoto primaries (this has a D50 white point).
-extern SK_API SkColorSpacePrimaries kSkColorSpacePrimariesProPhotoD50;
+// Rec. ITU-R BT.470-6 System M (historical), value 4.
+static constexpr SkColorSpacePrimaries kRec470SystemM = {
+    0.67f, 0.33f, 0.21f, 0.71f, 0.14f, 0.08f, 0.31f, 0.316f};
+
+// Rec. ITU-R BT.470-6 System B, G (historical), value 5.
+static constexpr SkColorSpacePrimaries kRec470SystemBG = {
+    0.64f, 0.33f, 0.29f, 0.60f, 0.15f, 0.06f, 0.3127f, 0.3290f};
+
+// Rec. ITU-R BT.601-7 525, value 6.
+static constexpr SkColorSpacePrimaries kRec601 = {
+    0.630f, 0.340f, 0.310f, 0.595f, 0.155f, 0.070f, 0.3127f, 0.3290f};
+
+// SMPTE ST 240, value 7 (functionally the same as value 6).
+static constexpr SkColorSpacePrimaries kSMPTE_ST_240 = kRec601;
+
+// Generic film (colour filters using Illuminant C), value 8.
+static constexpr SkColorSpacePrimaries kGenericFilm = {
+    0.681f, 0.319f, 0.243f, 0.692f, 0.145f, 0.049f, 0.310f, 0.316f};
+
+// Rec. ITU-R BT.2020-2, value 9.
+static constexpr SkColorSpacePrimaries kRec2020{
+    0.708f, 0.292f, 0.170f, 0.797f, 0.131f, 0.046f, 0.3127f, 0.3290f};
+
+// SMPTE ST 428-1, value 10.
+static constexpr SkColorSpacePrimaries kSMPTE_ST_428_1 = {
+    1.f, 0.f, 0.f, 1.f, 0.f, 0.f, 1.f / 3.f, 1.f / 3.f};
+
+// SMPTE RP 431-2, value 11.
+static constexpr SkColorSpacePrimaries kSMPTE_RP_431_2 = {
+    0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f, 0.314f, 0.351f};
+
+// SMPTE EG 432-1, value 12.
+static constexpr SkColorSpacePrimaries kSMPTE_EG_432_1 = {
+    0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f, 0.3127f, 0.3290f};
+
+// No corresponding industry specification identified, value 22.
+// This is sometimes referred to as EBU 3213-E, but that document doesn't
+// specify these values.
+static constexpr SkColorSpacePrimaries kITU_T_H273_Value22 = {
+    0.630f, 0.340f, 0.295f, 0.605f, 0.155f, 0.077f, 0.3127f, 0.3290f};
+
+////////////////////////////////////////////////////////////////////////////////
+// CSS Color Level 4 predefined and xyz color spaces.
+
+// 'srgb'
+static constexpr SkColorSpacePrimaries kSRGB = kRec709;
+
+// 'display-p3' (and also 'p3' as a color gamut).
+static constexpr SkColorSpacePrimaries kP3 = kSMPTE_EG_432_1;
+
+// 'a98-rgb'
+static constexpr SkColorSpacePrimaries kA98RGB = {
+    0.64f, 0.33f, 0.21f, 0.71f, 0.15f, 0.06f, 0.3127f, 0.3290f};
+
+// 'prophoto-rgb'
+static constexpr SkColorSpacePrimaries kProPhotoRGB = {
+    0.7347f, 0.2653f, 0.1596f, 0.8404f, 0.0366f, 0.0001f, 0.34567f, 0.35850f};
+
+// 'rec2020' (as both a predefined color space and color gamut).
+// The value kRec2020 is already defined above.
+
+// 'xyzd50'
+static constexpr SkColorSpacePrimaries kXYZD50 = {
+    1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.34567f, 0.35850f};
+
+// 'xyz' and 'xyzd65'
+static constexpr SkColorSpacePrimaries kXYZD65 = {1.0f, 0.0f, 0.0f,    1.0f,
+                                                  0.0f, 0.0f, 0.3127f, 0.3290f};
+
+////////////////////////////////////////////////////////////////////////////////
+// Additional helper color primaries.
+
+// Invalid primaries, initialized to zero.
+static constexpr SkColorSpacePrimaries kInvalid = {0};
+
+// The GenericRGB space on macOS.
+static constexpr SkColorSpacePrimaries kAppleGenericRGB = {
+    0.63002f, 0.34000f, 0.29505f, 0.60498f,
+    0.15501f, 0.07701f, 0.3127f,  0.3290f};
 
 // Primaries where the colors are rotated and the gamut is huge. Good for
 // testing.
-extern SK_API SkColorSpacePrimaries kSkColorSpacePrimariesWideGamutColorSpin;
+static constexpr SkColorSpacePrimaries kWideGamutColorSpin = {
+    0.01f, 0.98f, 0.01f, 0.01f, 0.98f, 0.01f, 0.3127f, 0.3290f};
 
-}  // namespace skia
+}  // namespace SkNamedPrimariesExt
 
 #endif  // SKIA_EXT_SKCOLORSPACE_PRIMARIES_H_
diff --git a/skia/ext/skcolorspace_primaries_unittest.cc b/skia/ext/skcolorspace_primaries_unittest.cc
index 7e3744a..6edff75 100644
--- a/skia/ext/skcolorspace_primaries_unittest.cc
+++ b/skia/ext/skcolorspace_primaries_unittest.cc
@@ -13,7 +13,7 @@
 
 TEST(SkiaUtils, PrimariesD65) {
   // DCI P3 (D65)
-  const auto p3 = kSkColorSpacePrimariesP3;
+  const auto p3 = SkNamedPrimariesExt::kP3;
 
   skcms_Matrix3x3 matrix;
   EXPECT_TRUE(p3.toXYZD50(&matrix));
@@ -32,8 +32,8 @@
 }
 
 TEST(SkiaUtils, PrimariesD50) {
-  // ProPhoto (D50)
-  const auto pro_photo = kSkColorSpacePrimariesProPhotoD50;
+  // ProPhoto (which has a D50 white point)
+  const auto pro_photo = SkNamedPrimariesExt::kProPhotoRGB;
 
   // Convert primaries to a matrix.
   skcms_Matrix3x3 pro_photo_matrix;
diff --git a/skia/ext/skcolorspace_trfn.h b/skia/ext/skcolorspace_trfn.h
new file mode 100644
index 0000000..99581ca
--- /dev/null
+++ b/skia/ext/skcolorspace_trfn.h
@@ -0,0 +1,90 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SKIA_EXT_SKCOLORSPACE_TRFN_H_
+#define SKIA_EXT_SKCOLORSPACE_TRFN_H_
+
+#include "third_party/skia/include/core/SkColorSpace.h"
+
+namespace SkNamedTransferFnExt {
+
+////////////////////////////////////////////////////////////////////////////////
+// Color primaries defined by ITU-T H.273, table 3. Names are given by the first
+// specification referenced in the value's row.
+
+// Rec. ITU-R BT.709-6, value 1.
+static constexpr skcms_TransferFunction kRec709 = {2.222222222222f,
+                                                   0.909672415686f,
+                                                   0.090327584314f,
+                                                   0.222222222222f,
+                                                   0.081242858299f,
+                                                   0.f,
+                                                   0.f};
+
+// Rec. ITU-R BT.470-6 System M (historical) assumed display gamma 2.2, value 4.
+static constexpr skcms_TransferFunction kRec470SystemM = {2.2f, 1.f};
+
+// Rec. ITU-R BT.470-6 System B, G (historical) assumed display gamma 2.8,
+// value 5.
+static constexpr skcms_TransferFunction kRec470SystemBG = {2.8f, 1.f};
+
+// Rec. ITU-R BT.601-7, same as kRec709, value 6.
+static constexpr skcms_TransferFunction kRec601 = kRec709;
+
+// SMPTE ST 240, value 7.
+static constexpr skcms_TransferFunction kSMPTE_ST_240 = {2.222222222222f,
+                                                         0.899626676224f,
+                                                         0.100373323776f,
+                                                         0.25f,
+                                                         0.091286342118f,
+                                                         0.f,
+                                                         0.f};
+
+// IEC 61966-2-4, value 11, same as kRec709 (but is explicitly extended).
+static constexpr skcms_TransferFunction kIEC61966_2_4 = kRec709;
+
+// IEC 61966-2-1 sRGB, value 13. This is almost equal to
+// SkNamedTransferFnExt::kSRGB. The differences are rounding errors that
+// cause test failures (and should be unified).
+static constexpr skcms_TransferFunction kIEC61966_2_1 = {
+    2.4, 0.947867345704f, 0.052132654296f, 0.077399380805f, 0.040449937172f};
+
+// Rec. ITU-R BT.2020-2 (10-bit system), value 14.
+static constexpr skcms_TransferFunction kRec2020_10bit = kRec709;
+
+// Rec. ITU-R BT.2020-2 (12-bit system), value 15.
+static constexpr skcms_TransferFunction kRec2020_12bit = kRec709;
+
+// SMPTE ST 428-1, value 17.
+static constexpr skcms_TransferFunction kSMPTE_ST_428_1 = {2.6f,
+                                                           1.034080527699f};
+
+////////////////////////////////////////////////////////////////////////////////
+// CSS Color Level 4 predefined color spaces.
+
+// 'srgb', 'display-p3'
+static constexpr skcms_TransferFunction kSRGB = kIEC61966_2_1;
+
+// 'a98-rgb'
+static constexpr skcms_TransferFunction kA98RGB = {2.2f, 1.};
+
+// 'prophoto-rgb'
+static constexpr skcms_TransferFunction kProPhotoRGB = {1.8f, 1.};
+
+// 'rec2020' uses the same transfer function as kRec709.
+static constexpr skcms_TransferFunction kRec2020 = kRec709;
+
+////////////////////////////////////////////////////////////////////////////////
+// Additional helper transfer functions.
+
+// Invalid primaries, initialized to zero.
+static constexpr skcms_TransferFunction kInvalid = {0};
+
+// The interpretation of kRec709 that is produced by accelerated video decode
+// on macOS.
+static constexpr skcms_TransferFunction kRec709Apple = {1.961f, 1.};
+
+}  // namespace SkNamedTransferFnExt
+
+#endif  // SKIA_EXT_SKCOLORSPACE_TRFN_H_
diff --git a/testing/buildbot/README.md b/testing/buildbot/README.md
index f76cd21..22611ac 100644
--- a/testing/buildbot/README.md
+++ b/testing/buildbot/README.md
@@ -103,7 +103,7 @@
 that the builder pool has enough capacity to handle that increase as well.
 
 Additionally, if your change is expected to increase utilization in the testing
-pools by any more than 10 VMs or 100 CPU cores, it will need to be approved via
+pools by any more than 5 VMs or 50 CPU cores, it will need to be approved via
 a resource request. (Consult anyone in //infra/OWNERS if you need help
 calculating the resource usage of a test change.) See http://go/i-need-hw
 for the steps involved in getting the approval.
diff --git a/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter b/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter
index e479e88..ed8f662 100644
--- a/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter
+++ b/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter
@@ -4,6 +4,7 @@
 *Magn*.*
 AccessibilityExtension*
 Autoclick*
+AshTtsApiTest*
 BrowserAppShelfControllerBrowserTest*
 ChromeVox*
 DemoAshRequiresLacrosTest*
diff --git a/testing/scripts/finch.gni b/testing/scripts/finch.gni
index 7020269..5955c6e8 100644
--- a/testing/scripts/finch.gni
+++ b/testing/scripts/finch.gni
@@ -16,6 +16,7 @@
       rebase_path(root_build_dir, root_build_dir) + "/apks/" +
           invoker.browser_apk,
     ]
+
     if (defined(invoker.webview_provider_apk)) {
       args += [
         "--webview-provider-apk",
@@ -24,6 +25,13 @@
       ]
     }
 
+    if (defined(invoker.webview_installer_tool)) {
+      args += [
+        "--webview-installer-tool",
+        rebase_path(invoker.webview_installer_tool, root_build_dir),
+      ]
+    }
+
     data = [
       "//build/android/",
       "//build/skia_gold_common/",
@@ -43,6 +51,7 @@
     if (defined(invoker.data)) {
       data += invoker.data
     }
+
     if (defined(invoker.data_deps)) {
       data_deps += invoker.data_deps
     }
diff --git a/testing/scripts/run_finch_smoke_tests_android.py b/testing/scripts/run_finch_smoke_tests_android.py
index 88f5c9e..a76d2e0 100755
--- a/testing/scripts/run_finch_smoke_tests_android.py
+++ b/testing/scripts/run_finch_smoke_tests_android.py
@@ -11,6 +11,7 @@
 import posixpath
 import re
 import shutil
+import subprocess
 import sys
 import tempfile
 import time
@@ -276,6 +277,9 @@
     parser.add_argument('--browser-activity-name',
                         action='store',
                         help='Browser activity name')
+    parser.add_argument('--use-webview-installer-tool',
+                        action='store_true',
+                        help='Use the WebView installer tool.')
     parser.add_argument('--fake-variations-channel',
                         action='store',
                         default='stable',
@@ -292,8 +296,13 @@
 
   def add_extra_arguments(self, parser):
     super(FinchTestCase, self).add_extra_arguments(parser)
+    self.add_product_specific_argument_groups(parser)
     self.add_common_arguments(parser)
 
+  @classmethod
+  def add_product_specific_argument_groups(cls, _):
+    pass
+
   def _compare_screenshots_with_baselines(self, all_pixel_tests_results_dict):
     """Compare pixel tests screenshots with baselines stored in skia gold
 
@@ -654,6 +663,21 @@
                         'variations_smoke_test_data',
                         'webview_test_seed')
 
+  @classmethod
+  def add_product_specific_argument_groups(cls, parser):
+    installer_tool_group = parser.add_argument_group(
+      'WebView Installer tool arguments')
+    installer_tool_group.add_argument(
+      '--webview-installer-tool', type=os.path.realpath,
+      help='Path to the WebView installer tool')
+    installer_tool_group.add_argument(
+      '--chrome-version', '-V', type=str,
+      help='Chrome version to install with the WebView installer tool')
+    installer_tool_group.add_argument(
+      '--channel', '-c', help='Channel build of WebView to install')
+    installer_tool_group.add_argument(
+      '--milestone', '-M', help='Milestone build of WebView to install')
+
   def new_seed_downloaded(self):
     """Checks if a new seed was downloaded
 
@@ -689,10 +713,49 @@
   @contextlib.contextmanager
   def install_apks(self):
     """Install apks for testing"""
-    with super(WebViewFinchTestCase, self).install_apks(), \
-      webview_app.UseWebViewProvider(self._device,
-                                     self.options.webview_provider_apk):
+    with super(WebViewFinchTestCase, self).install_apks():
+      if self.options.use_webview_installer_tool:
+        install_webview = self._install_webview_with_tool()
+      else:
+        install_webview = webview_app.UseWebViewProvider(
+          self._device, self.options.webview_provider_apk)
+
+      with install_webview:
+        yield
+
+  @contextlib.contextmanager
+  def _install_webview_with_tool(self):
+    """Install WebView with the WebView installer tool"""
+    original_webview_provider = (
+        self._device.GetWebViewUpdateServiceDump()['CurrentWebViewPackage'])
+    current_webview_provider = None
+
+    try:
+      cmd = [self.options.webview_installer_tool, '-vvv',
+             '--product', self.product_name()]
+      assert self.options.chrome_version or self.options.milestone, (
+        'The --chrome-version or --milestone arguments must be used when '
+        'installing WebView with the WebView installer tool')
+
+      if self.options.chrome_version:
+        cmd.extend(['--chrome-version', self.options.chrome_version])
+      else:
+        cmd.extend(['--milestone', self.options.milestone])
+
+      if self.options.channel:
+        cmd.extend(['-c', self.options.channel])
+      exit_code = subprocess.call(cmd)
+      assert exit_code == 0, (
+          'The WebView installer tool failed to install WebView')
+
+      current_webview_provider = (
+        self._device.GetWebViewUpdateServiceDump()['CurrentWebViewPackage'])
       yield
+    finally:
+      self._device.SetWebViewImplementation(original_webview_provider)
+      # Restore the original webview provider
+      if current_webview_provider:
+        self._device.Uninstall(current_webview_provider)
 
   def install_seed(self):
     """Install finch seed for testing
@@ -783,6 +846,10 @@
   script_common.AddDeviceArguments(parser)
   script_common.AddEnvironmentArguments(parser)
   logging_common.AddLoggingArguments(parser)
+
+  for test_class in TEST_CASES.values():
+    test_class.add_product_specific_argument_groups(parser)
+
   options, _ = parser.parse_known_args(args)
 
   with get_device(options) as device, \
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index f125e8d..b2c95e20 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -3918,6 +3918,22 @@
             ]
         }
     ],
+    "DisableUrgentPageDiscarding": [
+        {
+            "platforms": [
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Disabled",
+                    "disable_features": [
+                        "UrgentPageDiscarding"
+                    ]
+                }
+            ]
+        }
+    ],
     "DiscardableMemoryExperiments": [
         {
             "platforms": [
@@ -4134,7 +4150,6 @@
                         "DragAndDropMovementThresholdDipParam": "60"
                     },
                     "enable_features": [
-                        "ContextMenuPopupStyle",
                         "TouchDragAndContextMenu"
                     ]
                 }
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def
index f5ad8c0..fbeec82 100644
--- a/third_party/abseil-cpp/symbols_arm64_dbg.def
+++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -473,7 +473,7 @@
     ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z
     ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z
     ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@YA?AU?$__allocation_result@PEAVFormatArgImpl@str_format_internal@absl@@@01@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@_K@Z
-    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
+    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
     ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
@@ -623,7 +623,7 @@
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@?$_IterOps@U_ClassicAlgPolicy@Cr@std@@@Cr@std@@SAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J_JX@Cr@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
     ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_K_KX@Cr@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_K@Z
-    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
+    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ??$bit_cast@_J_K$0A@@absl@@YA_JAEB_K@Z
     ??$bit_cast@_K_J$0A@@absl@@YA_KAEB_J@Z
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def
index 8aab4f3..72369ec5 100644
--- a/third_party/abseil-cpp/symbols_arm64_rel.def
+++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -93,7 +93,7 @@
     ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAAX_K@Z
     ??$__upper_bound@U_ClassicAlgPolicy@Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z
-    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
+    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ??$construct@UPayload@status_internal@absl@@AEBU123@@?$allocator@UPayload@status_internal@absl@@@Cr@std@@QEAAXPEAUPayload@status_internal@absl@@AEBU345@@Z
     ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def
index 1558ba9..8cc2702 100644
--- a/third_party/abseil-cpp/symbols_x64_dbg.def
+++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -473,7 +473,7 @@
     ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z
     ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z
     ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@YA?AU?$__allocation_result@PEAVFormatArgImpl@str_format_internal@absl@@@01@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@_K@Z
-    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
+    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
     ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
@@ -623,7 +623,7 @@
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@?$_IterOps@U_ClassicAlgPolicy@Cr@std@@@Cr@std@@SAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J_JX@Cr@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
     ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_K_KX@Cr@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_K@Z
-    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
+    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ??$bit_cast@MI$0A@@absl@@YAMAEBI@Z
     ??$bit_cast@N_K$0A@@absl@@YANAEB_K@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def
index 3d03208..ebd754e0 100644
--- a/third_party/abseil-cpp/symbols_x64_rel.def
+++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -84,7 +84,7 @@
     ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAAX_K@Z
     ??$__upper_bound@U_ClassicAlgPolicy@Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z
-    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
+    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ??$construct@UPayload@status_internal@absl@@AEBU123@@?$allocator@UPayload@status_internal@absl@@@Cr@std@@QEAAXPEAUPayload@status_internal@absl@@AEBU345@@Z
     ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def
index c2b600e8..595b48c 100644
--- a/third_party/abseil-cpp/symbols_x64_rel_asan.def
+++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -77,13 +77,13 @@
     ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@Vstring_view@0@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@Cr@std@@@3@@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@2@@Z
-    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
+    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
     ??$__construct_node_hash@AEBUpiecewise_construct_t@Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAAX_K@Z
     ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PEAX@Cr@std@@@Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AEAAX_K@Z
     ??$__upper_bound@U_ClassicAlgPolicy@Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z
-    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
+    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ??$construct@UPayload@status_internal@absl@@AEBU123@@?$allocator@UPayload@status_internal@absl@@@Cr@std@@QEAAXPEAUPayload@status_internal@absl@@AEBU345@@Z
     ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QEAA?AV?$__wrap_iter@PEAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PEBUTransition@cctz@time_internal@absl@@@12@@Z
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def
index 4b7b231..3e14dd6 100644
--- a/third_party/abseil-cpp/symbols_x86_dbg.def
+++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -469,7 +469,7 @@
     ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YA?AU?$__allocation_result@PAUTransitionType@cctz@time_internal@absl@@@01@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@I@Z
     ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@Cr@std@@@Cr@std@@YA?AU?$__allocation_result@PAUViableSubstitution@strings_internal@absl@@@01@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@I@Z
     ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@YA?AU?$__allocation_result@PAVFormatArgImpl@str_format_internal@absl@@@01@AAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@I@Z
-    ??$__construct_at_end@PBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AAEXPBVFormatArgImpl@str_format_internal@absl@@0I@Z
+    ??$__construct_at_end@PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@AAEXPBVFormatArgImpl@str_format_internal@absl@@0I@Z
     ??$__construct_at_end@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z
@@ -619,7 +619,7 @@
     ??$advance@PBUTransition@cctz@time_internal@absl@@H@?$_IterOps@U_ClassicAlgPolicy@Cr@std@@@Cr@std@@SAXAAPBUTransition@cctz@time_internal@absl@@H@Z
     ??$advance@PBUTransition@cctz@time_internal@absl@@HHX@Cr@std@@YAXAAPBUTransition@cctz@time_internal@absl@@H@Z
     ??$advance@PBVFormatArgImpl@str_format_internal@absl@@IIX@Cr@std@@YAXAAPBVFormatArgImpl@str_format_internal@absl@@I@Z
-    ??$assign@PBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QAEXPBVFormatArgImpl@str_format_internal@absl@@0@Z
+    ??$assign@PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QAEXPBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@optional_internal@absl@@IAEX$$QAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ??$bit_cast@_J_K$0A@@absl@@YA_JAB_K@Z
     ??$bit_cast@_K_J$0A@@absl@@YA_KAB_J@Z
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def
index 94f5d1b..1026820 100644
--- a/third_party/abseil-cpp/symbols_x86_rel.def
+++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -90,7 +90,7 @@
     ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@PAX@Cr@std@@@Cr@std@@_N@12@ABV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@23@@Cr@std@@AAEXI@Z
     ??$__upper_bound@U_ClassicAlgPolicy@Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PBU5678@PBU5678@U5678@U__identity@23@@Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@$$QAUByCivilTime@2345@$$QAU__identity@01@@Z
-    ??$assign@PBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QAEXPBVFormatArgImpl@str_format_internal@absl@@0@Z
+    ??$assign@PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@Cr@std@@@Cr@std@@QAEXPBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@optional_internal@absl@@IAEX$$QAV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@@Z
     ??$construct@UPayload@status_internal@absl@@ABU123@@?$allocator@UPayload@status_internal@absl@@@Cr@std@@QAEXPAUPayload@status_internal@absl@@ABU345@@Z
     ??$emplace@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@QAE?AV?$__wrap_iter@PAUTransition@cctz@time_internal@absl@@@12@V?$__wrap_iter@PBUTransition@cctz@time_internal@absl@@@12@@Z
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index a38f5be..c2caf8c 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -3617,7 +3617,7 @@
   kParentOfDisabledFormControlRespondsToMouseEvents = 4296,
   kUnhandledExceptionCountInMainThread = 4297,
   kUnhandledExceptionCountInWorker = 4298,
-  kWebCodecsImageDecoderPremultiplyAlphaDeprecation = 4299,
+  kOBSOLETE_WebCodecsImageDecoderPremultiplyAlphaDeprecation = 4299,
   kCookieDomainNonASCII = 4300,
   kClientHintsMetaEquivDelegateCH = 4301,
   kExpectCTHeader = 4302,
@@ -3675,6 +3675,9 @@
   kV8AsyncStackTaggingCreateTaskCall = 4354,
   kWebkitBoxWithoutWebkitLineClamp = 4355,
   kDataUrlInSvgUse = 4356,
+  kWebAuthnConditionalUiGet = 4357,
+  kWebAuthnConditionalUiGetSuccess = 4358,
+  kWebAuthnRkRequiredCreationSuccess = 4359,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/renderer/core/animation/view_timeline.cc b/third_party/blink/renderer/core/animation/view_timeline.cc
index 820e159..c3405a0 100644
--- a/third_party/blink/renderer/core/animation/view_timeline.cc
+++ b/third_party/blink/renderer/core/animation/view_timeline.cc
@@ -100,10 +100,10 @@
   double viewport_size = 0;
   if (physical_orientation == kHorizontalScroll) {
     target_size = layout_box->Size().Width().ToDouble();
-    viewport_size = scrollable_area->VisibleScrollSnapportRect().Width();
+    viewport_size = scrollable_area->LayoutContentRect().Width();
   } else {
     target_size = layout_box->Size().Height().ToDouble();
-    viewport_size = scrollable_area->VisibleScrollSnapportRect().Height();
+    viewport_size = scrollable_area->LayoutContentRect().Height();
   }
 
   // Note that the end_side_inset is used to adjust the start offset,
diff --git a/third_party/blink/renderer/core/events/mouse_event.cc b/third_party/blink/renderer/core/events/mouse_event.cc
index 53205d8..f4dd42f8 100644
--- a/third_party/blink/renderer/core/events/mouse_event.cc
+++ b/third_party/blink/renderer/core/events/mouse_event.cc
@@ -50,13 +50,12 @@
 
 namespace {
 
-float PageZoomFactor(const UIEvent* event) {
-  auto* local_dom_window = DynamicTo<LocalDOMWindow>(event->view());
+float PageZoomFactor(const LocalDOMWindow* local_dom_window) {
   if (!local_dom_window)
-    return 1;
+    return 1.f;
   LocalFrame* frame = local_dom_window->GetFrame();
   if (!frame)
-    return 1;
+    return 1.f;
   return frame->PageZoomFactor();
 }
 
@@ -98,12 +97,25 @@
 MouseEvent* MouseEvent::Create(ScriptState* script_state,
                                const AtomicString& type,
                                const MouseEventInit* initializer) {
-  if (script_state && script_state->World().IsIsolatedWorld()) {
-    UIEventWithKeyState::DidCreateEventInIsolatedWorld(
-        initializer->ctrlKey(), initializer->altKey(), initializer->shiftKey(),
-        initializer->metaKey());
+  LocalDOMWindow* fallback_dom_window = nullptr;
+  if (script_state) {
+    if (script_state->World().IsIsolatedWorld()) {
+      UIEventWithKeyState::DidCreateEventInIsolatedWorld(
+          initializer->ctrlKey(), initializer->altKey(),
+          initializer->shiftKey(), initializer->metaKey());
+    }
+    // If we don't have a view, we'll have to get a fallback dom window in
+    // order to properly account for device scale factor.
+    if (!initializer || !initializer->view()) {
+      if (auto* execution_context = ExecutionContext::From(script_state);
+          execution_context && execution_context->IsWindow()) {
+        fallback_dom_window = static_cast<LocalDOMWindow*>(execution_context);
+      }
+    }
   }
-  return MakeGarbageCollected<MouseEvent>(type, initializer);
+  return MakeGarbageCollected<MouseEvent>(
+      type, initializer, base::TimeTicks::Now(), kRealOrIndistinguishable,
+      kMenuSourceNone, fallback_dom_window);
 }
 
 MouseEvent* MouseEvent::Create(const AtomicString& event_type,
@@ -127,7 +139,8 @@
                        const MouseEventInit* initializer,
                        base::TimeTicks platform_time_stamp,
                        SyntheticEventType synthetic_event_type,
-                       WebMenuSourceType menu_source_type)
+                       WebMenuSourceType menu_source_type,
+                       LocalDOMWindow* fallback_dom_window)
     : UIEventWithKeyState(event_type, initializer, platform_time_stamp),
       screen_x_(initializer->screenX()),
       screen_y_(initializer->screenY()),
@@ -140,29 +153,36 @@
       related_target_(initializer->relatedTarget()),
       synthetic_event_type_(synthetic_event_type),
       menu_source_type_(menu_source_type) {
-  InitCoordinates(initializer->clientX(), initializer->clientY());
+  InitCoordinates(initializer->clientX(), initializer->clientY(),
+                  fallback_dom_window);
   modifiers_ |= ButtonsToWebInputEventModifiers(buttons_);
 }
 
-void MouseEvent::InitCoordinates(const double client_x, const double client_y) {
+void MouseEvent::InitCoordinates(const double client_x,
+                                 const double client_y,
+                                 const LocalDOMWindow* fallback_dom_window) {
   client_x_ = page_x_ = client_x;
   client_y_ = page_y_ = client_y;
   absolute_location_ = gfx::PointF(client_x, client_y);
 
-  if (auto* local_dom_window = DynamicTo<LocalDOMWindow>(view())) {
+  auto* local_dom_window = DynamicTo<LocalDOMWindow>(view());
+  float zoom_factor =
+      PageZoomFactor(local_dom_window ? local_dom_window : fallback_dom_window);
+
+  if (local_dom_window) {
     if (LocalFrame* frame = local_dom_window->GetFrame()) {
-      float zoom_factor = frame->PageZoomFactor();
       // Adjust page_x_ and page_y_ by layout viewport scroll offset.
       if (ScrollableArea* scrollable_area = frame->View()->LayoutViewport()) {
         gfx::Vector2d scroll_offset = scrollable_area->ScrollOffsetInt();
         page_x_ += scroll_offset.x() / zoom_factor;
         page_y_ += scroll_offset.y() / zoom_factor;
       }
-      // absolute_location_ is not an API value. It's in zoomed CSS pixels.
-      absolute_location_.Scale(zoom_factor);
     }
   }
 
+  // absolute_location_ is not an API value. It's in layout space.
+  absolute_location_.Scale(zoom_factor);
+
   // Correct values of the following are computed lazily, see
   // ComputeRelativePosition().
   offset_x_ = page_x_;
@@ -452,7 +472,13 @@
   offset_x_ = page_x_;
   offset_y_ = page_y_;
   layer_location_ = gfx::PointF(page_x_, page_y_);
-  float zoom_factor = PageZoomFactor(this);
+
+  LocalDOMWindow* dom_window_for_zoom_factor =
+      DynamicTo<LocalDOMWindow>(view());
+  if (!dom_window_for_zoom_factor)
+    dom_window_for_zoom_factor = target_node->GetDocument().domWindow();
+
+  float zoom_factor = PageZoomFactor(dom_window_for_zoom_factor);
   float inverse_zoom_factor = 1 / zoom_factor;
 
   // Must have an updated layout tree for this math to work correctly.
diff --git a/third_party/blink/renderer/core/events/mouse_event.h b/third_party/blink/renderer/core/events/mouse_event.h
index 4f3e951..9c31a498 100644
--- a/third_party/blink/renderer/core/events/mouse_event.h
+++ b/third_party/blink/renderer/core/events/mouse_event.h
@@ -36,6 +36,7 @@
 
 class DataTransfer;
 class EventDispatcher;
+class LocalDOMWindow;
 class MouseEventInit;
 class WebPointerProperties;
 
@@ -71,7 +72,8 @@
              const MouseEventInit*,
              base::TimeTicks platform_time_stamp = base::TimeTicks::Now(),
              SyntheticEventType = kRealOrIndistinguishable,
-             WebMenuSourceType = kMenuSourceNone);
+             WebMenuSourceType = kMenuSourceNone,
+             LocalDOMWindow* fallback_dom_window = nullptr);
   MouseEvent();
 
   static uint16_t WebInputEventModifiersToButtons(unsigned modifiers);
@@ -166,14 +168,16 @@
 
   WebMenuSourceType GetMenuSourceType() const { return menu_source_type_; }
 
-  // Page point in "absolute" coordinates (i.e. post-zoomed, page-relative
+  // Page point in layout coordinates (i.e. post-zoomed, page-relative
   // coords, usable with LayoutObject::absoluteToLocal) relative to view(),
   // i.e. the local frame.
   const gfx::PointF& AbsoluteLocation() const { return absolute_location_; }
 
   DispatchEventResult DispatchEvent(EventDispatcher&) override;
 
-  void InitCoordinates(const double client_x, const double client_y);
+  void InitCoordinates(const double client_x,
+                       const double client_y,
+                       const LocalDOMWindow* fallback_dom_window = nullptr);
 
   void Trace(Visitor*) const override;
 
diff --git a/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc b/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc
index e60fd1f3..b7e12e4 100644
--- a/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc
+++ b/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc
@@ -2174,7 +2174,7 @@
       1 /* dump_guid*/, base::trace_event::MemoryDumpType::EXPLICITLY_TRIGGERED,
       base::trace_event::MemoryDumpLevelOfDetail::DETAILED};
 
-  int32_t id = 0;
+  int32_t id = media::GetNextMediaPlayerLoggingID() - 1;
   int dump_count = 0;
 
   auto on_memory_dump_done = base::BindLambdaForTesting(
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
index 17b54a7..3631bbf 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
@@ -327,6 +327,8 @@
   void EnqueueScrollEventIfNeeded();
   gfx::Vector2d MinimumScrollOffsetInt() const override;
   gfx::Vector2d MaximumScrollOffsetInt() const override;
+  PhysicalRect LayoutContentRect(
+      IncludeScrollbarsInRect = kExcludeScrollbars) const;
   gfx::Rect VisibleContentRect(
       IncludeScrollbarsInRect = kExcludeScrollbars) const override;
   PhysicalRect VisibleScrollSnapportRect(
@@ -679,7 +681,6 @@
 
   void UpdateScrollCornerStyle();
   LayoutSize MinimumSizeForResizing(float zoom_factor);
-  PhysicalRect LayoutContentRect(IncludeScrollbarsInRect) const;
 
   void UpdateResizerStyle(const ComputedStyle* old_style);
 
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
index 834b550..98836a66 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
@@ -612,6 +612,7 @@
     std::unique_ptr<ScopedPromiseResolver> scoped_resolver,
     AbortSignal* signal,
     RequiredOriginType required_origin_type,
+    bool is_rk_required,
     AuthenticatorStatus status,
     MakeCredentialAuthenticatorResponsePtr credential,
     WebAuthnDOMExceptionDetailsPtr dom_exception_details) {
@@ -635,6 +636,10 @@
   UseCounter::Count(
       resolver->GetExecutionContext(),
       WebFeature::kCredentialManagerMakePublicKeyCredentialSuccess);
+  if (is_rk_required) {
+    UseCounter::Count(resolver->GetExecutionContext(),
+                      WebFeature::kWebAuthnRkRequiredCreationSuccess);
+  }
   DOMArrayBuffer* client_data_buffer =
       VectorToDOMArrayBuffer(std::move(credential->info->client_data_json));
   DOMArrayBuffer* raw_id =
@@ -713,8 +718,9 @@
   }
   OnMakePublicKeyCredentialComplete(
       std::move(scoped_resolver), signal,
-      RequiredOriginType::kSecureWithPaymentPermissionPolicy, status,
-      std::move(credential), /*dom_exception_details=*/nullptr);
+      RequiredOriginType::kSecureWithPaymentPermissionPolicy,
+      /*is_rk_required=*/false, status, std::move(credential),
+      /*dom_exception_details=*/nullptr);
 }
 
 void OnMakePublicKeyCredentialWithPaymentExtensionComplete(
@@ -758,6 +764,7 @@
 void OnGetAssertionComplete(
     std::unique_ptr<ScopedPromiseResolver> scoped_resolver,
     AbortSignal* signal,
+    bool is_conditional_ui_request,
     AuthenticatorStatus status,
     GetAssertionAuthenticatorResponsePtr credential,
     WebAuthnDOMExceptionDetailsPtr dom_exception_details) {
@@ -772,6 +779,12 @@
     UseCounter::Count(
         resolver->GetExecutionContext(),
         WebFeature::kCredentialManagerGetPublicKeyCredentialSuccess);
+
+    if (is_conditional_ui_request) {
+      UseCounter::Count(resolver->GetExecutionContext(),
+                        WebFeature::kWebAuthnConditionalUiGetSuccess);
+    }
+
     auto* authenticator_response =
         MakeGarbageCollected<AuthenticatorAssertionResponse>(
             std::move(credential->info->client_data_json),
@@ -1180,6 +1193,10 @@
       return promise;
     }
 
+    if (is_conditional_ui_request) {
+      UseCounter::Count(context, WebFeature::kWebAuthnConditionalUiGet);
+    }
+
     auto mojo_options =
         MojoPublicKeyCredentialRequestOptions::From(*options->publicKey());
     if (mojo_options) {
@@ -1193,7 +1210,7 @@
           std::move(mojo_options),
           WTF::BindOnce(&OnGetAssertionComplete,
                         std::make_unique<ScopedPromiseResolver>(resolver),
-                        WrapPersistent(signal)));
+                        WrapPersistent(signal), is_conditional_ui_request));
     } else {
       resolver->Reject(MakeGarbageCollected<DOMException>(
           DOMExceptionCode::kNotSupportedError,
@@ -1615,16 +1632,23 @@
             "publicKey.authenticatorSelection.userVerification value"));
   }
 
+  bool is_rk_required = false;
   if (options->publicKey()->hasAuthenticatorSelection() &&
-      options->publicKey()->authenticatorSelection()->hasResidentKey() &&
-      !mojo::ConvertTo<absl::optional<mojom::blink::ResidentKeyRequirement>>(
-          options->publicKey()->authenticatorSelection()->residentKey())) {
-    resolver->DomWindow()->AddConsoleMessage(
-        MakeGarbageCollected<ConsoleMessage>(
-            mojom::blink::ConsoleMessageSource::kJavaScript,
-            mojom::blink::ConsoleMessageLevel::kWarning,
-            "Ignoring unknown publicKey.authenticatorSelection.residentKey "
-            "value"));
+      options->publicKey()->authenticatorSelection()->hasResidentKey()) {
+    auto rk_requirement =
+        mojo::ConvertTo<absl::optional<mojom::blink::ResidentKeyRequirement>>(
+            options->publicKey()->authenticatorSelection()->residentKey());
+    if (!rk_requirement) {
+      resolver->DomWindow()->AddConsoleMessage(
+          MakeGarbageCollected<ConsoleMessage>(
+              mojom::blink::ConsoleMessageSource::kJavaScript,
+              mojom::blink::ConsoleMessageLevel::kWarning,
+              "Ignoring unknown publicKey.authenticatorSelection.residentKey "
+              "value"));
+    } else {
+      is_rk_required =
+          (rk_requirement == mojom::blink::ResidentKeyRequirement::REQUIRED);
+    }
   }
   // An empty list uses default algorithm identifiers.
   if (options->publicKey()->pubKeyCredParams().size() != 0) {
@@ -1682,7 +1706,8 @@
           std::move(mojo_options),
           WTF::BindOnce(&OnMakePublicKeyCredentialComplete,
                         std::make_unique<ScopedPromiseResolver>(resolver),
-                        WrapPersistent(signal), required_origin_type));
+                        WrapPersistent(signal), required_origin_type,
+                        is_rk_required));
     }
   }
 
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_credential.cc b/third_party/blink/renderer/modules/credentialmanagement/identity_credential.cc
index 107ac59d..592c1c1 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/identity_credential.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/identity_credential.cc
@@ -65,23 +65,20 @@
     return false;
   }
 
-  // kFollowedRedirect means that the path will not be checked, which is
-  // what we want -- at least one high-profile site has specific paths
-  // in its existing connect-src policy which do not work with FedCM, breaking
-  // the "no RP changes required" promise of FedCM.
-  // (note that we disable redirects for FedCM requests on the browser side)
-  // TODO(cbiesinger): Once the two known websites are fixed, make this
-  // codepath metrics-only and move kSuppressReporting here. crbug.com/1320724
+  // kFollowedRedirect ignores paths.
   if (policy->AllowConnectToSource(provider_url, provider_url,
                                    RedirectStatus::kFollowedRedirect)) {
+    // Log how frequently FedCM is attempted from RPs:
+    // (1) With specific paths in their connect-src policy
+    // AND
+    // (2) Whose connect-src policy does not whitelist FedCM endpoints
     UMA_HISTOGRAM_ENUMERATION("Blink.FedCm.Status.Csp",
                               FedCmCspStatus::kFailedPathButPassedOrigin);
-    return false;
+  } else {
+    UMA_HISTOGRAM_ENUMERATION("Blink.FedCm.Status.Csp",
+                              FedCmCspStatus::kFailedOrigin);
   }
 
-  UMA_HISTOGRAM_ENUMERATION("Blink.FedCm.Status.Csp",
-                            FedCmCspStatus::kFailedOrigin);
-
   WTF::String error =
       "Refused to connect to '" + provider_url.ElidedString() +
       "' because it violates the document's Content Security Policy.";
diff --git a/third_party/blink/renderer/modules/webcodecs/fuzzer_inputs.proto b/third_party/blink/renderer/modules/webcodecs/fuzzer_inputs.proto
index d7f997d..d4cca22 100644
--- a/third_party/blink/renderer/modules/webcodecs/fuzzer_inputs.proto
+++ b/third_party/blink/renderer/modules/webcodecs/fuzzer_inputs.proto
@@ -304,7 +304,7 @@
   }
 
   optional ImageOrientation image_orientation = 1;
-  optional PremultiplyAlpha premultiply_alpha = 2;
+  optional PremultiplyAlpha premultiply_alpha = 2 [deprecated = true];
   optional ColorSpaceConversion color_space_conversion = 3;
   optional uint32 resize_width = 4;
   optional uint32 resize_height = 5;
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc
index 7a098eac..edcdc81 100644
--- a/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc
@@ -86,12 +86,10 @@
     String mime_type,
     scoped_refptr<SegmentReader> data,
     bool data_complete,
-    ImageDecoder::AlphaOption alpha_option,
     const ColorBehavior& color_behavior,
     const SkISize& desired_size,
     ImageDecoder::AnimationOption animation_option)
     : mime_type_(mime_type),
-      alpha_option_(alpha_option),
       color_behavior_(color_behavior),
       desired_size_(desired_size),
       animation_option_(animation_option),
@@ -312,7 +310,8 @@
   Clear();
   animation_option_ = animation_option;
   decoder_ = ImageDecoder::CreateByMimeType(
-      mime_type_, segment_reader_, data_complete_, alpha_option_,
+      mime_type_, segment_reader_, data_complete_,
+      ImageDecoder::kAlphaNotPremultiplied,
       ImageDecoder::HighBitDepthDecodingOption::kDefaultBitDepth,
       color_behavior_, desired_size_, animation_option_);
   DCHECK(decoder_);
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_core.h b/third_party/blink/renderer/modules/webcodecs/image_decoder_core.h
index 6c3f0bd..56bcd6c 100644
--- a/third_party/blink/renderer/modules/webcodecs/image_decoder_core.h
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_core.h
@@ -24,7 +24,6 @@
   ImageDecoderCore(String mime_type,
                    scoped_refptr<SegmentReader> data,
                    bool data_complete,
-                   ImageDecoder::AlphaOption alpha_option,
                    const ColorBehavior& color_behavior,
                    const SkISize& desired_size,
                    ImageDecoder::AnimationOption animation_option);
@@ -106,7 +105,6 @@
   void MaybeDecodeToYuv();
 
   const String mime_type_;
-  const ImageDecoder::AlphaOption alpha_option_;
   const ColorBehavior color_behavior_;
   const SkISize desired_size_;
 
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_core_test.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_core_test.cc
index f4d0eeb..e7b796f 100644
--- a/third_party/blink/renderer/modules/webcodecs/image_decoder_core_test.cc
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_core_test.cc
@@ -24,8 +24,7 @@
     DCHECK(data->size()) << "Missing file: " << file_name;
     return std::make_unique<ImageDecoderCore>(
         mime_type, std::move(data),
-        /*data_complete=*/true, ImageDecoder::kAlphaPremultiplied,
-        ColorBehavior::Tag(), SkISize::MakeEmpty(),
+        /*data_complete=*/true, ColorBehavior::Tag(), SkISize::MakeEmpty(),
         ImageDecoder::AnimationOption::kPreferAnimation);
   }
 
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc
index acbe24a..11889c90 100644
--- a/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_external.cc
@@ -143,18 +143,6 @@
   if (init->colorSpaceConversion() == kNoneOption)
     color_behavior = ColorBehavior::Ignore();
 
-  auto alpha_option = ImageDecoder::kAlphaPremultiplied;
-  if (init->premultiplyAlpha() == kNoneOption)
-    alpha_option = ImageDecoder::kAlphaNotPremultiplied;
-
-  // TODO(crbug.com/1340190): We want to deprecate premultiplied alpha, so
-  // record whenever a client has explicitly required that.
-  if (init->premultiplyAlpha() == "premultiply") {
-    UseCounter::Count(
-        GetExecutionContext(),
-        WebFeature::kWebCodecsImageDecoderPremultiplyAlphaDeprecation);
-  }
-
   auto desired_size = SkISize::MakeEmpty();
   if (init->hasDesiredWidth() && init->hasDesiredHeight())
     desired_size = SkISize::Make(init->desiredWidth(), init->desiredHeight());
@@ -185,7 +173,7 @@
 
     decoder_ = std::make_unique<WTF::SequenceBound<ImageDecoderCore>>(
         decode_task_runner_, mime_type_, /*data=*/nullptr,
-        /*data_complete=*/false, alpha_option, color_behavior, desired_size,
+        /*data_complete=*/false, color_behavior, desired_size,
         animation_option_);
 
     consumer_ = MakeGarbageCollected<ReadableStreamBytesConsumer>(
@@ -250,8 +238,7 @@
   completed_property_->ResolveWithUndefined();
   decoder_ = std::make_unique<WTF::SequenceBound<ImageDecoderCore>>(
       decode_task_runner_, mime_type_, std::move(segment_reader),
-      data_complete_, alpha_option, color_behavior, desired_size,
-      animation_option_);
+      data_complete_, color_behavior, desired_size, animation_option_);
 
   DecodeMetadata();
 }
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc
index cc11f6c..a62af48 100644
--- a/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc
@@ -35,17 +35,6 @@
 
 namespace {
 
-String ToPremultiplyAlpha(wc_fuzzer::ImageBitmapOptions_PremultiplyAlpha type) {
-  switch (type) {
-    case wc_fuzzer::ImageBitmapOptions_PremultiplyAlpha_PREMULTIPLY_NONE:
-      return "none";
-    case wc_fuzzer::ImageBitmapOptions_PremultiplyAlpha_PREMULTIPLY:
-      return "premultiply";
-    case wc_fuzzer::ImageBitmapOptions_PremultiplyAlpha_PREMULTIPLY_DEFAULT:
-      return "default";
-  }
-}
-
 String ToColorSpaceConversion(
     wc_fuzzer::ImageBitmapOptions_ColorSpaceConversion type) {
   switch (type) {
@@ -131,8 +120,6 @@
         proto.config().data().data(), proto.config().data().size());
     image_decoder_init->setData(
         MakeGarbageCollected<V8ImageBufferSource>(data_copy));
-    image_decoder_init->setPremultiplyAlpha(
-        ToPremultiplyAlpha(proto.config().options().premultiply_alpha()));
     image_decoder_init->setColorSpaceConversion(ToColorSpaceConversion(
         proto.config().options().color_space_conversion()));
 
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_init.idl b/third_party/blink/renderer/modules/webcodecs/image_decoder_init.idl
index 4d2cbf0..44ad2e8 100644
--- a/third_party/blink/renderer/modules/webcodecs/image_decoder_init.idl
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_init.idl
@@ -13,7 +13,6 @@
   required USVString type;
 
   // Options used for setting up the decoder. See ImageBitmapOptions.
-  PremultiplyAlpha premultiplyAlpha = "default";
   ColorSpaceConversion colorSpaceConversion = "default";
 
   // Some image decoders support reduced resolution decoding. The desired size
diff --git a/third_party/blink/web_tests/FlagExpectations/highdpi b/third_party/blink/web_tests/FlagExpectations/highdpi
index 3b5717d8..4a1b4c7 100644
--- a/third_party/blink/web_tests/FlagExpectations/highdpi
+++ b/third_party/blink/web_tests/FlagExpectations/highdpi
@@ -509,6 +509,7 @@
 external/wpt/dom/abort/reason-constructor.html [ Pass ]
 external/wpt/dom/collections/HTMLCollection-own-props.html [ Pass ]
 external/wpt/dom/events/EventListener-incumbent-global-subsubframe.sub.html [ Pass ]
+external/wpt/dom/events/mouse-event-retarget.html [ Pass ]
 external/wpt/dom/events/scrolling/scrollend-event-fired-to-document.html [ Pass ]
 external/wpt/dom/lists/DOMTokenList-Iterable.html [ Pass ]
 external/wpt/dom/nodes/Element-matches-namespaced-elements.html [ Pass ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 43af77e..f6bb42a 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -935,7 +935,7 @@
       "http/tests/inspector-protocol/storage/interest-groups.js"
     ],
     "args": [
-      "--enable-features=InterestGroupStorage,AdInterestGroupAPI,Fledge,PrivacySandboxAdsAPIsOverride,FencedFrames:implementation_type/shadow_dom"
+      "--enable-features=InterestGroupStorage,AdInterestGroupAPI,Fledge,PrivacySandboxAdsAPIsOverride,FencedFrames:implementation_type/mparch"
     ]
   },
   {
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.sub.https.html.sub.headers b/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.sub.https.html.sub.headers
index d1d80d2..c521de6 100644
--- a/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.sub.https.html.sub.headers
+++ b/third_party/blink/web_tests/external/wpt/credential-management/fedcm-network-requests.sub.https.html.sub.headers
@@ -1,2 +1,2 @@
 Cross-Origin-Embedder-Policy: credentialless
-Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src https://{{host}}:{{ports[https][0]}}/never/used/path
+Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src https://{{host}}:{{ports[https][0]}}/
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/mouse-event-retarget.html b/third_party/blink/web_tests/external/wpt/dom/events/mouse-event-retarget.html
new file mode 100644
index 0000000..c9ce6240
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/dom/events/mouse-event-retarget.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<title>Script created MouseEvent properly retargets and adjusts offsetX</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<style>
+body {
+  margin: 8px;
+  padding: 0;
+}
+</style>
+
+<div id="target">Hello</div>
+
+<script>
+async_test(t => {
+  target.addEventListener('click', ev => {
+    t.step(() => assert_equals(ev.offsetX, 42));
+    t.done();
+  });
+
+  const ev = new MouseEvent('click', { clientX: 50 });
+  target.dispatchEvent(ev);
+}, "offsetX is correctly adjusted");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-body.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-body.html
index 4c40291..e3be8dac 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-body.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-body.html
@@ -11,7 +11,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.body,
     eventName: 'mousewheel',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-div.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-div.html
index a37276b..345e818 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-div.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-div.html
@@ -27,7 +27,7 @@
   <div style="height: 200vh"></div>
 </div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.getElementById('div'),
     eventName: 'mousewheel',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-document.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-document.html
index cdbfd23..acca8a6 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-document.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-document.html
@@ -11,7 +11,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document,
     eventName: 'mousewheel',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-root.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-root.html
index c7e818e0..6009ec8 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-root.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-root.html
@@ -11,7 +11,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.documentElement,
     eventName: 'mousewheel',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-window.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-window.html
index 6a394a2..a1aa7b32 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-window.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-window.html
@@ -11,7 +11,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: window,
     eventName: 'mousewheel',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-body.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-body.html
index d2e84de..f417bdd 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-body.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-body.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.body,
     eventName: 'touchmove',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-div.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-div.html
index 9f026ee..11c9345 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-div.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-div.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.getElementById('touchDiv'),
     eventName: 'touchmove',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-document.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-document.html
index b5b27b4..8b95a8d 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-document.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-document.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document,
     eventName: 'touchmove',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-root.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-root.html
index c2f42cc..c41ab72b 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-root.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-root.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.documentElement,
     eventName: 'touchmove',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-window.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-window.html
index dee076f9..3d6675c 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-window.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchmove-event-listener-on-window.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: window,
     eventName: 'touchstart',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-body.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-body.html
index f4c2246..f6e6ecb 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-body.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-body.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.body,
     eventName: 'touchstart',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-div.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-div.html
index ba050c036..2e7c6e6 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-div.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-div.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.getElementById('touchDiv'),
     eventName: 'touchstart',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-document.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-document.html
index a1da298..22fcbdc 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-document.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-document.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document,
     eventName: 'touchstart',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-root.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-root.html
index 38bcf9b..56c51349 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-root.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-root.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.documentElement,
     eventName: 'touchstart',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-window.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-window.html
index 3642af2b..4e9d424 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-window.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-touchstart-event-listener-on-window.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: window,
     eventName: 'touchstart',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-body.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-body.html
index 3a573407..7545b98 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-body.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-body.html
@@ -10,7 +10,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.body,
     eventName: 'wheel',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-div.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-div.html
index 05b655ff..8884e13 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-div.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-div.html
@@ -26,7 +26,7 @@
   <div style="height: 200vh"></div>
 </div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.getElementById('div'),
     eventName: 'wheel',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-document.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-document.html
index 6e19c832..de6009ee 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-document.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-document.html
@@ -10,7 +10,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document,
     eventName: 'wheel',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-root.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-root.html
index 26279cb..562635a 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-root.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-root.html
@@ -10,7 +10,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.documentElement,
     eventName: 'wheel',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-window.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-window.html
index f428e485..75ef3b3 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-window.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-window.html
@@ -10,7 +10,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: window,
     eventName: 'wheel',
     passive: false,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-body.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-body.html
index 1c945924..24f7619 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-body.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-body.html
@@ -11,7 +11,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.body,
     eventName: 'mousewheel',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-div.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-div.html
index 2edf612..b3a16e5 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-div.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-div.html
@@ -27,7 +27,7 @@
   <div style="height: 200vh"></div>
 </div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.getElementById('div'),
     eventName: 'mousewheel',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-document.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-document.html
index 4027f3fc..9c0796e 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-document.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-document.html
@@ -11,7 +11,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document,
     eventName: 'mousewheel',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-root.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-root.html
index 40ef488..20f1b98 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-root.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-root.html
@@ -11,7 +11,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.documentElement,
     eventName: 'mousewheel',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-window.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-window.html
index 6609c2a2..bed62cd8 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-window.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-mousewheel-event-listener-on-window.html
@@ -11,7 +11,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: window,
     eventName: 'mousewheel',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-body.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-body.html
index 8077d1b03..2349bad2 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-body.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-body.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.body,
     eventName: 'touchmove',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-div.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-div.html
index 057474f..a61b348 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-div.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-div.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.getElementById('touchDiv'),
     eventName: 'touchmove',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-document.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-document.html
index 60b17de6..b49971b 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-document.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-document.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document,
     eventName: 'touchmove',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-root.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-root.html
index 8539920..b8517045 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-root.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-root.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.documentElement,
     eventName: 'touchmove',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-window.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-window.html
index 3e1d0d4..351d6ac 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-window.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchmove-event-listener-on-window.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: window,
     eventName: 'touchstart',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-body.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-body.html
index 63dd68d..c3d2b57 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-body.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-body.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.body,
     eventName: 'touchstart',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-div.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-div.html
index f9aba60..103e7f0d 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-div.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-div.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.getElementById('touchDiv'),
     eventName: 'touchstart',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-document.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-document.html
index 011b87f..2e4de2405 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-document.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-document.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document,
     eventName: 'touchstart',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-root.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-root.html
index f2db44a360..0f52e9a 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-root.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-root.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.documentElement,
     eventName: 'touchstart',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-window.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-window.html
index e8d83cdc..c47af81 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-window.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-touchstart-event-listener-on-window.html
@@ -16,7 +16,7 @@
 </style>
 <div id="touchDiv"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: window,
     eventName: 'touchstart',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-body.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-body.html
index 82de4bd..09873a9 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-body.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-body.html
@@ -10,7 +10,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.body,
     eventName: 'wheel',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-div.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-div.html
index 906c5e2d8f..d29c573c 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-div.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-div.html
@@ -26,7 +26,7 @@
   <div style="height: 200vh"></div>
 </div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.getElementById('div'),
     eventName: 'wheel',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-document.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-document.html
index 9512313..b080f833 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-document.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-document.html
@@ -10,7 +10,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document,
     eventName: 'wheel',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-root.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-root.html
index fe5d6d7..f4e35a7 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-root.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-root.html
@@ -10,7 +10,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: document.documentElement,
     eventName: 'wheel',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-window.html b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-window.html
index 0107c1f..eb2a6f3 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-window.html
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/passive-wheel-event-listener-on-window.html
@@ -10,7 +10,7 @@
 <script src="resources/scrolling.js"></script>
 <div class=remove-on-cleanup style="height: 200vh"></div>
 <script>
-  runTest({
+  document.body.onload = () => runTest({
     target: window,
     eventName: 'wheel',
     passive: true,
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/resources/scrolling.js b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/resources/scrolling.js
index 43c6938..1d898d8 100644
--- a/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/resources/scrolling.js
+++ b/third_party/blink/web_tests/external/wpt/dom/events/non-cancelable-when-passive/resources/scrolling.js
@@ -1,4 +1,15 @@
-function runTest({target, eventName, passive, expectCancelable}) {
+function raf() {
+  return new Promise((resolve) => {
+    // rAF twice.
+    window.requestAnimationFrame(() => {
+      window.requestAnimationFrame(resolve);
+    });
+  });
+}
+
+async function runTest({target, eventName, passive, expectCancelable}) {
+  await raf();
+
   let cancelable = null;
   let arrived = false;
   target.addEventListener(eventName, function (event) {
@@ -14,6 +25,7 @@
     const pos_y = Math.floor(window.innerHeight / 2);
     const delta_x = 0;
     const delta_y = 100;
+
     await new test_driver.Actions()
       .scroll(pos_x, pos_y, delta_x, delta_y).send();
     await waitFor(() => arrived);
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/keydown.html b/third_party/blink/web_tests/external/wpt/event-timing/keydown.html
new file mode 100644
index 0000000..fd814e1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/event-timing/keydown.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<meta charset=utf-8 />
+<title>Event Timing Keydown.</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/testdriver.js></script>
+<script src=/resources/testdriver-actions.js></script>
+<script src=/resources/testdriver-vendor.js></script>
+<script src=resources/event-timing-test-utils.js></script>
+<input type='text' id='target'></input>
+<script>
+  promise_test(async t => {
+    return testEventType(t, 'keydown');
+  })
+</script>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/keyup.html b/third_party/blink/web_tests/external/wpt/event-timing/keyup.html
new file mode 100644
index 0000000..0ec3670
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/event-timing/keyup.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html>
+<meta charset=utf-8 />
+<title>Event Timing Keyup.</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/resources/testdriver.js></script>
+<script src=/resources/testdriver-actions.js></script>
+<script src=/resources/testdriver-vendor.js></script>
+<script src=resources/event-timing-test-utils.js></script>
+<input type='text' id='target'></input>
+<script>
+  promise_test(async t => {
+    return testEventType(t, 'keyup');
+  })
+</script>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js b/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js
index 7aa51b01..ab3f110c 100644
--- a/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js
+++ b/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js
@@ -168,6 +168,13 @@
       || eventType === 'pointerleave' || eventType === 'pointerout') {
     actions.pointerMove(0, 0, {origin: target})
     .pointerMove(0, 0);
+  } else if (eventType === 'keyup' || eventType === 'keydown') {
+    // Any key here as an input should work.
+    // TODO: Switch this to use test_driver.Actions.key{up,down}
+    // when test driver supports it.
+    // Please check crbug.com/893480.
+    const key = 'k';
+    return test_driver.send_keys(target, key);
   } else {
     assert_unreached('The event type ' + eventType + ' is not supported.');
   }
@@ -182,7 +189,9 @@
           'pointerleave',
           'pointerout',
           'pointerover',
-          'pointerup'
+          'pointerup',
+          'keyup',
+          'keydown'
         ].includes(eventType);
 }
 
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-update.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-update.https.window-expected.txt
index 2884c27..9c4a8d8 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-update.https.window-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/service-worker-update.https.window-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
-FAIL update public to local: failed preflight. assert_equals: update error expected (string) "TypeError" but got (undefined) undefined
+PASS update public to local: failed preflight.
 FAIL update public to local: success. assert_equals: update error expected (undefined) undefined but got (string) "TypeError"
-FAIL update public to private: failed preflight. assert_equals: update error expected (string) "TypeError" but got (undefined) undefined
+PASS update public to private: failed preflight.
 FAIL update public to private: success. assert_equals: update error expected (undefined) undefined but got (string) "TypeError"
 PASS update public to public: success.
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/view-timeline-snapport.html b/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/view-timeline-snapport.html
new file mode 100644
index 0000000..5d68d37
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/scroll-animations/view-timelines/view-timeline-snapport.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<title>ViewTimeline vs. scroll-padding-*</title>
+<link rel="help" href="https://drafts.csswg.org/scroll-animations-1/#view-timelines">
+<link rel="help" href="https://drafts.csswg.org/scroll-animations-1/#view-progress-visibility-range">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/web-animations/testcommon.js"></script>
+<script src="/scroll-animations/scroll-timelines/testcommon.js"></script>
+<script src="/scroll-animations/view-timelines/testcommon.js"></script>
+<style>
+  #container {
+    border: 10px solid lightgray;
+    overflow-y: scroll;
+    height: 200px;
+    width: 200px;
+    scroll-padding: 40px;
+  }
+  .spacer {
+    height: 800px;
+  }
+  #target {
+    background-color: green;
+    height: 200px;
+    width: 100px;
+  }
+</style>
+<body>
+  <div id="container">
+    <div id="leading-space" class="spacer"></div>
+    <div id="target"></div>
+    <div id="trailing-space" class="spacer"></div>
+  </div>
+</body>
+<script>
+  promise_test(async t => {
+    container.scrollTop = 0;
+    await waitForNextFrame();
+
+    const anim = CreateViewTimelineOpacityAnimation(t, target);
+    await anim.ready;
+
+    // 0%
+    container.scrollTop = 600;
+    await waitForNextFrame();
+    assert_percents_equal(anim.currentTime, 0);
+
+    // 50%
+    container.scrollTop = 800;
+    await waitForNextFrame();
+    assert_percents_equal(anim.currentTime, 50);
+
+    // 100%
+    container.scrollTop = 1000;
+    await waitForNextFrame();
+    assert_percents_equal(anim.currentTime, 100);
+  }, 'Default ViewTimeline is not affected by scroll-padding');
+</script>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html
index 4548b3e..eca205b 100644
--- a/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html
+++ b/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
-<meta name=timeout content=long>
+<meta name="timeout" content="long">
 <!-- user agents are not required to support open features other than `noopener`
      and on some platforms position and size features don't make sense -->
 <meta name="flags" content="may">
@@ -57,24 +57,14 @@
     let testName =
       `Fullscreen on '${fullscreenScreen.label}' and open popup on '${popupScreen.label}'`;
     promise_test(async popupTest => {
-      const button = document.createElement('button');
-      button.innerHTML = testName;
-      const entry = document.createElement('li');
-      entry.appendChild(button);
-      popupButtons.appendChild(entry);
-      const popupWatcher = new EventWatcher(popupTest, button, ['click']);
-      const popupClick = popupWatcher.wait_for('click');
-      try {  // Support manual testing where test_driver is not running.
-        await test_driver.click(button);
-      } catch {
-      }
-      await popupClick;
-      button.disabled = true;
+      await addTestTriggerButtonAndAwaitClick(popupButtons,
+        testName,
+        popupTest);
       await document.documentElement.requestFullscreen(
         { screen: fullscreenScreen }
       );
       await testPopupOnScreen(popupTest, popupScreen,
-                             /*expectPopup=*/fullscreenScreen !== popupScreen);
+                             /*expectPopup=*/screenDetails.screens.length > 1);
     }, testName);
   }
 }, 'Use multi-screen details to request fullscreen and open a pop-up in the same user activation.');
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html
new file mode 100644
index 0000000..620cd6e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<meta name="timeout" content="long">
+<title>Multi-Screen Window Placement test: element.requestFullscreen()</title>
+<link rel="help" href="https://w3c.github.io/window-placement/">
+This test uses multi-screen details to request fullscreen on different
+displays and swap between them.<br>
+It runs manually with `wpt serve` and a compatible browser.<br><br>
+<button id="setUpButton">Request screen details</button>
+<ul id="testButtons"></ul>
+<ul id="logger"></ul>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/helpers.js"></script>
+
+<script>
+'use strict';
+
+// Waits until `window` is located on `screen` or until 3 seconds elapses.
+async function ensureWindowOnScreen(window, screen) {
+  // Returns true if window `w` in on screen `s`.
+  const isWindowOnScreen = async (w, s) => {
+    const center = {
+      x: w.screenLeft + w.outerWidth / 2,
+      y: w.screenTop + w.outerHeight / 2
+    };
+    return center.x >= s.left && (center.x < s.left + s.width) &&
+      center.y >= s.top && (center.y < s.top + s.height) &&
+      (await w.getScreenDetails()).currentScreen == s;
+  }
+  // Checks every 100ms if window `w` is on screen `s` up to 3s maximum.
+  const waitForWindowOnScreen = async (w, s, resolve, timestamp = Date.now()) => {
+    if (!w || w.closed || Date.now() - timestamp > 3000)
+      resolve(false);
+    else if (await isWindowOnScreen(w, s))
+      resolve(true);
+    else
+      setTimeout(waitForWindowOnScreen.bind(this, w, s, resolve, timestamp), 100);
+  }
+  return new Promise(resolve => { waitForWindowOnScreen(window, screen, resolve); });
+}
+
+// Asserts that the browser window is correctly positioned on `screen`.
+// `expectFullscreen` specifies whether to expect the window to be
+// fullscreen or not.
+async function testWindowOnScreen(test, screen, expectFullscreen) {
+
+  // In chrome, the requestFullscreen promise may resolve before the
+  // transition completes and the bounds may be incorect in the meantime.
+  // Wait until the window is on the expected screen.
+  // TODO(crbug.com/1330724) Remove this.
+  await ensureWindowOnScreen(window, screen);
+
+  assert_equals(!!document.fullscreenElement, expectFullscreen);
+  assert_equals((await window.getScreenDetails()).currentScreen, screen);
+
+  if (expectFullscreen) {
+    // Window bounds should equal the bounds of the screen when in fullscreen.
+    assert_equals(window.screenX, screen.left);
+    assert_equals(window.screenY, screen.top);
+    assert_equals(window.innerWidth, screen.width);
+    assert_equals(window.innerHeight, screen.height);
+  } else {
+    // Verify the window is somewhere within the specified screen
+    assert_true(window.screenX >= screen.left);
+    assert_true(window.screenY >= screen.top);
+    assert_true(window.screenX + window.outerWidth <= screen.left + screen.width);
+    assert_true(window.screenY + window.outerHeight <= screen.top + screen.height);
+  }
+}
+
+promise_test(async setUpTest => {
+  await setUpWindowPlacement(setUpTest, setUpButton);
+  const screenDetails = await getScreenDetails();
+  assert_true(!!screenDetails, 'Error getting screen details');
+  for (const [i, fullscreenScreen] of screenDetails.screens.entries()) {
+    const originalScreen = screenDetails.currentScreen;
+    const swapFullscreen =
+      screenDetails.screens[(i + 1) % screenDetails.screens.length];
+    let testName =
+      `Fullscreen on '${fullscreenScreen.label}' and swap to ${swapFullscreen.label}`;
+    promise_test(async fullscreenTest => {
+      // Step 1: Enter Fullscreen.
+      await addTestTriggerButtonAndAwaitClick(testButtons,
+        `Step 1: ${testName} (Enter Fullscreen)`,
+        fullscreenTest);
+      log(`Requesting fullscreen on screen: ${fullscreenScreen.label}`);
+      await document.documentElement.requestFullscreen(
+        { screen: fullscreenScreen }
+      );
+      await testWindowOnScreen(fullscreenTest, fullscreenScreen,
+        /*expectFullscreen*/true);
+      // Step 2: Swap to another screen.
+      await addTestTriggerButtonAndAwaitClick(testButtons,
+        `Step 2: ${testName} (Swap screens)`,
+        fullscreenTest);
+      log(`Swapping fullscreen to screen: ${swapFullscreen.label}`);
+      await document.documentElement.requestFullscreen(
+        { screen: swapFullscreen }
+      );
+      await testWindowOnScreen(fullscreenTest, swapFullscreen,
+        /*expectFullscreen*/true);
+      // Step 3: Exit fullscreen. Should restore window to `originalScreen`.
+      await addTestTriggerButtonAndAwaitClick(testButtons,
+        `Step 3: ${testName} (Exit Fullscreen)`,
+        fullscreenTest);
+      log(`Exiting fullscreen. Window should restore to ${originalScreen.label}.`);
+      await document.exitFullscreen();
+      await testWindowOnScreen(fullscreenTest, originalScreen,
+        /*expectFullscreen*/false);
+    }, testName);
+  }
+}, 'Use multi-screen details to request fullscreen on target displays and swap between them');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html
index 7362240..297c6f4 100644
--- a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html
+++ b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
-<meta name=timeout content=long>
+<meta name="timeout" content="long">
 <!-- user agents are not required to support open features other than `noopener`
      and on some platforms position and size features don't make sense -->
 <meta name="flags" content="may">
@@ -89,19 +89,9 @@
   assert_greater_than(screenDetails.screens.length, 0, 'Connect a screen');
   for (const s of screenDetails.screens) {
     promise_test(async popupTest => {
-      const button = document.createElement('button');
-      button.innerHTML = `Open a popup on '${s.label}'`;
-      const entry = document.createElement('li');
-      entry.appendChild(button);
-      popupButtons.appendChild(entry);
-      const popupWatcher = new EventWatcher(popupTest, button, ['click']);
-      const popupClick = popupWatcher.wait_for('click');
-      try {  // Support manual testing where test_driver is not running.
-        await test_driver.click(button);
-      } catch {
-      }
-      await popupClick;
-      button.disabled = true;
+      await addTestTriggerButtonAndAwaitClick(popupButtons,
+        `Open a popup on '${s.label}'`,
+        popupTest);
       await testPopupOnScreen(popupTest, s);
     }, `Open a popup on '${s.label}'`);
   }
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js b/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js
index 88609892..8ce6854 100644
--- a/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js
+++ b/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js
@@ -1,8 +1,12 @@
-// Logs (append) an HTML string to the document in a list format.
+
+// Logs (appends) an HTML string to a logger element in a list format.
+// An element in the document with id "logger" will be used as the log
+// container.
 function log(str) {
   const entry = document.createElement('li');
   entry.innerHTML = str;
-  logger.appendChild(entry);
+  const loggerElement = document.getElementById('logger');
+  loggerElement.appendChild(entry);
   return entry;
 }
 
@@ -36,3 +40,29 @@
   await setUpClick;
   setUpButton.disabled = true;
 }
+
+
+// Adds a button to the given `buttonContainer` element with the contents of
+// `name`. Attaches an event watcher to the given test and waits for a signal
+// from the test driver to click the button. If no test driver is available
+// (manual testing) then awaits an actual click from the user instead. If
+// `disableOnClick` is true, the button will also be disabled after it is
+// clicked.
+async function addTestTriggerButtonAndAwaitClick(buttonContainer, name, test) {
+  const button = document.createElement('button');
+  button.innerHTML = name;
+  const entry = document.createElement('li');
+  entry.appendChild(button);
+  buttonContainer.appendChild(entry);
+  const testWatcher = new EventWatcher(test, button, ['click']);
+  const buttonClick = testWatcher.wait_for('click');
+  // Disable the button when it is clicked.
+  button.onclick = function() {
+    button.disabled = true;
+  };
+  try {  // Support manual testing where test_driver is not running.
+    await test_driver.click(button);
+  } catch {
+  }
+  await buttonClick;
+}
diff --git a/third_party/modp_b64/README.chromium b/third_party/modp_b64/README.chromium
index 7067dfb..5cb862b 100644
--- a/third_party/modp_b64/README.chromium
+++ b/third_party/modp_b64/README.chromium
@@ -13,4 +13,5 @@
 
 The modp_b64.cc and modp_b64.h files were then modified to make them safe on
 64-bit systems, avoid misaligned read/write on little-endian hardware, and
-remove unreachable code.
+remove unreachable code. The API was also extended so callers can avoid overflow
+when performing a base64 encode.
diff --git a/third_party/modp_b64/modp_b64.h b/third_party/modp_b64/modp_b64.h
index 7206b1d..b21be8a 100644
--- a/third_party/modp_b64/modp_b64.h
+++ b/third_party/modp_b64/modp_b64.h
@@ -24,6 +24,7 @@
 #ifndef MODP_B64
 #define MODP_B64
 
+#include <limits.h>
 #include <stddef.h>
 
 #ifdef __cplusplus
@@ -81,6 +82,19 @@
 size_t modp_b64_decode(char* dest, const char* src, size_t len);
 
 /**
+ * The maximum input that can be passed into modp_b64_encode. Lengths beyond
+ * this will overflow modp_b64_encode_len.
+ *
+ * This works because modp_b64_encode_len(A) computes:
+ *     ceiling[max_len / 3] * 4 + 1
+ *   = ceiling[floor[(SIZE_MAX-1)/4]*3 / 3] * 4 + 1
+ *   = floor[(SIZE_MAX-1)/4] * 4 + 1
+ *  <= SIZE_MAX-1 + 1
+ *   = SIZE_MAX
+ */
+#define MODP_B64_MAX_INPUT_LEN ((SIZE_MAX - 1) / 4 * 3)
+
+/**
  * Given a source string of length len, this returns the amount of
  * memory the destination string should have.
  *
@@ -89,6 +103,9 @@
  * ceiling[len / 3] * 4 + 1
  *
  * +1 is for any extra null.
+ *
+ * WARNING: This expression will overflow if the A is above
+ * MODP_B64_MAX_INPUT_LEN. The caller must check this bound first.
  */
 #define modp_b64_encode_len(A) ((A+2)/3 * 4 + 1)
 
diff --git a/third_party/nearby/BUILD.gn b/third_party/nearby/BUILD.gn
index bbdd8367..27ca057 100644
--- a/third_party/nearby/BUILD.gn
+++ b/third_party/nearby/BUILD.gn
@@ -389,7 +389,6 @@
     "src/internal/platform/implementation/ble_v2.h",
     "src/internal/platform/implementation/bluetooth_adapter.h",
     "src/internal/platform/implementation/bluetooth_classic.h",
-    "src/internal/platform/implementation/credential_storage.h",
     "src/internal/platform/implementation/server_sync.h",
     "src/internal/platform/implementation/webrtc.h",
     "src/internal/platform/implementation/wifi.h",
diff --git a/third_party/rust/Cargo.lock b/third_party/rust/Cargo.lock
index 300d781..00f1a67 100644
--- a/third_party/rust/Cargo.lock
+++ b/third_party/rust/Cargo.lock
@@ -21,13 +21,6 @@
 ]
 
 [[package]]
-name = "ansi_term"
-version = "0.11.0"
-dependencies = [
- "winapi",
-]
-
-[[package]]
 name = "aquamarine"
 version = "0.1.11"
 dependencies = [
@@ -68,7 +61,7 @@
  "bitflags",
  "cexpr",
  "clang-sys",
- "clap 3.1.12",
+ "clap",
  "env_logger",
  "itertools 0.10.3",
  "lazy_static",
@@ -114,7 +107,7 @@
 version = "0.22.4"
 dependencies = [
  "autocxx-engine",
- "clap 3.1.12",
+ "clap",
  "env_logger",
  "indexmap",
  "miette",
@@ -163,12 +156,12 @@
 
 [[package]]
 name = "bindgen"
-version = "0.59.2"
+version = "0.60.1"
 dependencies = [
  "bitflags",
  "cexpr",
  "clang-sys",
- "clap 2.33.3",
+ "clap",
  "env_logger",
  "lazy_static",
  "lazycell",
@@ -232,7 +225,7 @@
  "bindgen",
  "cargo-platform",
  "cargo_metadata",
- "clap 3.1.12",
+ "clap",
  "cxx",
  "cxxbridge-cmd",
  "memoffset",
@@ -261,19 +254,6 @@
 
 [[package]]
 name = "clap"
-version = "2.33.3"
-dependencies = [
- "ansi_term",
- "atty",
- "bitflags",
- "strsim 0.8.0",
- "textwrap 0.11.0",
- "unicode-width",
- "vec_map",
-]
-
-[[package]]
-name = "clap"
 version = "3.1.12"
 dependencies = [
  "atty",
@@ -281,9 +261,9 @@
  "clap_lex",
  "indexmap",
  "lazy_static",
- "strsim 0.10.0",
+ "strsim",
  "termcolor",
- "textwrap 0.15.0",
+ "textwrap",
 ]
 
 [[package]]
@@ -323,7 +303,7 @@
 name = "cxxbridge-cmd"
 version = "1.0.68"
 dependencies = [
- "clap 3.1.12",
+ "clap",
  "codespan-reporting",
  "proc-macro2",
  "quote",
@@ -496,7 +476,7 @@
  "supports-hyperlinks",
  "supports-unicode",
  "terminal_size",
- "textwrap 0.15.0",
+ "textwrap",
  "thiserror",
  "unicode-width",
 ]
@@ -729,10 +709,6 @@
 
 [[package]]
 name = "strsim"
-version = "0.8.0"
-
-[[package]]
-name = "strsim"
 version = "0.10.0"
 
 [[package]]
@@ -806,13 +782,6 @@
 
 [[package]]
 name = "textwrap"
-version = "0.11.0"
-dependencies = [
- "unicode-width",
-]
-
-[[package]]
-name = "textwrap"
 version = "0.15.0"
 dependencies = [
  "smawk",
@@ -864,10 +833,6 @@
 version = "0.1.7"
 
 [[package]]
-name = "vec_map"
-version = "0.8.2"
-
-[[package]]
 name = "version_check"
 version = "0.9.4"
 
diff --git a/third_party/rust/Cargo.toml b/third_party/rust/Cargo.toml
index 7072221..4e4fd8fed 100644
--- a/third_party/rust/Cargo.toml
+++ b/third_party/rust/Cargo.toml
@@ -25,7 +25,7 @@
 features = ["static"]
 
 [dependencies.bindgen]
-version = "0.59"
+version = "0.60"
 features = ["static"]
 build-script-outputs = ["host-target.txt"]
 
@@ -74,10 +74,6 @@
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/aho_corasick/v0_7/crate"
 package = "aho-corasick"
 
-[patch.crates-io.ansi_term_v0_11]
-path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/ansi_term/v0_11/crate"
-package = "ansi_term"
-
 [patch.crates-io.aquamarine_v0_1]
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/aquamarine/v0_1/crate"
 package = "aquamarine"
@@ -118,8 +114,8 @@
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/backtrace/v0_3/crate"
 package = "backtrace"
 
-[patch.crates-io.bindgen_v0_59]
-path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/bindgen/v0_59/crate"
+[patch.crates-io.bindgen_v0_60]
+path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/bindgen/v0_60/crate"
 package = "bindgen"
 
 [patch.crates-io.bitflags_v1]
@@ -154,10 +150,6 @@
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/clap_lex/v0_1/crate"
 package = "clap_lex"
 
-[patch.crates-io.clap_v2]
-path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/clap/v2/crate"
-package = "clap"
-
 [patch.crates-io.clap_v3]
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/clap/v3/crate"
 package = "clap"
@@ -418,10 +410,6 @@
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/strsim/v0_10/crate"
 package = "strsim"
 
-[patch.crates-io.strsim_v0_8]
-path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/strsim/v0_8/crate"
-package = "strsim"
-
 [patch.crates-io.strum_macros_v0_24]
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/strum_macros/v0_24/crate"
 package = "strum_macros"
@@ -454,10 +442,6 @@
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/terminal_size/v0_1/crate"
 package = "terminal_size"
 
-[patch.crates-io.textwrap_v0_11]
-path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/textwrap/v0_11/crate"
-package = "textwrap"
-
 [patch.crates-io.textwrap_v0_15]
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/textwrap/v0_15/crate"
 package = "textwrap"
@@ -490,10 +474,6 @@
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/unindent/v0_1/crate"
 package = "unindent"
 
-[patch.crates-io.vec_map_v0_8]
-path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/vec_map/v0_8/crate"
-package = "vec_map"
-
 [patch.crates-io.version_check_v0_9]
 path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/version_check/v0_9/crate"
 package = "version_check"
diff --git a/third_party/rust/ansi_term/v0_11/BUILD.gn b/third_party/rust/ansi_term/v0_11/BUILD.gn
deleted file mode 100644
index 75f0d30..0000000
--- a/third_party/rust/ansi_term/v0_11/BUILD.gn
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2022 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/rust/cargo_crate.gni")
-
-cargo_crate("lib") {
-  crate_name = "ansi_term"
-  epoch = "0.11"
-  crate_type = "rlib"
-
-  # Only for usage from third-party crates. Add the crate to
-  # third_party.toml to use it from first-party code.
-  visibility = [ "//third_party/rust/*" ]
-  crate_root = "crate/src/lib.rs"
-
-  # Unit tests skipped. Generate with --with-tests to include them.
-  build_native_rust_unit_tests = false
-  sources = [ "crate/src/lib.rs" ]
-  edition = "2015"
-  cargo_pkg_version = "0.11.0"
-  cargo_pkg_authors = "ogham@bsago.me, Ryan Scheel (Havvy) <ryan.havvy@gmail.com>, Josh Triplett <josh@joshtriplett.org>"
-  cargo_pkg_name = "ansi_term"
-  cargo_pkg_description =
-      "Library for ANSI terminal colours and styles (bold, underline)"
-  deps = []
-  if (is_win) {
-    deps += [ "//third_party/rust/winapi/v0_3:lib" ]
-  }
-}
diff --git a/third_party/rust/ansi_term/v0_11/README.chromium b/third_party/rust/ansi_term/v0_11/README.chromium
deleted file mode 100644
index 87ac27979..0000000
--- a/third_party/rust/ansi_term/v0_11/README.chromium
+++ /dev/null
@@ -1,6 +0,0 @@
-Name: ansi_term
-URL: https://crates.io/crates/ansi_term
-Description: Library for ANSI terminal colours and styles (bold, underline)
-Version: 0.11.0
-Security Critical: no
-License: MIT
diff --git a/third_party/rust/ansi_term/v0_11/crate/.gitignore b/third_party/rust/ansi_term/v0_11/crate/.gitignore
deleted file mode 100644
index f2f9e58..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-target
-Cargo.lock
\ No newline at end of file
diff --git a/third_party/rust/ansi_term/v0_11/crate/.travis.yml b/third_party/rust/ansi_term/v0_11/crate/.travis.yml
deleted file mode 100644
index 035af4b4..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/.travis.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-language: rust

-

-addons:

-  apt:

-    packages:

-      - libcurl4-openssl-dev

-      - libelf-dev

-      - libdw-dev

-

-rust:

-  - nightly

-  - beta

-  - stable

-

-# load travis-cargo

-before_script:

-  - |

-      pip install 'travis-cargo<0.2' --user &&

-      export PATH=$HOME/.local/bin:$PATH

-

-script:

-  - |

-      travis-cargo build &&

-      travis-cargo test

-      travis-cargo --only stable doc

-after_success:

-  # measure code coverage and upload to coveralls.io

-  - travis-cargo coveralls --no-sudo

-

-env:

-  global:

-    # override the default `--features unstable` used for the nightly branch (optional)

-    - TRAVIS_CARGO_NIGHTLY_FEATURE=nightly
\ No newline at end of file
diff --git a/third_party/rust/ansi_term/v0_11/crate/Cargo.toml b/third_party/rust/ansi_term/v0_11/crate/Cargo.toml
deleted file mode 100644
index 56a7f2d..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/Cargo.toml
+++ /dev/null
@@ -1,27 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g. crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-name = "ansi_term"
-version = "0.11.0"
-authors = ["ogham@bsago.me", "Ryan Scheel (Havvy) <ryan.havvy@gmail.com>", "Josh Triplett <josh@joshtriplett.org>"]
-description = "Library for ANSI terminal colours and styles (bold, underline)"
-homepage = "https://github.com/ogham/rust-ansi-term"
-documentation = "https://docs.rs/ansi_term"
-readme = "README.md"
-license = "MIT"
-
-[lib]
-name = "ansi_term"
-[target."cfg(target_os=\"windows\")".dependencies.winapi]
-version = "0.3.4"
-features = ["errhandlingapi", "consoleapi", "processenv"]
diff --git a/third_party/rust/ansi_term/v0_11/crate/Cargo.toml.orig b/third_party/rust/ansi_term/v0_11/crate/Cargo.toml.orig
deleted file mode 100644
index a09fd71..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/Cargo.toml.orig
+++ /dev/null
@@ -1,17 +0,0 @@
-[package]

-name = "ansi_term"

-description = "Library for ANSI terminal colours and styles (bold, underline)"

-

-authors = [ "ogham@bsago.me", "Ryan Scheel (Havvy) <ryan.havvy@gmail.com>", "Josh Triplett <josh@joshtriplett.org>" ]

-documentation = "https://docs.rs/ansi_term"

-homepage = "https://github.com/ogham/rust-ansi-term"

-license = "MIT"

-readme = "README.md"

-version = "0.11.0"

-

-[lib]

-name = "ansi_term"

-

-[target.'cfg(target_os="windows")'.dependencies.winapi]

-version = "0.3.4"

-features = ["errhandlingapi", "consoleapi", "processenv"]

diff --git a/third_party/rust/ansi_term/v0_11/crate/LICENCE b/third_party/rust/ansi_term/v0_11/crate/LICENCE
deleted file mode 100644
index 3f39e72..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/LICENCE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)

-

-Copyright (c) 2014 Benjamin Sago

-

-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/rust/ansi_term/v0_11/crate/README.md b/third_party/rust/ansi_term/v0_11/crate/README.md
deleted file mode 100644
index 7c31821..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/README.md
+++ /dev/null
@@ -1,174 +0,0 @@
-# rust-ansi-term [![ansi-term on crates.io](http://meritbadge.herokuapp.com/ansi-term)](https://crates.io/crates/ansi_term) [![Build status](https://travis-ci.org/ogham/rust-ansi-term.svg?branch=master)](https://travis-ci.org/ogham/rust-ansi-term) [![Coverage status](https://coveralls.io/repos/ogham/rust-ansi-term/badge.svg?branch=master&service=github)](https://coveralls.io/github/ogham/rust-ansi-term?branch=master)
-
-This is a library for controlling colours and formatting, such as red bold text or blue underlined text, on ANSI terminals.
-
-### [View the Rustdoc](https://docs.rs/ansi_term/0.9.0/ansi_term/)
-
-
-# Installation
-
-This crate works with [Cargo](http://crates.io). Add the following to your `Cargo.toml` dependencies section:
-
-```toml
-[dependencies]
-ansi_term = "0.9"
-```
-
-
-## Basic usage
-
-There are two main data structures in this crate that you need to be concerned with: `ANSIString` and `Style`.
-A `Style` holds stylistic information: colours, whether the text should be bold, or blinking, or whatever.
-There are also `Colour` variants that represent simple foreground colour styles.
-An `ANSIString` is a string paired with a `Style`.
-
-(Yes, it’s British English, but you won’t have to write “colour” very often. `Style` is used the majority of the time.)
-
-To format a string, call the `paint` method on a `Style` or a `Colour`, passing in the string you want to format as the argument.
-For example, here’s how to get some red text:
-
-```rust
-use ansi_term::Colour::Red;
-println!("This is in red: {}", Red.paint("a red string"));
-```
-
-It’s important to note that the `paint` method does *not* actually return a string with the ANSI control characters surrounding it.
-Instead, it returns an `ANSIString` value that has a `Display` implementation that, when formatted, returns the characters.
-This allows strings to be printed with a minimum of `String` allocations being performed behind the scenes.
-
-If you *do* want to get at the escape codes, then you can convert the `ANSIString` to a string as you would any other `Display` value:
-
-```rust
-use ansi_term::Colour::Red;
-use std::string::ToString;
-let red_string = Red.paint("a red string").to_string();
-```
-
-**Note for Windows 10 users:** On Windows 10, the application must enable ANSI support first:
-
-```rust
-let enabled = ansi_term::enable_ansi_support();
-```
-
-## Bold, underline, background, and other styles
-
-For anything more complex than plain foreground colour changes, you need to construct `Style` objects themselves, rather than beginning with a `Colour`.
-You can do this by chaining methods based on a new `Style`, created with `Style::new()`.
-Each method creates a new style that has that specific property set.
-For example:
-
-```rust
-use ansi_term::Style;
-println!("How about some {} and {}?",
-         Style::new().bold().paint("bold"),
-         Style::new().underline().paint("underline"));
-```
-
-For brevity, these methods have also been implemented for `Colour` values, so you can give your styles a foreground colour without having to begin with an empty `Style` value:
-
-```rust
-use ansi_term::Colour::{Blue, Yellow};
-println!("Demonstrating {} and {}!",
-         Blue.bold().paint("blue bold"),
-         Yellow.underline().paint("yellow underline"));
-println!("Yellow on blue: {}", Yellow.on(Blue).paint("wow!"));
-```
-
-The complete list of styles you can use are:
-`bold`, `dimmed`, `italic`, `underline`, `blink`, `reverse`, `hidden`, and `on` for background colours.
-
-In some cases, you may find it easier to change the foreground on an existing `Style` rather than starting from the appropriate `Colour`.
-You can do this using the `fg` method:
-
-```rust
-    use ansi_term::Style;
-    use ansi_term::Colour::{Blue, Cyan, Yellow};
-    println!("Yellow on blue: {}", Style::new().on(Blue).fg(Yellow).paint("yow!"));
-    println!("Also yellow on blue: {}", Cyan.on(Blue).fg(Yellow).paint("zow!"));
-```
-
-Finally, you can turn a `Colour` into a `Style` with the `normal` method.
-This will produce the exact same `ANSIString` as if you just used the `paint` method on the `Colour` directly, but it’s useful in certain cases: for example, you may have a method that returns `Styles`, and need to represent both the “red bold” and “red, but not bold” styles with values of the same type. The `Style` struct also has a `Default` implementation if you want to have a style with *nothing* set.
-
-```rust
-use ansi_term::Style;
-use ansi_term::Colour::Red;
-Red.normal().paint("yet another red string");
-Style::default().paint("a completely regular string");
-```
-
-
-## Extended colours
-
-You can access the extended range of 256 colours by using the `Fixed` colour variant, which takes an argument of the colour number to use.
-This can be included wherever you would use a `Colour`:
-
-```rust
-use ansi_term::Colour::Fixed;
-Fixed(134).paint("A sort of light purple");
-Fixed(221).on(Fixed(124)).paint("Mustard in the ketchup");
-```
-
-The first sixteen of these values are the same as the normal and bold standard colour variants.
-There’s nothing stopping you from using these as `Fixed` colours instead, but there’s nothing to be gained by doing so either.
-
-You can also access full 24-bit color by using the `RGB` colour variant, which takes separate `u8` arguments for red, green, and blue:
-
-```rust
-    use ansi_term::Colour::RGB;
-    RGB(70, 130, 180).paint("Steel blue");
-```
-
-## Combining successive coloured strings
-
-The benefit of writing ANSI escape codes to the terminal is that they *stack*: you do not need to end every coloured string with a reset code if the text that follows it is of a similar style.
-For example, if you want to have some blue text followed by some blue bold text, it’s possible to send the ANSI code for blue, followed by the ANSI code for bold, and finishing with a reset code without having to have an extra one between the two strings.
-
-This crate can optimise the ANSI codes that get printed in situations like this, making life easier for your terminal renderer.
-The `ANSIStrings` struct takes a slice of several `ANSIString` values, and will iterate over each of them, printing only the codes for the styles that need to be updated as part of its formatting routine.
-
-The following code snippet uses this to enclose a binary number displayed in red bold text inside some red, but not bold, brackets:
-
-```rust
-use ansi_term::Colour::Red;
-use ansi_term::{ANSIString, ANSIStrings};
-let some_value = format!("{:b}", 42);
-let strings: &[ANSIString<'static>] = &[
-    Red.paint("["),
-    Red.bold().paint(some_value),
-    Red.paint("]"),
-];
-println!("Value: {}", ANSIStrings(strings));
-```
-
-There are several things to note here.
-Firstly, the `paint` method can take *either* an owned `String` or a borrowed `&str`.
-Internally, an `ANSIString` holds a copy-on-write (`Cow`) string value to deal with both owned and borrowed strings at the same time.
-This is used here to display a `String`, the result of the `format!` call, using the same mechanism as some statically-available `&str` slices.
-Secondly, that the `ANSIStrings` value works in the same way as its singular counterpart, with a `Display` implementation that only performs the formatting when required.
-
-## Byte strings
-
-This library also supports formatting `[u8]` byte strings; this supports
-applications working with text in an unknown encoding.  `Style` and
-`Color` support painting `[u8]` values, resulting in an `ANSIByteString`.
-This type does not implement `Display`, as it may not contain UTF-8, but
-it does provide a method `write_to` to write the result to any
-`io::Write`:
-
-```rust
-use ansi_term::Colour::Green;
-Green.paint("user data".as_bytes()).write_to(&mut std::io::stdout()).unwrap();
-```
-
-Similarly, the type `ANSIByteStrings` supports writing a list of
-`ANSIByteString` values with minimal escape sequences:
-
-```rust
-use ansi_term::Colour::Green;
-use ansi_term::ANSIByteStrings;
-ANSIByteStrings(&[
-    Green.paint("user data 1\n".as_bytes()),
-    Green.bold().paint("user data 2\n".as_bytes()),
-]).write_to(&mut std::io::stdout()).unwrap();
-```
diff --git a/third_party/rust/ansi_term/v0_11/crate/examples/colours.rs b/third_party/rust/ansi_term/v0_11/crate/examples/colours.rs
deleted file mode 100644
index 9ee7458..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/examples/colours.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-extern crate ansi_term;
-use ansi_term::Colour::*;
-
-fn main() {
-    println!("{}", Black.paint("Black"));
-    println!("{}", Red.paint("Red"));
-    println!("{}", Green.paint("Green"));
-    println!("{}", Yellow.paint("Yellow"));
-    println!("{}", Blue.paint("Blue"));
-    println!("{}", Purple.paint("Purple"));
-    println!("{}", Cyan.paint("Cyan"));
-    println!("{}", White.paint("White"));
-}
diff --git a/third_party/rust/ansi_term/v0_11/crate/src/ansi.rs b/third_party/rust/ansi_term/v0_11/crate/src/ansi.rs
deleted file mode 100644
index d9e6569..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/src/ansi.rs
+++ /dev/null
@@ -1,258 +0,0 @@
-use style::{Colour, Style};
-
-use std::fmt;
-
-use write::AnyWrite;
-
-
-// ---- generating ANSI codes ----
-
-impl Style {
-
-    /// Write any ANSI codes that go *before* a piece of text. These should be
-    /// the codes to set the terminal to a different colour or font style.
-    fn write_prefix<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
-
-        // If there are actually no styles here, then don’t write *any* codes
-        // as the prefix. An empty ANSI code may not affect the terminal
-        // output at all, but a user may just want a code-free string.
-        if self.is_plain() {
-            return Ok(());
-        }
-
-        // Write the codes’ prefix, then write numbers, separated by
-        // semicolons, for each text style we want to apply.
-        write!(f, "\x1B[")?;
-        let mut written_anything = false;
-
-        {
-            let mut write_char = |c| {
-                if written_anything { write!(f, ";")?; }
-                written_anything = true;
-                write!(f, "{}", c)?;
-                Ok(())
-            };
-
-            if self.is_bold           { write_char('1')? }
-            if self.is_dimmed         { write_char('2')? }
-            if self.is_italic         { write_char('3')? }
-            if self.is_underline      { write_char('4')? }
-            if self.is_blink          { write_char('5')? }
-            if self.is_reverse        { write_char('7')? }
-            if self.is_hidden         { write_char('8')? }
-            if self.is_strikethrough  { write_char('9')? }
-        }
-
-        // The foreground and background colours, if specified, need to be
-        // handled specially because the number codes are more complicated.
-        // (see `write_background_code` and `write_foreground_code`)
-        if let Some(bg) = self.background {
-            if written_anything { write!(f, ";")?; }
-            written_anything = true;
-            bg.write_background_code(f)?;
-        }
-
-        if let Some(fg) = self.foreground {
-            if written_anything { write!(f, ";")?; }
-            fg.write_foreground_code(f)?;
-        }
-
-        // All the codes end with an `m`, because reasons.
-        write!(f, "m")?;
-
-        Ok(())
-    }
-
-    /// Write any ANSI codes that go *after* a piece of text. These should be
-    /// the codes to *reset* the terminal back to its normal colour and style.
-    fn write_suffix<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
-        if self.is_plain() {
-            Ok(())
-        }
-        else {
-            write!(f, "{}", RESET)
-        }
-    }
-}
-
-
-/// The code to send to reset all styles and return to `Style::default()`.
-pub static RESET: &str = "\x1B[0m";
-
-
-
-impl Colour {
-    fn write_foreground_code<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
-        match *self {
-            Colour::Black      => write!(f, "30"),
-            Colour::Red        => write!(f, "31"),
-            Colour::Green      => write!(f, "32"),
-            Colour::Yellow     => write!(f, "33"),
-            Colour::Blue       => write!(f, "34"),
-            Colour::Purple     => write!(f, "35"),
-            Colour::Cyan       => write!(f, "36"),
-            Colour::White      => write!(f, "37"),
-            Colour::Fixed(num) => write!(f, "38;5;{}", &num),
-            Colour::RGB(r,g,b) => write!(f, "38;2;{};{};{}", &r, &g, &b),
-        }
-    }
-
-    fn write_background_code<W: AnyWrite + ?Sized>(&self, f: &mut W) -> Result<(), W::Error> {
-        match *self {
-            Colour::Black      => write!(f, "40"),
-            Colour::Red        => write!(f, "41"),
-            Colour::Green      => write!(f, "42"),
-            Colour::Yellow     => write!(f, "43"),
-            Colour::Blue       => write!(f, "44"),
-            Colour::Purple     => write!(f, "45"),
-            Colour::Cyan       => write!(f, "46"),
-            Colour::White      => write!(f, "47"),
-            Colour::Fixed(num) => write!(f, "48;5;{}", &num),
-            Colour::RGB(r,g,b) => write!(f, "48;2;{};{};{}", &r, &g, &b),
-        }
-    }
-}
-
-
-/// Like `ANSIString`, but only displays the style prefix.
-#[derive(Clone, Copy, Debug)]
-pub struct Prefix(Style);
-
-/// Like `ANSIString`, but only displays the difference between two
-/// styles.
-#[derive(Clone, Copy, Debug)]
-pub struct Infix(Style, Style);
-
-/// Like `ANSIString`, but only displays the style suffix.
-#[derive(Clone, Copy, Debug)]
-pub struct Suffix(Style);
-
-
-impl Style {
-
-    /// The prefix for this style.
-    pub fn prefix(self) -> Prefix {
-        Prefix(self)
-    }
-
-    /// The infix between this style and another.
-    pub fn infix(self, other: Style) -> Infix {
-        Infix(self, other)
-    }
-
-    /// The suffix for this style.
-    pub fn suffix(self) -> Suffix {
-        Suffix(self)
-    }
-}
-
-
-impl Colour {
-
-    /// The prefix for this colour.
-    pub fn prefix(self) -> Prefix {
-        Prefix(self.normal())
-    }
-
-    /// The infix between this colour and another.
-    pub fn infix(self, other: Colour) -> Infix {
-        Infix(self.normal(), other.normal())
-    }
-
-    /// The suffix for this colour.
-    pub fn suffix(self) -> Suffix {
-        Suffix(self.normal())
-    }
-}
-
-
-impl fmt::Display for Prefix {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let f: &mut fmt::Write = f;
-        self.0.write_prefix(f)
-    }
-}
-
-
-impl fmt::Display for Infix {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        use difference::Difference;
-
-        match Difference::between(&self.0, &self.1) {
-            Difference::ExtraStyles(style) => {
-                let f: &mut fmt::Write = f;
-                style.write_prefix(f)
-            },
-            Difference::Reset => {
-                let f: &mut fmt::Write = f;
-                write!(f, "{}{}", RESET, self.0.prefix())
-            },
-            Difference::NoDifference => {
-                Ok(())   // nothing to write
-            },
-        }
-    }
-}
-
-
-impl fmt::Display for Suffix {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let f: &mut fmt::Write = f;
-        self.0.write_suffix(f)
-    }
-}
-
-
-
-#[cfg(test)]
-mod test {
-    use style::Style;
-    use style::Colour::*;
-
-    macro_rules! test {
-        ($name: ident: $style: expr; $input: expr => $result: expr) => {
-            #[test]
-            fn $name() {
-                assert_eq!($style.paint($input).to_string(), $result.to_string());
-
-                let mut v = Vec::new();
-                $style.paint($input.as_bytes()).write_to(&mut v).unwrap();
-                assert_eq!(v.as_slice(), $result.as_bytes());
-            }
-        };
-    }
-
-    test!(plain:                 Style::default();                  "text/plain" => "text/plain");
-    test!(red:                   Red;                               "hi" => "\x1B[31mhi\x1B[0m");
-    test!(black:                 Black.normal();                    "hi" => "\x1B[30mhi\x1B[0m");
-    test!(yellow_bold:           Yellow.bold();                     "hi" => "\x1B[1;33mhi\x1B[0m");
-    test!(yellow_bold_2:         Yellow.normal().bold();            "hi" => "\x1B[1;33mhi\x1B[0m");
-    test!(blue_underline:        Blue.underline();                  "hi" => "\x1B[4;34mhi\x1B[0m");
-    test!(green_bold_ul:         Green.bold().underline();          "hi" => "\x1B[1;4;32mhi\x1B[0m");
-    test!(green_bold_ul_2:       Green.underline().bold();          "hi" => "\x1B[1;4;32mhi\x1B[0m");
-    test!(purple_on_white:       Purple.on(White);                  "hi" => "\x1B[47;35mhi\x1B[0m");
-    test!(purple_on_white_2:     Purple.normal().on(White);         "hi" => "\x1B[47;35mhi\x1B[0m");
-    test!(yellow_on_blue:        Style::new().on(Blue).fg(Yellow);  "hi" => "\x1B[44;33mhi\x1B[0m");
-    test!(yellow_on_blue_2:      Cyan.on(Blue).fg(Yellow);          "hi" => "\x1B[44;33mhi\x1B[0m");
-    test!(cyan_bold_on_white:    Cyan.bold().on(White);             "hi" => "\x1B[1;47;36mhi\x1B[0m");
-    test!(cyan_ul_on_white:      Cyan.underline().on(White);        "hi" => "\x1B[4;47;36mhi\x1B[0m");
-    test!(cyan_bold_ul_on_white: Cyan.bold().underline().on(White); "hi" => "\x1B[1;4;47;36mhi\x1B[0m");
-    test!(cyan_ul_bold_on_white: Cyan.underline().bold().on(White); "hi" => "\x1B[1;4;47;36mhi\x1B[0m");
-    test!(fixed:                 Fixed(100);                        "hi" => "\x1B[38;5;100mhi\x1B[0m");
-    test!(fixed_on_purple:       Fixed(100).on(Purple);             "hi" => "\x1B[45;38;5;100mhi\x1B[0m");
-    test!(fixed_on_fixed:        Fixed(100).on(Fixed(200));         "hi" => "\x1B[48;5;200;38;5;100mhi\x1B[0m");
-    test!(rgb:                   RGB(70,130,180);                   "hi" => "\x1B[38;2;70;130;180mhi\x1B[0m");
-    test!(rgb_on_blue:           RGB(70,130,180).on(Blue);          "hi" => "\x1B[44;38;2;70;130;180mhi\x1B[0m");
-    test!(blue_on_rgb:           Blue.on(RGB(70,130,180));          "hi" => "\x1B[48;2;70;130;180;34mhi\x1B[0m");
-    test!(rgb_on_rgb:            RGB(70,130,180).on(RGB(5,10,15));  "hi" => "\x1B[48;2;5;10;15;38;2;70;130;180mhi\x1B[0m");
-    test!(bold:                  Style::new().bold();               "hi" => "\x1B[1mhi\x1B[0m");
-    test!(underline:             Style::new().underline();          "hi" => "\x1B[4mhi\x1B[0m");
-    test!(bunderline:            Style::new().bold().underline();   "hi" => "\x1B[1;4mhi\x1B[0m");
-    test!(dimmed:                Style::new().dimmed();             "hi" => "\x1B[2mhi\x1B[0m");
-    test!(italic:                Style::new().italic();             "hi" => "\x1B[3mhi\x1B[0m");
-    test!(blink:                 Style::new().blink();              "hi" => "\x1B[5mhi\x1B[0m");
-    test!(reverse:               Style::new().reverse();            "hi" => "\x1B[7mhi\x1B[0m");
-    test!(hidden:                Style::new().hidden();             "hi" => "\x1B[8mhi\x1B[0m");
-    test!(stricken:              Style::new().strikethrough();      "hi" => "\x1B[9mhi\x1B[0m");
-
-}
diff --git a/third_party/rust/ansi_term/v0_11/crate/src/debug.rs b/third_party/rust/ansi_term/v0_11/crate/src/debug.rs
deleted file mode 100644
index d8cd973..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/src/debug.rs
+++ /dev/null
@@ -1,122 +0,0 @@
-use std::fmt;
-
-use style::Style;
-
-
-/// Styles have a special `Debug` implementation that only shows the fields that
-/// are set. Fields that haven’t been touched aren’t included in the output.
-///
-/// This behaviour gets bypassed when using the alternate formatting mode
-/// `format!("{:#?}")`.
-///
-///     use ansi_term::Colour::{Red, Blue};
-///     assert_eq!("Style { fg(Red), on(Blue), bold, italic }",
-///                format!("{:?}", Red.on(Blue).bold().italic()));
-impl fmt::Debug for Style {
-    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
-        if fmt.alternate() {
-            fmt.debug_struct("Style")
-               .field("foreground",    &self.foreground)
-               .field("background",    &self.background)
-               .field("blink",         &self.is_blink)
-               .field("bold",          &self.is_bold)
-               .field("dimmed",        &self.is_dimmed)
-               .field("hidden",        &self.is_hidden)
-               .field("italic",        &self.is_italic)
-               .field("reverse",       &self.is_reverse)
-               .field("strikethrough", &self.is_strikethrough)
-               .field("underline",     &self.is_underline)
-               .finish()
-        }
-        else if self.is_plain() {
-            fmt.write_str("Style {}")
-        }
-        else {
-            fmt.write_str("Style { ")?;
-
-            let mut written_anything = false;
-
-            if let Some(fg) = self.foreground {
-                if written_anything { fmt.write_str(", ")? }
-                written_anything = true;
-                write!(fmt, "fg({:?})", fg)?
-            }
-
-            if let Some(bg) = self.background {
-                if written_anything { fmt.write_str(", ")? }
-                written_anything = true;
-                write!(fmt, "on({:?})", bg)?
-            }
-
-            {
-                let mut write_flag = |name| {
-                    if written_anything { fmt.write_str(", ")? }
-                    written_anything = true;
-                    fmt.write_str(name)
-                };
-
-                if self.is_blink          { write_flag("blink")? }
-                if self.is_bold           { write_flag("bold")? }
-                if self.is_dimmed         { write_flag("dimmed")? }
-                if self.is_hidden         { write_flag("hidden")? }
-                if self.is_italic         { write_flag("italic")? }
-                if self.is_reverse        { write_flag("reverse")? }
-                if self.is_strikethrough  { write_flag("strikethrough")? }
-                if self.is_underline      { write_flag("underline")? }
-            }
-
-            write!(fmt, " }}")
-        }
-    }
-}
-
-
-#[cfg(test)]
-mod test {
-    use style::Colour::*;
-    use style::Style;
-
-    fn style() -> Style {
-        Style::new()
-    }
-
-    macro_rules! test {
-        ($name: ident: $obj: expr => $result: expr) => {
-            #[test]
-            fn $name() {
-                assert_eq!($result, format!("{:?}", $obj));
-            }
-        };
-    }
-
-    test!(empty:   style()                  => "Style {}");
-    test!(bold:    style().bold()           => "Style { bold }");
-    test!(italic:  style().italic()         => "Style { italic }");
-    test!(both:    style().bold().italic()  => "Style { bold, italic }");
-
-    test!(red:     Red.normal()                     => "Style { fg(Red) }");
-    test!(redblue: Red.normal().on(RGB(3, 2, 4))    => "Style { fg(Red), on(RGB(3, 2, 4)) }");
-
-    test!(everything:
-            Red.on(Blue).blink().bold().dimmed().hidden().italic().reverse().strikethrough().underline() =>
-            "Style { fg(Red), on(Blue), blink, bold, dimmed, hidden, italic, reverse, strikethrough, underline }");
-
-    #[test]
-    fn long_and_detailed() {
-        let debug = r##"Style {
-    foreground: Some(
-        Blue
-    ),
-    background: None,
-    blink: false,
-    bold: true,
-    dimmed: false,
-    hidden: false,
-    italic: false,
-    reverse: false,
-    strikethrough: false,
-    underline: false
-}"##;
-        assert_eq!(debug, format!("{:#?}", Blue.bold()));
-    }
-}
diff --git a/third_party/rust/ansi_term/v0_11/crate/src/difference.rs b/third_party/rust/ansi_term/v0_11/crate/src/difference.rs
deleted file mode 100644
index b0de07f7..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/src/difference.rs
+++ /dev/null
@@ -1,179 +0,0 @@
-use super::Style;
-
-
-/// When printing out one coloured string followed by another, use one of
-/// these rules to figure out which *extra* control codes need to be sent.
-#[derive(PartialEq, Clone, Copy, Debug)]
-pub enum Difference {
-
-    /// Print out the control codes specified by this style to end up looking
-    /// like the second string's styles.
-    ExtraStyles(Style),
-
-    /// Converting between these two is impossible, so just send a reset
-    /// command and then the second string's styles.
-    Reset,
-
-    /// The before style is exactly the same as the after style, so no further
-    /// control codes need to be printed.
-    NoDifference,
-}
-
-
-impl Difference {
-
-    /// Compute the 'style difference' required to turn an existing style into
-    /// the given, second style.
-    ///
-    /// For example, to turn green text into green bold text, it's redundant
-    /// to write a reset command then a second green+bold command, instead of
-    /// just writing one bold command. This method should see that both styles
-    /// use the foreground colour green, and reduce it to a single command.
-    ///
-    /// This method returns an enum value because it's not actually always
-    /// possible to turn one style into another: for example, text could be
-    /// made bold and underlined, but you can't remove the bold property
-    /// without also removing the underline property. So when this has to
-    /// happen, this function returns None, meaning that the entire set of
-    /// styles should be reset and begun again.
-    pub fn between(first: &Style, next: &Style) -> Difference {
-        use self::Difference::*;
-
-        // XXX(Havvy): This algorithm is kind of hard to replicate without
-        // having the Plain/Foreground enum variants, so I'm just leaving
-        // it commented out for now, and defaulting to Reset.
-
-        if first == next {
-            return NoDifference;
-        }
-
-        // Cannot un-bold, so must Reset.
-        if first.is_bold && !next.is_bold {
-            return Reset;
-        }
-
-        if first.is_dimmed && !next.is_dimmed {
-            return Reset;
-        }
-
-        if first.is_italic && !next.is_italic {
-            return Reset;
-        }
-
-        // Cannot un-underline, so must Reset.
-        if first.is_underline && !next.is_underline {
-            return Reset;
-        }
-
-        if first.is_blink && !next.is_blink {
-            return Reset;
-        }
-
-        if first.is_reverse && !next.is_reverse {
-            return Reset;
-        }
-
-        if first.is_hidden && !next.is_hidden {
-            return Reset;
-        }
-
-        if first.is_strikethrough && !next.is_strikethrough {
-            return Reset;
-        }
-
-        // Cannot go from foreground to no foreground, so must Reset.
-        if first.foreground.is_some() && next.foreground.is_none() {
-            return Reset;
-        }
-
-        // Cannot go from background to no background, so must Reset.
-        if first.background.is_some() && next.background.is_none() {
-            return Reset;
-        }
-
-        let mut extra_styles = Style::default();
-
-        if first.is_bold != next.is_bold {
-            extra_styles.is_bold = true;
-        }
-
-        if first.is_dimmed != next.is_dimmed {
-            extra_styles.is_dimmed = true;
-        }
-
-        if first.is_italic != next.is_italic {
-            extra_styles.is_italic = true;
-        }
-
-        if first.is_underline != next.is_underline {
-            extra_styles.is_underline = true;
-        }
-
-        if first.is_blink != next.is_blink {
-            extra_styles.is_blink = true;
-        }
-
-        if first.is_reverse != next.is_reverse {
-            extra_styles.is_reverse = true;
-        }
-
-        if first.is_hidden != next.is_hidden {
-            extra_styles.is_hidden = true;
-        }
-
-        if first.is_strikethrough != next.is_strikethrough {
-            extra_styles.is_strikethrough = true;
-        }
-
-        if first.foreground != next.foreground {
-            extra_styles.foreground = next.foreground;
-        }
-
-        if first.background != next.background {
-            extra_styles.background = next.background;
-        }
-
-        ExtraStyles(extra_styles)
-    }
-}
-
-
-#[cfg(test)]
-mod test {
-    use super::*;
-    use super::Difference::*;
-    use style::Colour::*;
-    use style::Style;
-
-    fn style() -> Style {
-        Style::new()
-    }
-
-    macro_rules! test {
-        ($name: ident: $first: expr; $next: expr => $result: expr) => {
-            #[test]
-            fn $name() {
-                assert_eq!($result, Difference::between(&$first, &$next));
-            }
-        };
-    }
-
-    test!(nothing:    Green.normal(); Green.normal()  => NoDifference);
-    test!(uppercase:  Green.normal(); Green.bold()    => ExtraStyles(style().bold()));
-    test!(lowercase:  Green.bold();   Green.normal()  => Reset);
-    test!(nothing2:   Green.bold();   Green.bold()    => NoDifference);
-
-    test!(colour_change: Red.normal(); Blue.normal() => ExtraStyles(Blue.normal()));
-
-    test!(addition_of_blink:          style(); style().blink()          => ExtraStyles(style().blink()));
-    test!(addition_of_dimmed:         style(); style().dimmed()         => ExtraStyles(style().dimmed()));
-    test!(addition_of_hidden:         style(); style().hidden()         => ExtraStyles(style().hidden()));
-    test!(addition_of_reverse:        style(); style().reverse()        => ExtraStyles(style().reverse()));
-    test!(addition_of_strikethrough:  style(); style().strikethrough()  => ExtraStyles(style().strikethrough()));
-
-    test!(removal_of_strikethrough:   style().strikethrough(); style()  => Reset);
-    test!(removal_of_reverse:         style().reverse();       style()  => Reset);
-    test!(removal_of_hidden:          style().hidden();        style()  => Reset);
-    test!(removal_of_dimmed:          style().dimmed();        style()  => Reset);
-    test!(removal_of_blink:           style().blink();         style()  => Reset);
-}
diff --git a/third_party/rust/ansi_term/v0_11/crate/src/display.rs b/third_party/rust/ansi_term/v0_11/crate/src/display.rs
deleted file mode 100644
index 75a5939..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/src/display.rs
+++ /dev/null
@@ -1,279 +0,0 @@
-use std::borrow::Cow;
-use std::fmt;
-use std::io;
-use std::ops::Deref;
-
-use ansi::RESET;
-use difference::Difference;
-use style::{Style, Colour};
-use write::AnyWrite;
-
-
-/// An `ANSIGenericString` includes a generic string type and a `Style` to
-/// display that string.  `ANSIString` and `ANSIByteString` are aliases for
-/// this type on `str` and `[u8]`, respectively.
-#[derive(PartialEq, Debug)]
-pub struct ANSIGenericString<'a, S: 'a + ToOwned + ?Sized>
-where <S as ToOwned>::Owned: fmt::Debug {
-    style: Style,
-    string: Cow<'a, S>,
-}
-
-
-/// Cloning an `ANSIGenericString` will clone its underlying string.
-///
-/// ### Examples
-///
-/// ```
-/// use ansi_term::ANSIString;
-///
-/// let plain_string = ANSIString::from("a plain string");
-/// let clone_string = plain_string.clone();
-/// assert_eq!(clone_string, plain_string);
-/// ```
-impl<'a, S: 'a + ToOwned + ?Sized> Clone for ANSIGenericString<'a, S>
-where <S as ToOwned>::Owned: fmt::Debug {
-    fn clone(&self) -> ANSIGenericString<'a, S> {
-        ANSIGenericString {
-            style: self.style,
-            string: self.string.clone(),
-        }
-    }
-}
-
-// You might think that the hand-written Clone impl above is the same as the
-// one that gets generated with #[derive]. But it’s not *quite* the same!
-//
-// `str` is not Clone, and the derived Clone implementation puts a Clone
-// constraint on the S type parameter (generated using --pretty=expanded):
-//
-//                  ↓_________________↓
-//     impl <'a, S: ::std::clone::Clone + 'a + ToOwned + ?Sized> ::std::clone::Clone
-//     for ANSIGenericString<'a, S> where
-//     <S as ToOwned>::Owned: fmt::Debug { ... }
-//
-// This resulted in compile errors when you tried to derive Clone on a type
-// that used it:
-//
-//     #[derive(PartialEq, Debug, Clone, Default)]
-//     pub struct TextCellContents(Vec<ANSIString<'static>>);
-//                                 ^^^^^^^^^^^^^^^^^^^^^^^^^
-//     error[E0277]: the trait `std::clone::Clone` is not implemented for `str`
-//
-// The hand-written impl above can ignore that constraint and still compile.
-
-
-
-/// An ANSI String is a string coupled with the `Style` to display it
-/// in a terminal.
-///
-/// Although not technically a string itself, it can be turned into
-/// one with the `to_string` method.
-///
-/// ### Examples
-///
-/// ```no_run
-/// use ansi_term::ANSIString;
-/// use ansi_term::Colour::Red;
-///
-/// let red_string = Red.paint("a red string");
-/// println!("{}", red_string);
-/// ```
-///
-/// ```
-/// use ansi_term::ANSIString;
-///
-/// let plain_string = ANSIString::from("a plain string");
-/// assert_eq!(&*plain_string, "a plain string");
-/// ```
-pub type ANSIString<'a> = ANSIGenericString<'a, str>;
-
-/// An `ANSIByteString` represents a formatted series of bytes.  Use
-/// `ANSIByteString` when styling text with an unknown encoding.
-pub type ANSIByteString<'a> = ANSIGenericString<'a, [u8]>;
-
-impl<'a, I, S: 'a + ToOwned + ?Sized> From<I> for ANSIGenericString<'a, S>
-where I: Into<Cow<'a, S>>,
-      <S as ToOwned>::Owned: fmt::Debug {
-    fn from(input: I) -> ANSIGenericString<'a, S> {
-        ANSIGenericString {
-            string: input.into(),
-            style:  Style::default(),
-        }
-    }
-}
-
-impl<'a, S: 'a + ToOwned + ?Sized> Deref for ANSIGenericString<'a, S>
-where <S as ToOwned>::Owned: fmt::Debug {
-    type Target = S;
-
-    fn deref(&self) -> &S {
-        self.string.deref()
-    }
-}
-
-
-/// A set of `ANSIGenericString`s collected together, in order to be
-/// written with a minimum of control characters.
-pub struct ANSIGenericStrings<'a, S: 'a + ToOwned + ?Sized>
-    (pub &'a [ANSIGenericString<'a, S>])
-    where <S as ToOwned>::Owned: fmt::Debug;
-
-/// A set of `ANSIString`s collected together, in order to be written with a
-/// minimum of control characters.
-pub type ANSIStrings<'a> = ANSIGenericStrings<'a, str>;
-
-/// A function to construct an `ANSIStrings` instance.
-#[allow(non_snake_case)]
-pub fn ANSIStrings<'a>(arg: &'a [ANSIString<'a>]) -> ANSIStrings<'a> {
-    ANSIGenericStrings(arg)
-}
-
-/// A set of `ANSIByteString`s collected together, in order to be
-/// written with a minimum of control characters.
-pub type ANSIByteStrings<'a> = ANSIGenericStrings<'a, [u8]>;
-
-/// A function to construct an `ANSIByteStrings` instance.
-#[allow(non_snake_case)]
-pub fn ANSIByteStrings<'a>(arg: &'a [ANSIByteString<'a>]) -> ANSIByteStrings<'a> {
-    ANSIGenericStrings(arg)
-}
-
-
-// ---- paint functions ----
-
-impl Style {
-
-    /// Paints the given text with this colour, returning an ANSI string.
-    pub fn paint<'a, I, S: 'a + ToOwned + ?Sized>(self, input: I) -> ANSIGenericString<'a, S>
-    where I: Into<Cow<'a, S>>,
-          <S as ToOwned>::Owned: fmt::Debug {
-        ANSIGenericString {
-            string: input.into(),
-            style:  self,
-        }
-    }
-}
-
-
-impl Colour {
-
-    /// Paints the given text with this colour, returning an ANSI string.
-    /// This is a short-cut so you don’t have to use `Blue.normal()` just
-    /// to get blue text.
-    ///
-    /// ```
-    /// use ansi_term::Colour::Blue;
-    /// println!("{}", Blue.paint("da ba dee"));
-    /// ```
-    pub fn paint<'a, I, S: 'a + ToOwned + ?Sized>(self, input: I) -> ANSIGenericString<'a, S>
-    where I: Into<Cow<'a, S>>,
-          <S as ToOwned>::Owned: fmt::Debug {
-        ANSIGenericString {
-            string: input.into(),
-            style:  self.normal(),
-        }
-    }
-}
-
-
-// ---- writers for individual ANSI strings ----
-
-impl<'a> fmt::Display for ANSIString<'a> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let w: &mut fmt::Write = f;
-        self.write_to_any(w)
-    }
-}
-
-impl<'a> ANSIByteString<'a> {
-    /// Write an `ANSIByteString` to an `io::Write`.  This writes the escape
-    /// sequences for the associated `Style` around the bytes.
-    pub fn write_to<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
-        let w: &mut io::Write = w;
-        self.write_to_any(w)
-    }
-}
-
-impl<'a, S: 'a + ToOwned + ?Sized> ANSIGenericString<'a, S>
-where <S as ToOwned>::Owned: fmt::Debug, &'a S: AsRef<[u8]> {
-    fn write_to_any<W: AnyWrite<wstr=S> + ?Sized>(&self, w: &mut W) -> Result<(), W::Error> {
-        write!(w, "{}", self.style.prefix())?;
-        w.write_str(self.string.as_ref())?;
-        write!(w, "{}", self.style.suffix())
-    }
-}
-
-
-// ---- writers for combined ANSI strings ----
-
-impl<'a> fmt::Display for ANSIStrings<'a> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        let f: &mut fmt::Write = f;
-        self.write_to_any(f)
-    }
-}
-
-impl<'a> ANSIByteStrings<'a> {
-    /// Write `ANSIByteStrings` to an `io::Write`.  This writes the minimal
-    /// escape sequences for the associated `Style`s around each set of
-    /// bytes.
-    pub fn write_to<W: io::Write>(&self, w: &mut W) -> io::Result<()> {
-        let w: &mut io::Write = w;
-        self.write_to_any(w)
-    }
-}
-
-impl<'a, S: 'a + ToOwned + ?Sized> ANSIGenericStrings<'a, S>
-where <S as ToOwned>::Owned: fmt::Debug, &'a S: AsRef<[u8]> {
-    fn write_to_any<W: AnyWrite<wstr=S> + ?Sized>(&self, w: &mut W) -> Result<(), W::Error> {
-        use self::Difference::*;
-
-        let first = match self.0.first() {
-            None => return Ok(()),
-            Some(f) => f,
-        };
-
-        write!(w, "{}", first.style.prefix())?;
-        w.write_str(first.string.as_ref())?;
-
-        for window in self.0.windows(2) {
-            match Difference::between(&window[0].style, &window[1].style) {
-                ExtraStyles(style) => write!(w, "{}", style.prefix())?,
-                Reset              => write!(w, "{}{}", RESET, window[1].style.prefix())?,
-                NoDifference       => {/* Do nothing! */},
-            }
-
-            w.write_str(&window[1].string)?;
-        }
-
-        // Write the final reset string after all of the ANSIStrings have been
-        // written, *except* if the last one has no styles, because it would
-        // have already been written by this point.
-        if let Some(last) = self.0.last() {
-            if !last.style.is_plain() {
-                write!(w, "{}", RESET)?;
-            }
-        }
-
-        Ok(())
-    }
-}
-
-
-// ---- tests ----
-
-#[cfg(test)]
-mod tests {
-    pub use super::super::ANSIStrings;
-    pub use style::Style;
-    pub use style::Colour::*;
-
-    #[test]
-    fn no_control_codes_for_plain() {
-        let one = Style::default().paint("one");
-        let two = Style::default().paint("two");
-        let output = format!("{}", ANSIStrings( &[ one, two ] ));
-        assert_eq!(&*output, "onetwo");
-    }
-}
diff --git a/third_party/rust/ansi_term/v0_11/crate/src/lib.rs b/third_party/rust/ansi_term/v0_11/crate/src/lib.rs
deleted file mode 100644
index 322efef..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/src/lib.rs
+++ /dev/null
@@ -1,205 +0,0 @@
-//! This is a library for controlling colours and formatting, such as
-//! red bold text or blue underlined text, on ANSI terminals.
-//!
-//!
-//! ## Basic usage
-//!
-//! There are two main data structures in this crate that you need to be
-//! concerned with: `ANSIString` and `Style`. A `Style` holds stylistic
-//! information: colours, whether the text should be bold, or blinking, or
-//! whatever. There are also `Colour` variants that represent simple foreground
-//! colour styles. An `ANSIString` is a string paired with a `Style`.
-//!
-//! (Yes, it’s British English, but you won’t have to write “colour” very often.
-//! `Style` is used the majority of the time.)
-//!
-//! To format a string, call the `paint` method on a `Style` or a `Colour`,
-//! passing in the string you want to format as the argument. For example,
-//! here’s how to get some red text:
-//!
-//!     use ansi_term::Colour::Red;
-//!     println!("This is in red: {}", Red.paint("a red string"));
-//!
-//! It’s important to note that the `paint` method does *not* actually return a
-//! string with the ANSI control characters surrounding it. Instead, it returns
-//! an `ANSIString` value that has a `Display` implementation that, when
-//! formatted, returns the characters. This allows strings to be printed with a
-//! minimum of `String` allocations being performed behind the scenes.
-//!
-//! If you *do* want to get at the escape codes, then you can convert the
-//! `ANSIString` to a string as you would any other `Display` value:
-//!
-//!     use ansi_term::Colour::Red;
-//!     use std::string::ToString;
-//!     let red_string = Red.paint("a red string").to_string();
-//!
-//!
-//! ## Bold, underline, background, and other styles
-//!
-//! For anything more complex than plain foreground colour changes, you need to
-//! construct `Style` objects themselves, rather than beginning with a `Colour`.
-//! You can do this by chaining methods based on a new `Style`, created with
-//! `Style::new()`. Each method creates a new style that has that specific
-//! property set. For example:
-//!
-//!     use ansi_term::Style;
-//!     println!("How about some {} and {}?",
-//!              Style::new().bold().paint("bold"),
-//!              Style::new().underline().paint("underline"));
-//!
-//! For brevity, these methods have also been implemented for `Colour` values,
-//! so you can give your styles a foreground colour without having to begin with
-//! an empty `Style` value:
-//!
-//!     use ansi_term::Colour::{Blue, Yellow};
-//!     println!("Demonstrating {} and {}!",
-//!              Blue.bold().paint("blue bold"),
-//!              Yellow.underline().paint("yellow underline"));
-//!     println!("Yellow on blue: {}", Yellow.on(Blue).paint("wow!"));
-//!
-//! The complete list of styles you can use are: `bold`, `dimmed`, `italic`,
-//! `underline`, `blink`, `reverse`, `hidden`, `strikethrough`, and `on` for
-//! background colours.
-//!
-//! In some cases, you may find it easier to change the foreground on an
-//! existing `Style` rather than starting from the appropriate `Colour`.
-//! You can do this using the `fg` method:
-//!
-//!     use ansi_term::Style;
-//!     use ansi_term::Colour::{Blue, Cyan, Yellow};
-//!     println!("Yellow on blue: {}", Style::new().on(Blue).fg(Yellow).paint("yow!"));
-//!     println!("Also yellow on blue: {}", Cyan.on(Blue).fg(Yellow).paint("zow!"));
-//!
-//! Finally, you can turn a `Colour` into a `Style` with the `normal` method.
-//! This will produce the exact same `ANSIString` as if you just used the
-//! `paint` method on the `Colour` directly, but it’s useful in certain cases:
-//! for example, you may have a method that returns `Styles`, and need to
-//! represent both the “red bold” and “red, but not bold” styles with values of
-//! the same type. The `Style` struct also has a `Default` implementation if you
-//! want to have a style with *nothing* set.
-//!
-//!     use ansi_term::Style;
-//!     use ansi_term::Colour::Red;
-//!     Red.normal().paint("yet another red string");
-//!     Style::default().paint("a completely regular string");
-//!
-//!
-//! ## Extended colours
-//!
-//! You can access the extended range of 256 colours by using the `Fixed` colour
-//! variant, which takes an argument of the colour number to use. This can be
-//! included wherever you would use a `Colour`:
-//!
-//!     use ansi_term::Colour::Fixed;
-//!     Fixed(134).paint("A sort of light purple");
-//!     Fixed(221).on(Fixed(124)).paint("Mustard in the ketchup");
-//!
-//! The first sixteen of these values are the same as the normal and bold
-//! standard colour variants. There’s nothing stopping you from using these as
-//! `Fixed` colours instead, but there’s nothing to be gained by doing so
-//! either.
-//!
-//! You can also access full 24-bit color by using the `RGB` colour variant,
-//! which takes separate `u8` arguments for red, green, and blue:
-//!
-//!     use ansi_term::Colour::RGB;
-//!     RGB(70, 130, 180).paint("Steel blue");
-//!
-//! ## Combining successive coloured strings
-//!
-//! The benefit of writing ANSI escape codes to the terminal is that they
-//! *stack*: you do not need to end every coloured string with a reset code if
-//! the text that follows it is of a similar style. For example, if you want to
-//! have some blue text followed by some blue bold text, it’s possible to send
-//! the ANSI code for blue, followed by the ANSI code for bold, and finishing
-//! with a reset code without having to have an extra one between the two
-//! strings.
-//!
-//! This crate can optimise the ANSI codes that get printed in situations like
-//! this, making life easier for your terminal renderer. The `ANSIStrings`
-//! struct takes a slice of several `ANSIString` values, and will iterate over
-//! each of them, printing only the codes for the styles that need to be updated
-//! as part of its formatting routine.
-//!
-//! The following code snippet uses this to enclose a binary number displayed in
-//! red bold text inside some red, but not bold, brackets:
-//!
-//!     use ansi_term::Colour::Red;
-//!     use ansi_term::{ANSIString, ANSIStrings};
-//!     let some_value = format!("{:b}", 42);
-//!     let strings: &[ANSIString<'static>] = &[
-//!         Red.paint("["),
-//!         Red.bold().paint(some_value),
-//!         Red.paint("]"),
-//!     ];
-//!     println!("Value: {}", ANSIStrings(strings));
-//!
-//! There are several things to note here. Firstly, the `paint` method can take
-//! *either* an owned `String` or a borrowed `&str`. Internally, an `ANSIString`
-//! holds a copy-on-write (`Cow`) string value to deal with both owned and
-//! borrowed strings at the same time. This is used here to display a `String`,
-//! the result of the `format!` call, using the same mechanism as some
-//! statically-available `&str` slices. Secondly, that the `ANSIStrings` value
-//! works in the same way as its singular counterpart, with a `Display`
-//! implementation that only performs the formatting when required.
-//!
-//! ## Byte strings
-//!
-//! This library also supports formatting `[u8]` byte strings; this supports
-//! applications working with text in an unknown encoding.  `Style` and
-//! `Color` support painting `[u8]` values, resulting in an `ANSIByteString`.
-//! This type does not implement `Display`, as it may not contain UTF-8, but
-//! it does provide a method `write_to` to write the result to any
-//! `io::Write`:
-//!
-//!     use ansi_term::Colour::Green;
-//!     Green.paint("user data".as_bytes()).write_to(&mut std::io::stdout()).unwrap();
-//!
-//! Similarly, the type `ANSIByteStrings` supports writing a list of
-//! `ANSIByteString` values with minimal escape sequences:
-//!
-//!     use ansi_term::Colour::Green;
-//!     use ansi_term::ANSIByteStrings;
-//!     ANSIByteStrings(&[
-//!         Green.paint("user data 1\n".as_bytes()),
-//!         Green.bold().paint("user data 2\n".as_bytes()),
-//!     ]).write_to(&mut std::io::stdout()).unwrap();
-
-
-#![crate_name = "ansi_term"]
-#![crate_type = "rlib"]
-#![crate_type = "dylib"]
-
-#![warn(missing_copy_implementations)]
-#![warn(missing_docs)]
-#![warn(trivial_casts, trivial_numeric_casts)]
-#![warn(unused_extern_crates, unused_qualifications)]
-
-#[cfg(target_os="windows")]
-extern crate winapi;
-
-mod ansi;
-pub use ansi::{Prefix, Infix, Suffix};
-
-mod style;
-pub use style::{Colour, Style};
-
-/// Color is a type alias for Colour for those who can't be bothered.
-pub use Colour as Color;
-
-// I'm not beyond calling Colour Colour, rather than Color, but I did
-// purposefully name this crate 'ansi-term' so people wouldn't get
-// confused when they tried to install it.
-//
-// Only *after* they'd installed it.
-
-mod difference;
-mod display;
-pub use display::*;
-
-mod write;
-
-mod windows;
-pub use windows::*;
-
-mod debug;
diff --git a/third_party/rust/ansi_term/v0_11/crate/src/style.rs b/third_party/rust/ansi_term/v0_11/crate/src/style.rs
deleted file mode 100644
index 46868b6b..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/src/style.rs
+++ /dev/null
@@ -1,259 +0,0 @@
-/// A style is a collection of properties that can format a string
-/// using ANSI escape codes.
-#[derive(PartialEq, Clone, Copy)]
-pub struct Style {
-
-    /// The style's foreground colour, if it has one.
-    pub foreground: Option<Colour>,
-
-    /// The style's background colour, if it has one.
-    pub background: Option<Colour>,
-
-    /// Whether this style is bold.
-    pub is_bold: bool,
-
-    /// Whether this style is dimmed.
-    pub is_dimmed: bool,
-
-    /// Whether this style is italic.
-    pub is_italic: bool,
-
-    /// Whether this style is underlined.
-    pub is_underline: bool,
-
-    /// Whether this style is blinking.
-    pub is_blink: bool,
-
-    /// Whether this style has reverse colours.
-    pub is_reverse: bool,
-
-    /// Whether this style is hidden.
-    pub is_hidden: bool,
-
-    /// Whether this style is struckthrough.
-    pub is_strikethrough: bool
-}
-
-impl Style {
-    /// Creates a new Style with no differences.
-    pub fn new() -> Style {
-        Style::default()
-    }
-
-    /// Returns a `Style` with the bold property set.
-    pub fn bold(&self) -> Style {
-        Style { is_bold: true, .. *self }
-    }
-
-    /// Returns a `Style` with the dimmed property set.
-    pub fn dimmed(&self) -> Style {
-        Style { is_dimmed: true, .. *self }
-    }
-
-    /// Returns a `Style` with the italic property set.
-    pub fn italic(&self) -> Style {
-        Style { is_italic: true, .. *self }
-    }
-
-    /// Returns a `Style` with the underline property set.
-    pub fn underline(&self) -> Style {
-        Style { is_underline: true, .. *self }
-    }
-
-    /// Returns a `Style` with the blink property set.
-    pub fn blink(&self) -> Style {
-        Style { is_blink: true, .. *self }
-    }
-
-    /// Returns a `Style` with the reverse property set.
-    pub fn reverse(&self) -> Style {
-        Style { is_reverse: true, .. *self }
-    }
-
-    /// Returns a `Style` with the hidden property set.
-    pub fn hidden(&self) -> Style {
-        Style { is_hidden: true, .. *self }
-    }
-
-    /// Returns a `Style` with the hidden property set.
-    pub fn strikethrough(&self) -> Style {
-        Style { is_strikethrough: true, .. *self }
-    }
-
-    /// Returns a `Style` with the foreground colour property set.
-    pub fn fg(&self, foreground: Colour) -> Style {
-        Style { foreground: Some(foreground), .. *self }
-    }
-
-    /// Returns a `Style` with the background colour property set.
-    pub fn on(&self, background: Colour) -> Style {
-        Style { background: Some(background), .. *self }
-    }
-
-    /// Return true if this `Style` has no actual styles, and can be written
-    /// without any control characters.
-    pub fn is_plain(self) -> bool {
-        self == Style::default()
-    }
-}
-
-impl Default for Style {
-
-    /// Returns a style with *no* properties set. Formatting text using this
-    /// style returns the exact same text.
-    ///
-    /// ```
-    /// use ansi_term::Style;
-    /// assert_eq!(None,  Style::default().foreground);
-    /// assert_eq!(None,  Style::default().background);
-    /// assert_eq!(false, Style::default().is_bold);
-    /// assert_eq!("txt", Style::default().paint("txt").to_string());
-    /// ```
-    fn default() -> Style {
-        Style {
-            foreground: None,
-            background: None,
-            is_bold: false,
-            is_dimmed: false,
-            is_italic: false,
-            is_underline: false,
-            is_blink: false,
-            is_reverse: false,
-            is_hidden: false,
-            is_strikethrough: false,
-        }
-    }
-}
-
-
-// ---- colours ----
-
-/// A colour is one specific type of ANSI escape code, and can refer
-/// to either the foreground or background colour.
-///
-/// These use the standard numeric sequences.
-/// See <http://invisible-island.net/xterm/ctlseqs/ctlseqs.html>
-#[derive(PartialEq, Clone, Copy, Debug)]
-pub enum Colour {
-
-    /// Colour #0 (foreground code `30`, background code `40`).
-    ///
-    /// This is not necessarily the background colour, and using it as one may
-    /// render the text hard to read on terminals with dark backgrounds.
-    Black,
-
-    /// Colour #1 (foreground code `31`, background code `41`).
-    Red,
-
-    /// Colour #2 (foreground code `32`, background code `42`).
-    Green,
-
-    /// Colour #3 (foreground code `33`, background code `43`).
-    Yellow,
-
-    /// Colour #4 (foreground code `34`, background code `44`).
-    Blue,
-
-    /// Colour #5 (foreground code `35`, background code `45`).
-    Purple,
-
-    /// Colour #6 (foreground code `36`, background code `46`).
-    Cyan,
-
-    /// Colour #7 (foreground code `37`, background code `47`).
-    ///
-    /// As above, this is not necessarily the foreground colour, and may be
-    /// hard to read on terminals with light backgrounds.
-    White,
-
-    /// A colour number from 0 to 255, for use in 256-colour terminal
-    /// environments.
-    ///
-    /// - Colours 0 to 7 are the `Black` to `White` variants respectively.
-    ///   These colours can usually be changed in the terminal emulator.
-    /// - Colours 8 to 15 are brighter versions of the eight colours above.
-    ///   These can also usually be changed in the terminal emulator, or it
-    ///   could be configured to use the original colours and show the text in
-    ///   bold instead. It varies depending on the program.
-    /// - Colours 16 to 231 contain several palettes of bright colours,
-    ///   arranged in six squares measuring six by six each.
-    /// - Colours 232 to 255 are shades of grey from black to white.
-    ///
-    /// It might make more sense to look at a [colour chart][cc].
-    ///
-    /// [cc]: https://upload.wikimedia.org/wikipedia/en/1/15/Xterm_256color_chart.svg
-    Fixed(u8),
-
-    /// A 24-bit RGB color, as specified by ISO-8613-3.
-    RGB(u8, u8, u8),
-}
-
-
-impl Colour {
-    /// Return a `Style` with the foreground colour set to this colour.
-    pub fn normal(self) -> Style {
-        Style { foreground: Some(self), .. Style::default() }
-    }
-
-    /// Returns a `Style` with the bold property set.
-    pub fn bold(self) -> Style {
-        Style { foreground: Some(self), is_bold: true, .. Style::default() }
-    }
-
-    /// Returns a `Style` with the dimmed property set.
-    pub fn dimmed(self) -> Style {
-        Style { foreground: Some(self), is_dimmed: true, .. Style::default() }
-    }
-
-    /// Returns a `Style` with the italic property set.
-    pub fn italic(self) -> Style {
-        Style { foreground: Some(self), is_italic: true, .. Style::default() }
-    }
-
-    /// Returns a `Style` with the underline property set.
-    pub fn underline(self) -> Style {
-        Style { foreground: Some(self), is_underline: true, .. Style::default() }
-    }
-
-    /// Returns a `Style` with the blink property set.
-    pub fn blink(self) -> Style {
-        Style { foreground: Some(self), is_blink: true, .. Style::default() }
-    }
-
-    /// Returns a `Style` with the reverse property set.
-    pub fn reverse(self) -> Style {
-        Style { foreground: Some(self), is_reverse: true, .. Style::default() }
-    }
-
-    /// Returns a `Style` with the hidden property set.
-    pub fn hidden(self) -> Style {
-        Style { foreground: Some(self), is_hidden: true, .. Style::default() }
-    }
-
-    /// Returns a `Style` with the strikethrough property set.
-    pub fn strikethrough(self) -> Style {
-        Style { foreground: Some(self), is_strikethrough: true, .. Style::default() }
-    }
-
-    /// Returns a `Style` with the background colour property set.
-    pub fn on(self, background: Colour) -> Style {
-        Style { foreground: Some(self), background: Some(background), .. Style::default() }
-    }
-}
-
-impl From<Colour> for Style {
-
-    /// You can turn a `Colour` into a `Style` with the foreground colour set
-    /// with the `From` trait.
-    ///
-    /// ```
-    /// use ansi_term::{Style, Colour};
-    /// let green_foreground = Style::default().fg(Colour::Green);
-    /// assert_eq!(green_foreground, Colour::Green.normal());
-    /// assert_eq!(green_foreground, Colour::Green.into());
-    /// assert_eq!(green_foreground, Style::from(Colour::Green));
-    /// ```
-    fn from(colour: Colour) -> Style {
-        colour.normal()
-    }
-}
diff --git a/third_party/rust/ansi_term/v0_11/crate/src/windows.rs b/third_party/rust/ansi_term/v0_11/crate/src/windows.rs
deleted file mode 100644
index f1641dc..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/src/windows.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-/// Enables ANSI code support on Windows 10.
-///
-/// This uses Windows API calls to alter the properties of the console that
-/// the program is running in.
-///
-/// https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx
-///
-/// Returns a `Result` with the Windows error code if unsuccessful.
-#[cfg(windows)]
-pub fn enable_ansi_support() -> Result<(), u32> {
-    use winapi::um::processenv::GetStdHandle;
-    use winapi::um::errhandlingapi::GetLastError;
-    use winapi::um::consoleapi::{GetConsoleMode, SetConsoleMode};
-
-    const STD_OUT_HANDLE: u32 = -11i32 as u32;
-    const ENABLE_VIRTUAL_TERMINAL_PROCESSING: u32 = 0x0004;
-
-    unsafe {
-        // https://docs.microsoft.com/en-us/windows/console/getstdhandle
-        let std_out_handle = GetStdHandle(STD_OUT_HANDLE);
-        let error_code = GetLastError();
-        if error_code != 0 { return Err(error_code); }
-        
-        // https://docs.microsoft.com/en-us/windows/console/getconsolemode
-        let mut console_mode: u32 = 0;
-        GetConsoleMode(std_out_handle, &mut console_mode);
-        let error_code = GetLastError();
-        if error_code != 0 { return Err(error_code); }
-
-        // VT processing not already enabled?
-        if console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0 {
-            // https://docs.microsoft.com/en-us/windows/console/setconsolemode
-            SetConsoleMode(std_out_handle, console_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
-            let error_code = GetLastError();
-            if error_code != 0 { return Err(error_code); }
-        }
-    }
-
-    return Ok(());
-}
diff --git a/third_party/rust/ansi_term/v0_11/crate/src/write.rs b/third_party/rust/ansi_term/v0_11/crate/src/write.rs
deleted file mode 100644
index 65a64feb..0000000
--- a/third_party/rust/ansi_term/v0_11/crate/src/write.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-use std::fmt;
-use std::io;
-
-
-pub trait AnyWrite {
-    type wstr: ?Sized;
-    type Error;
-
-    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error>;
-
-    fn write_str(&mut self, s: &Self::wstr) -> Result<(), Self::Error>;
-}
-
-
-impl<'a> AnyWrite for fmt::Write + 'a {
-    type wstr = str;
-    type Error = fmt::Error;
-
-    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error> {
-        fmt::Write::write_fmt(self, fmt)
-    }
-
-    fn write_str(&mut self, s: &Self::wstr) -> Result<(), Self::Error> {
-        fmt::Write::write_str(self, s)
-    }
-}
-
-
-impl<'a> AnyWrite for io::Write + 'a {
-    type wstr = [u8];
-    type Error = io::Error;
-
-    fn write_fmt(&mut self, fmt: fmt::Arguments) -> Result<(), Self::Error> {
-        io::Write::write_fmt(self, fmt)
-    }
-
-    fn write_str(&mut self, s: &Self::wstr) -> Result<(), Self::Error> {
-        io::Write::write_all(self, s)
-    }
-}
diff --git a/third_party/rust/bindgen/v0_59/crate/.cargo_vcs_info.json b/third_party/rust/bindgen/v0_59/crate/.cargo_vcs_info.json
deleted file mode 100644
index f1c8552f..0000000
--- a/third_party/rust/bindgen/v0_59/crate/.cargo_vcs_info.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "git": {
-    "sha1": "89032649044d875983a851fff6fbde2d4e2ceaeb"
-  }
-}
diff --git a/third_party/rust/bindgen/v0_59/BUILD.gn b/third_party/rust/bindgen/v0_60/BUILD.gn
similarity index 95%
rename from third_party/rust/bindgen/v0_59/BUILD.gn
rename to third_party/rust/bindgen/v0_60/BUILD.gn
index 2714502..6376631 100644
--- a/third_party/rust/bindgen/v0_59/BUILD.gn
+++ b/third_party/rust/bindgen/v0_60/BUILD.gn
@@ -12,7 +12,7 @@
   build_native_rust_unit_tests = false
   sources = [ "crate/src/main.rs" ]
   edition = "2018"
-  cargo_pkg_version = "0.59.2"
+  cargo_pkg_version = "0.60.1"
   cargo_pkg_authors = "Jyun-Yan You <jyyou.tw@gmail.com>, Emilio Cobos Álvarez <emilio@crisal.io>, Nick Fitzgerald <fitzgen@gmail.com>, The Servo project developers"
   cargo_pkg_name = "bindgen"
   cargo_pkg_description =
@@ -22,7 +22,7 @@
     "//third_party/rust/bitflags/v1:lib",
     "//third_party/rust/cexpr/v0_6:lib",
     "//third_party/rust/clang_sys/v1:lib",
-    "//third_party/rust/clap/v2:lib",
+    "//third_party/rust/clap/v3:lib",
     "//third_party/rust/env_logger/v0_9:lib",
     "//third_party/rust/lazy_static/v1:lib",
     "//third_party/rust/lazycell/v1:lib",
@@ -53,7 +53,7 @@
 }
 cargo_crate("lib") {
   crate_name = "bindgen"
-  epoch = "0.59"
+  epoch = "0.60"
   crate_type = "rlib"
   crate_root = "crate/src/lib.rs"
 
@@ -61,7 +61,7 @@
   build_native_rust_unit_tests = false
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
-  cargo_pkg_version = "0.59.2"
+  cargo_pkg_version = "0.60.1"
   cargo_pkg_authors = "Jyun-Yan You <jyyou.tw@gmail.com>, Emilio Cobos Álvarez <emilio@crisal.io>, Nick Fitzgerald <fitzgen@gmail.com>, The Servo project developers"
   cargo_pkg_name = "bindgen"
   cargo_pkg_description =
@@ -70,7 +70,7 @@
     "//third_party/rust/bitflags/v1:lib",
     "//third_party/rust/cexpr/v0_6:lib",
     "//third_party/rust/clang_sys/v1:lib",
-    "//third_party/rust/clap/v2:lib",
+    "//third_party/rust/clap/v3:lib",
     "//third_party/rust/env_logger/v0_9:lib",
     "//third_party/rust/lazy_static/v1:lib",
     "//third_party/rust/lazycell/v1:lib",
diff --git a/third_party/rust/bindgen/v0_59/README.chromium b/third_party/rust/bindgen/v0_60/README.chromium
similarity index 91%
rename from third_party/rust/bindgen/v0_59/README.chromium
rename to third_party/rust/bindgen/v0_60/README.chromium
index 4e6b239..849facfb 100644
--- a/third_party/rust/bindgen/v0_59/README.chromium
+++ b/third_party/rust/bindgen/v0_60/README.chromium
@@ -1,6 +1,6 @@
 Name: bindgen
 URL: https://crates.io/crates/bindgen
 Description: Automatically generates Rust FFI bindings to C and C++ libraries.
-Version: 0.59.2
+Version: 0.60.1
 Security Critical: no
 License: BSD 3-Clause
diff --git a/third_party/rust/bindgen/v0_60/crate/.cargo_vcs_info.json b/third_party/rust/bindgen/v0_60/crate/.cargo_vcs_info.json
new file mode 100644
index 0000000..0ca04ce
--- /dev/null
+++ b/third_party/rust/bindgen/v0_60/crate/.cargo_vcs_info.json
@@ -0,0 +1,6 @@
+{
+  "git": {
+    "sha1": "9ca5f856a35deddde0575002d76d1db4430e6c42"
+  },
+  "path_in_vcs": ""
+}
\ No newline at end of file
diff --git a/third_party/rust/bindgen/v0_59/crate/Cargo.lock b/third_party/rust/bindgen/v0_60/crate/Cargo.lock
similarity index 89%
rename from third_party/rust/bindgen/v0_59/crate/Cargo.lock
rename to third_party/rust/bindgen/v0_60/crate/Cargo.lock
index d79a408..82ad5f18 100644
--- a/third_party/rust/bindgen/v0_59/crate/Cargo.lock
+++ b/third_party/rust/bindgen/v0_60/crate/Cargo.lock
@@ -12,15 +12,6 @@
 ]
 
 [[package]]
-name = "ansi_term"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
-dependencies = [
- "winapi",
-]
-
-[[package]]
 name = "atty"
 version = "0.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -32,8 +23,14 @@
 ]
 
 [[package]]
+name = "autocfg"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+
+[[package]]
 name = "bindgen"
-version = "0.59.2"
+version = "0.60.1"
 dependencies = [
  "bitflags",
  "cexpr",
@@ -77,9 +74,9 @@
 
 [[package]]
 name = "clang-sys"
-version = "1.2.0"
+version = "1.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "853eda514c284c2287f4bf20ae614f8781f40a81d32ecda6e91449304dfe077c"
+checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b"
 dependencies = [
  "glob",
  "libc",
@@ -88,17 +85,17 @@
 
 [[package]]
 name = "clap"
-version = "2.33.3"
+version = "3.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
+checksum = "d01c9347757e131122b19cd19a05c85805b68c2352a97b623efdc3c295290299"
 dependencies = [
- "ansi_term",
  "atty",
  "bitflags",
+ "indexmap",
+ "os_str_bytes",
  "strsim",
+ "termcolor",
  "textwrap",
- "unicode-width",
- "vec_map",
 ]
 
 [[package]]
@@ -144,6 +141,12 @@
 checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
 
 [[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+
+[[package]]
 name = "hermit-abi"
 version = "0.1.19"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -159,6 +162,16 @@
 checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
 
 [[package]]
+name = "indexmap"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
 name = "lazy_static"
 version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -197,9 +210,9 @@
 
 [[package]]
 name = "memchr"
-version = "2.3.4"
+version = "2.4.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
+checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
 
 [[package]]
 name = "minimal-lexical"
@@ -219,6 +232,15 @@
 ]
 
 [[package]]
+name = "os_str_bytes"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
 name = "peeking_take_while"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -337,9 +359,9 @@
 
 [[package]]
 name = "strsim"
-version = "0.8.0"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
 
 [[package]]
 name = "tempfile"
@@ -366,18 +388,9 @@
 
 [[package]]
 name = "textwrap"
-version = "0.11.0"
+version = "0.14.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
-dependencies = [
- "unicode-width",
-]
-
-[[package]]
-name = "unicode-width"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
+checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80"
 
 [[package]]
 name = "unicode-xid"
@@ -386,12 +399,6 @@
 checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
 
 [[package]]
-name = "vec_map"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
-
-[[package]]
 name = "version_check"
 version = "0.9.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -405,9 +412,9 @@
 
 [[package]]
 name = "which"
-version = "4.2.1"
+version = "4.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7cc009ab82a2afc94b9e467ab4214aee9cad1356cd9191264203d7d72006e00d"
+checksum = "ea187a8ef279bc014ec368c27a920da2024d2a711109bfbe3440585d5cf27ad9"
 dependencies = [
  "either",
  "lazy_static",
diff --git a/third_party/rust/bindgen/v0_59/crate/Cargo.toml b/third_party/rust/bindgen/v0_60/crate/Cargo.toml
similarity index 76%
rename from third_party/rust/bindgen/v0_59/crate/Cargo.toml
rename to third_party/rust/bindgen/v0_60/crate/Cargo.toml
index 8b8853a..3aa166e 100644
--- a/third_party/rust/bindgen/v0_59/crate/Cargo.toml
+++ b/third_party/rust/bindgen/v0_60/crate/Cargo.toml
@@ -12,16 +12,35 @@
 [package]
 edition = "2018"
 name = "bindgen"
-version = "0.59.2"
-authors = ["Jyun-Yan You <jyyou.tw@gmail.com>", "Emilio Cobos Álvarez <emilio@crisal.io>", "Nick Fitzgerald <fitzgen@gmail.com>", "The Servo project developers"]
+version = "0.60.1"
+authors = [
+    "Jyun-Yan You <jyyou.tw@gmail.com>",
+    "Emilio Cobos Álvarez <emilio@crisal.io>",
+    "Nick Fitzgerald <fitzgen@gmail.com>",
+    "The Servo project developers",
+]
 build = "build.rs"
-include = ["LICENSE", "README.md", "Cargo.toml", "build.rs", "src/*.rs", "src/**/*.rs"]
+include = [
+    "LICENSE",
+    "README.md",
+    "Cargo.toml",
+    "build.rs",
+    "src/*.rs",
+    "src/**/*.rs",
+]
 description = "Automatically generates Rust FFI bindings to C and C++ libraries."
 homepage = "https://rust-lang.github.io/rust-bindgen/"
 documentation = "https://docs.rs/bindgen"
 readme = "README.md"
-keywords = ["bindings", "ffi", "code-generation"]
-categories = ["external-ffi-bindings", "development-tools::ffi"]
+keywords = [
+    "bindings",
+    "ffi",
+    "code-generation",
+]
+categories = [
+    "external-ffi-bindings",
+    "development-tools::ffi",
+]
 license = "BSD-3-Clause"
 repository = "https://github.com/rust-lang/rust-bindgen"
 
@@ -33,6 +52,7 @@
 path = "src/main.rs"
 doc = false
 required-features = ["clap"]
+
 [dependencies.bitflags]
 version = "1.0.3"
 
@@ -44,7 +64,7 @@
 features = ["clang_6_0"]
 
 [dependencies.clap]
-version = "2"
+version = "3"
 optional = true
 
 [dependencies.env_logger]
@@ -74,7 +94,10 @@
 
 [dependencies.regex]
 version = "1.0"
-features = ["std", "unicode"]
+features = [
+    "std",
+    "unicode",
+]
 default-features = false
 
 [dependencies.rustc-hash]
@@ -87,8 +110,9 @@
 version = "4.2.1"
 optional = true
 default-features = false
+
 [dev-dependencies.clap]
-version = "2"
+version = "3"
 
 [dev-dependencies.diff]
 version = "0.1"
@@ -100,16 +124,23 @@
 version = "3"
 
 [features]
-default = ["logging", "clap", "runtime", "which-rustfmt"]
-logging = ["env_logger", "log"]
+default = [
+    "logging",
+    "clap",
+    "runtime",
+    "which-rustfmt",
+]
+logging = [
+    "env_logger",
+    "log",
+]
 runtime = ["clang-sys/runtime"]
 static = ["clang-sys/static"]
 testing_only_docs = []
 testing_only_extra_assertions = []
-testing_only_libclang_3_9 = []
-testing_only_libclang_4 = []
 testing_only_libclang_5 = []
 testing_only_libclang_9 = []
 which-rustfmt = ["which"]
+
 [badges.travis-ci]
 repository = "rust-lang/rust-bindgen"
diff --git a/third_party/rust/bindgen/v0_59/crate/Cargo.toml.orig b/third_party/rust/bindgen/v0_60/crate/Cargo.toml.orig
similarity index 93%
rename from third_party/rust/bindgen/v0_59/crate/Cargo.toml.orig
rename to third_party/rust/bindgen/v0_60/crate/Cargo.toml.orig
index ba41a22d..0cbfd05 100644
--- a/third_party/rust/bindgen/v0_59/crate/Cargo.toml.orig
+++ b/third_party/rust/bindgen/v0_60/crate/Cargo.toml.orig
@@ -14,7 +14,7 @@
 repository = "https://github.com/rust-lang/rust-bindgen"
 documentation = "https://docs.rs/bindgen"
 homepage = "https://rust-lang.github.io/rust-bindgen/"
-version = "0.59.2"
+version = "0.60.1"
 edition = "2018"
 build = "build.rs"
 
@@ -41,7 +41,7 @@
 
 [dev-dependencies]
 diff = "0.1"
-clap = "2"
+clap = "3"
 shlex = "1"
 tempfile = "3"
 
@@ -49,7 +49,7 @@
 bitflags = "1.0.3"
 cexpr = "0.6"
 # This kinda sucks: https://github.com/rust-lang/cargo/issues/1982
-clap = { version = "2", optional = true }
+clap = { version = "3", optional = true }
 clang-sys = { version = "1", features = ["clang_6_0"] }
 lazycell = "1"
 lazy_static = "1"
@@ -83,5 +83,3 @@
 testing_only_extra_assertions = []
 testing_only_libclang_9 = []
 testing_only_libclang_5 = []
-testing_only_libclang_4 = []
-testing_only_libclang_3_9 = []
diff --git a/third_party/rust/bindgen/v0_59/crate/LICENSE b/third_party/rust/bindgen/v0_60/crate/LICENSE
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/LICENSE
rename to third_party/rust/bindgen/v0_60/crate/LICENSE
diff --git a/third_party/rust/bindgen/v0_59/crate/README.md b/third_party/rust/bindgen/v0_60/crate/README.md
similarity index 98%
rename from third_party/rust/bindgen/v0_59/crate/README.md
rename to third_party/rust/bindgen/v0_60/crate/README.md
index 7b2dbbc..4b1194f 100644
--- a/third_party/rust/bindgen/v0_59/crate/README.md
+++ b/third_party/rust/bindgen/v0_60/crate/README.md
@@ -39,7 +39,7 @@
 
 ## MSRV
 
-The minimum supported Rust version is **1.46**.
+The minimum supported Rust version is **1.54**.
 
 No MSRV bump policy has been established yet, so MSRV may increase in any release.
 
diff --git a/third_party/rust/bindgen/v0_59/crate/build.rs b/third_party/rust/bindgen/v0_60/crate/build.rs
similarity index 97%
rename from third_party/rust/bindgen/v0_59/crate/build.rs
rename to third_party/rust/bindgen/v0_60/crate/build.rs
index fcc0bb22..8c05d59 100644
--- a/third_party/rust/bindgen/v0_59/crate/build.rs
+++ b/third_party/rust/bindgen/v0_60/crate/build.rs
@@ -85,6 +85,6 @@
     );
     println!(
         "cargo:rerun-if-env-changed=BINDGEN_EXTRA_CLANG_ARGS_{}",
-        std::env::var("TARGET").unwrap().replace("-", "_")
+        std::env::var("TARGET").unwrap().replace('-', "_")
     );
 }
diff --git a/third_party/rust/bindgen/v0_59/crate/csmith-fuzzing/README.md b/third_party/rust/bindgen/v0_60/crate/csmith-fuzzing/README.md
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/csmith-fuzzing/README.md
rename to third_party/rust/bindgen/v0_60/crate/csmith-fuzzing/README.md
diff --git a/third_party/rust/bindgen/v0_59/crate/src/callbacks.rs b/third_party/rust/bindgen/v0_60/crate/src/callbacks.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/callbacks.rs
rename to third_party/rust/bindgen/v0_60/crate/src/callbacks.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/clang.rs b/third_party/rust/bindgen/v0_60/crate/src/clang.rs
similarity index 99%
rename from third_party/rust/bindgen/v0_59/crate/src/clang.rs
rename to third_party/rust/bindgen/v0_60/crate/src/clang.rs
index 074d459..587cc0b 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/clang.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/clang.rs
@@ -2014,12 +2014,6 @@
             return None;
         }
 
-        if !clang_EvalResult_isUnsignedInt::is_loaded() {
-            // FIXME(emilio): There's no way to detect underflow here, and clang
-            // will just happily give us a value.
-            return Some(unsafe { clang_EvalResult_getAsInt(self.x) } as i64);
-        }
-
         if unsafe { clang_EvalResult_isUnsignedInt(self.x) } != 0 {
             let value = unsafe { clang_EvalResult_getAsUnsigned(self.x) };
             if value > i64::max_value() as c_ulonglong {
@@ -2071,10 +2065,7 @@
 
 impl TargetInfo {
     /// Tries to obtain target information from libclang.
-    pub fn new(tu: &TranslationUnit) -> Option<Self> {
-        if !clang_getTranslationUnitTargetInfo::is_loaded() {
-            return None;
-        }
+    pub fn new(tu: &TranslationUnit) -> Self {
         let triple;
         let pointer_width;
         unsafe {
@@ -2085,9 +2076,9 @@
         }
         assert!(pointer_width > 0);
         assert_eq!(pointer_width % 8, 0);
-        Some(TargetInfo {
+        TargetInfo {
             triple,
             pointer_width: pointer_width as usize,
-        })
+        }
     }
 }
diff --git a/third_party/rust/bindgen/v0_59/crate/src/codegen/bitfield_unit.rs b/third_party/rust/bindgen/v0_60/crate/src/codegen/bitfield_unit.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/codegen/bitfield_unit.rs
rename to third_party/rust/bindgen/v0_60/crate/src/codegen/bitfield_unit.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/codegen/bitfield_unit_tests.rs b/third_party/rust/bindgen/v0_60/crate/src/codegen/bitfield_unit_tests.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/codegen/bitfield_unit_tests.rs
rename to third_party/rust/bindgen/v0_60/crate/src/codegen/bitfield_unit_tests.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/codegen/dyngen.rs b/third_party/rust/bindgen/v0_60/crate/src/codegen/dyngen.rs
similarity index 97%
rename from third_party/rust/bindgen/v0_59/crate/src/codegen/dyngen.rs
rename to third_party/rust/bindgen/v0_60/crate/src/codegen/dyngen.rs
index 71c4dab1..26cfe5c 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/codegen/dyngen.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/codegen/dyngen.rs
@@ -112,6 +112,7 @@
         }
     }
 
+    #[allow(clippy::too_many_arguments)]
     pub fn push(
         &mut self,
         ident: Ident,
@@ -122,6 +123,7 @@
         args_identifiers: Vec<proc_macro2::TokenStream>,
         ret: proc_macro2::TokenStream,
         ret_ty: proc_macro2::TokenStream,
+        attributes: Vec<proc_macro2::TokenStream>,
     ) {
         if !is_variadic {
             assert_eq!(args.len(), args_identifiers.len());
@@ -153,6 +155,7 @@
         // access the function pointer so that the user can call it just fine.
         if !is_variadic {
             self.struct_implementation.push(quote! {
+                #(#attributes)*
                 pub unsafe fn #ident ( &self, #( #args ),* ) -> #ret_ty {
                     #call_body
                 }
diff --git a/third_party/rust/bindgen/v0_59/crate/src/codegen/error.rs b/third_party/rust/bindgen/v0_60/crate/src/codegen/error.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/codegen/error.rs
rename to third_party/rust/bindgen/v0_60/crate/src/codegen/error.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/codegen/helpers.rs b/third_party/rust/bindgen/v0_60/crate/src/codegen/helpers.rs
similarity index 98%
rename from third_party/rust/bindgen/v0_59/crate/src/codegen/helpers.rs
rename to third_party/rust/bindgen/v0_60/crate/src/codegen/helpers.rs
index 2ce6894f..75c169c6 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/codegen/helpers.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/codegen/helpers.rs
@@ -30,7 +30,7 @@
         let which_ones = which_ones
             .iter()
             .cloned()
-            .map(|one| Ident::new(one, Span::call_site()));
+            .map(|one| TokenStream::from_str(one).expect("derive to be valid"));
         quote! {
             #[derive( #( #which_ones ),* )]
         }
diff --git a/third_party/rust/bindgen/v0_59/crate/src/codegen/impl_debug.rs b/third_party/rust/bindgen/v0_60/crate/src/codegen/impl_debug.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/codegen/impl_debug.rs
rename to third_party/rust/bindgen/v0_60/crate/src/codegen/impl_debug.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/codegen/impl_partialeq.rs b/third_party/rust/bindgen/v0_60/crate/src/codegen/impl_partialeq.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/codegen/impl_partialeq.rs
rename to third_party/rust/bindgen/v0_60/crate/src/codegen/impl_partialeq.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/codegen/mod.rs b/third_party/rust/bindgen/v0_60/crate/src/codegen/mod.rs
similarity index 95%
rename from third_party/rust/bindgen/v0_59/crate/src/codegen/mod.rs
rename to third_party/rust/bindgen/v0_60/crate/src/codegen/mod.rs
index 19886e3..ee4a6bf 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/codegen/mod.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/codegen/mod.rs
@@ -21,8 +21,8 @@
 use crate::ir::annotations::FieldAccessorKind;
 use crate::ir::comment;
 use crate::ir::comp::{
-    Base, Bitfield, BitfieldUnit, CompInfo, CompKind, Field, FieldData,
-    FieldMethods, Method, MethodKind,
+    Bitfield, BitfieldUnit, CompInfo, CompKind, Field, FieldData, FieldMethods,
+    Method, MethodKind,
 };
 use crate::ir::context::{BindgenContext, ItemId};
 use crate::ir::derive::{
@@ -110,17 +110,13 @@
     }
 }
 
-fn derives_of_item(item: &Item, ctx: &BindgenContext) -> DerivableTraits {
+fn derives_of_item(
+    item: &Item,
+    ctx: &BindgenContext,
+    packed: bool,
+) -> DerivableTraits {
     let mut derivable_traits = DerivableTraits::empty();
 
-    if item.can_derive_debug(ctx) && !item.annotations().disallow_debug() {
-        derivable_traits |= DerivableTraits::DEBUG;
-    }
-
-    if item.can_derive_default(ctx) && !item.annotations().disallow_default() {
-        derivable_traits |= DerivableTraits::DEFAULT;
-    }
-
     let all_template_params = item.all_template_params(ctx);
 
     if item.can_derive_copy(ctx) && !item.annotations().disallow_copy() {
@@ -137,6 +133,18 @@
             // It's not hard to fix though.
             derivable_traits |= DerivableTraits::CLONE;
         }
+    } else if packed {
+        // If the struct or union is packed, deriving from Copy is required for
+        // deriving from any other trait.
+        return derivable_traits;
+    }
+
+    if item.can_derive_debug(ctx) && !item.annotations().disallow_debug() {
+        derivable_traits |= DerivableTraits::DEBUG;
+    }
+
+    if item.can_derive_default(ctx) && !item.annotations().disallow_default() {
+        derivable_traits |= DerivableTraits::DEFAULT;
     }
 
     if item.can_derive_hash(ctx) {
@@ -926,7 +934,9 @@
 
                         let mut attributes =
                             vec![attributes::repr("transparent")];
-                        let derivable_traits = derives_of_item(item, ctx);
+                        let packed = false; // Types can't be packed in Rust.
+                        let derivable_traits =
+                            derives_of_item(item, ctx, packed);
                         if !derivable_traits.is_empty() {
                             let derives: Vec<_> = derivable_traits.into();
                             attributes.push(attributes::derives(&derives))
@@ -1017,23 +1027,14 @@
 
 struct Vtable<'a> {
     item_id: ItemId,
+    /// A reference to the originating compound object.
     #[allow(dead_code)]
-    methods: &'a [Method],
-    #[allow(dead_code)]
-    base_classes: &'a [Base],
+    comp_info: &'a CompInfo,
 }
 
 impl<'a> Vtable<'a> {
-    fn new(
-        item_id: ItemId,
-        methods: &'a [Method],
-        base_classes: &'a [Base],
-    ) -> Self {
-        Vtable {
-            item_id,
-            methods,
-            base_classes,
-        }
+    fn new(item_id: ItemId, comp_info: &'a CompInfo) -> Self {
+        Vtable { item_id, comp_info }
     }
 }
 
@@ -1049,15 +1050,69 @@
     ) {
         assert_eq!(item.id(), self.item_id);
         debug_assert!(item.is_enabled_for_codegen(ctx));
-
-        // For now, generate an empty struct, later we should generate function
-        // pointers and whatnot.
         let name = ctx.rust_ident(&self.canonical_name(ctx));
-        let void = helpers::ast_ty::c_void(ctx);
-        result.push(quote! {
-            #[repr(C)]
-            pub struct #name ( #void );
-        });
+
+        // For now, we will only generate vtables for classes that:
+        // - do not inherit from others (compilers merge VTable from primary parent class).
+        // - do not contain a virtual destructor (requires ordering; platforms generate different vtables).
+        if ctx.options().vtable_generation &&
+            self.comp_info.base_members().is_empty() &&
+            self.comp_info.destructor().is_none()
+        {
+            let class_ident = ctx.rust_ident(self.item_id.canonical_name(ctx));
+
+            let methods = self
+                .comp_info
+                .methods()
+                .iter()
+                .filter_map(|m| {
+                    if !m.is_virtual() {
+                        return None;
+                    }
+
+                    let function_item = ctx.resolve_item(m.signature());
+                    let function = function_item.expect_function();
+                    let signature_item = ctx.resolve_item(function.signature());
+                    let signature = match signature_item.expect_type().kind() {
+                        TypeKind::Function(ref sig) => sig,
+                        _ => panic!("Function signature type mismatch"),
+                    };
+
+                    // FIXME: Is there a canonical name without the class prepended?
+                    let function_name = function_item.canonical_name(ctx);
+
+                    // FIXME: Need to account for overloading with times_seen (separately from regular function path).
+                    let function_name = ctx.rust_ident(function_name);
+                    let mut args = utils::fnsig_arguments(ctx, signature);
+                    let ret = utils::fnsig_return_ty(ctx, signature);
+
+                    args[0] = if m.is_const() {
+                        quote! { this: *const #class_ident }
+                    } else {
+                        quote! { this: *mut #class_ident }
+                    };
+
+                    Some(quote! {
+                        pub #function_name : unsafe extern "C" fn( #( #args ),* ) #ret
+                    })
+                })
+                .collect::<Vec<_>>();
+
+            result.push(quote! {
+                #[repr(C)]
+                pub struct #name {
+                    #( #methods ),*
+                }
+            })
+        } else {
+            // For the cases we don't support, simply generate an empty struct.
+            let void = helpers::ast_ty::c_void(ctx);
+
+            result.push(quote! {
+                #[repr(C)]
+                pub struct #name ( #void );
+            });
+        }
     }
 }
 
@@ -1749,8 +1804,7 @@
 
         if !is_opaque {
             if item.has_vtable_ptr(ctx) {
-                let vtable =
-                    Vtable::new(item.id(), self.methods(), self.base_members());
+                let vtable = Vtable::new(item.id(), self);
                 vtable.codegen(ctx, result, item);
 
                 let vtable_type = vtable
@@ -1982,7 +2036,7 @@
             }
         }
 
-        let derivable_traits = derives_of_item(item, ctx);
+        let derivable_traits = derives_of_item(item, ctx, packed);
         if !derivable_traits.contains(DerivableTraits::DEBUG) {
             needs_debug_impl = ctx.options().derive_debug &&
                 ctx.options().impl_debug &&
@@ -2028,8 +2082,7 @@
             attributes.push(attributes::derives(&derives))
         }
 
-        if item.annotations().must_use_type() || ctx.must_use_type_by_name(item)
-        {
+        if item.must_use(ctx) {
             attributes.push(attributes::must_use());
         }
 
@@ -2123,32 +2176,38 @@
                     {
                         vec![]
                     } else {
-                        let asserts = self.fields()
-                                .iter()
-                                .filter_map(|field| match *field {
-                                    Field::DataMember(ref f) if f.name().is_some() => Some(f),
-                                    _ => None,
-                                })
-                                .flat_map(|field| {
-                                    let name = field.name().unwrap();
-                                    field.offset().map(|offset| {
-                                        let field_offset = offset / 8;
-                                        let field_name = ctx.rust_ident(name);
-
-                                        quote! {
+                        self.fields()
+                            .iter()
+                            .filter_map(|field| match *field {
+                                Field::DataMember(ref f) if f.name().is_some() => Some(f),
+                                _ => None,
+                            })
+                            .flat_map(|field| {
+                                let name = field.name().unwrap();
+                                field.offset().map(|offset| {
+                                    let field_offset = offset / 8;
+                                    let field_name = ctx.rust_ident(name);
+                                    // Put each check in its own function, so
+                                    // that rustc with opt-level=0 doesn't take
+                                    // too much stack space, see #2218.
+                                    let test_fn = Ident::new(&format!("test_field_{}", name), Span::call_site());
+                                    quote! {
+                                        fn #test_fn() {
                                             assert_eq!(
                                                 unsafe {
-                                                    &(*(::#prefix::ptr::null::<#canonical_ident>())).#field_name as *const _ as usize
+                                                    let uninit = ::#prefix::mem::MaybeUninit::<#canonical_ident>::uninit();
+                                                    let ptr = uninit.as_ptr();
+                                                    ::#prefix::ptr::addr_of!((*ptr).#field_name) as usize - ptr as usize
                                                 },
                                                 #field_offset,
                                                 concat!("Offset of field: ", stringify!(#canonical_ident), "::", stringify!(#field_name))
                                             );
                                         }
-                                    })
+                                        #test_fn();
+                                    }
                                 })
-                                .collect::<Vec<proc_macro2::TokenStream>>();
-
-                        asserts
+                            })
+                            .collect::<Vec<proc_macro2::TokenStream>>()
                     };
 
                     let item = quote! {
@@ -2370,9 +2429,13 @@
             _ => panic!("How in the world?"),
         };
 
-        if let (Abi::ThisCall, false) =
-            (signature.abi(), ctx.options().rust_features().thiscall_abi)
-        {
+        let supported_abi = match signature.abi() {
+            Abi::ThisCall => ctx.options().rust_features().thiscall_abi,
+            Abi::Vectorcall => ctx.options().rust_features().vectorcall_abi,
+            _ => true,
+        };
+
+        if !supported_abi {
             return;
         }
 
@@ -2577,7 +2640,6 @@
         is_bitfield: bool,
     },
     Consts {
-        repr: proc_macro2::TokenStream,
         variants: Vec<proc_macro2::TokenStream>,
         codegen_depth: usize,
     },
@@ -2648,7 +2710,6 @@
                 });
 
                 EnumBuilder::Consts {
-                    repr,
                     variants,
                     codegen_depth: enum_codegen_depth,
                 }
@@ -2752,7 +2813,7 @@
                 self
             }
 
-            EnumBuilder::Consts { ref repr, .. } => {
+            EnumBuilder::Consts { .. } => {
                 let constant_name = match mangling_prefix {
                     Some(prefix) => {
                         Cow::Owned(format!("{}_{}", prefix, variant_name))
@@ -2760,12 +2821,10 @@
                     None => variant_name,
                 };
 
-                let ty = if is_ty_named { &rust_ty } else { repr };
-
                 let ident = ctx.rust_ident(constant_name);
                 result.push(quote! {
                     #doc
-                    pub const #ident : #ty = #expr ;
+                    pub const #ident : #rust_ty = #expr ;
                 });
 
                 self
@@ -2998,21 +3057,16 @@
             attrs.push(attributes::doc(comment));
         }
 
-        if item.annotations().must_use_type() || ctx.must_use_type_by_name(item)
-        {
+        if item.must_use(ctx) {
             attrs.push(attributes::must_use());
         }
 
         if !variation.is_const() {
-            let mut derives = derives_of_item(item, ctx);
-            // For backwards compat, enums always derive Debug/Clone/Eq/PartialEq/Hash, even
-            // if we don't generate those by default.
-            if !item.annotations().disallow_debug() {
-                derives.insert(DerivableTraits::DEBUG);
-            }
-            if !item.annotations().disallow_copy() {
-                derives.insert(DerivableTraits::COPY);
-            }
+            let packed = false; // Enums can't be packed in Rust.
+            let mut derives = derives_of_item(item, ctx, packed);
+            // For backwards compat, enums always derive
+            // Clone/Eq/PartialEq/Hash, even if we don't generate those by
+            // default.
             derives.insert(
                 DerivableTraits::CLONE |
                     DerivableTraits::HASH |
@@ -3828,6 +3882,12 @@
                 warn!("Skipping function with thiscall ABI that isn't supported by the configured Rust target");
                 Ok(proc_macro2::TokenStream::new())
             }
+            Abi::Vectorcall
+                if !ctx.options().rust_features().vectorcall_abi =>
+            {
+                warn!("Skipping function with vectorcall ABI that isn't supported by the configured Rust target");
+                Ok(proc_macro2::TokenStream::new())
+            }
             _ => Ok(quote! {
                 unsafe extern #abi fn ( #( #arguments ),* ) #ret
             }),
@@ -3860,14 +3920,17 @@
 
         // Pure virtual methods have no actual symbol, so we can't generate
         // something meaningful for them.
-        match self.kind() {
+        let is_dynamic_function = match self.kind() {
             FunctionKind::Method(ref method_kind)
                 if method_kind.is_pure_virtual() =>
             {
                 return None;
             }
-            _ => {}
-        }
+            FunctionKind::Function => {
+                ctx.options().dynamic_library_name.is_some()
+            }
+            _ => false,
+        };
 
         // Similar to static member variables in a class template, we can't
         // generate bindings to template functions, because the set of
@@ -3904,10 +3967,19 @@
 
         let mut attributes = vec![];
 
-        if signature.must_use() &&
-            ctx.options().rust_features().must_use_function
-        {
-            attributes.push(attributes::must_use());
+        if ctx.options().rust_features().must_use_function {
+            let must_use = signature.must_use() || {
+                let ret_ty = signature
+                    .return_type()
+                    .into_resolver()
+                    .through_type_refs()
+                    .resolve(ctx);
+                ret_ty.must_use(ctx)
+            };
+
+            if must_use {
+                attributes.push(attributes::must_use());
+            }
         }
 
         if let Some(comment) = item.comment(ctx) {
@@ -3919,6 +3991,12 @@
                 warn!("Skipping function with thiscall ABI that isn't supported by the configured Rust target");
                 return None;
             }
+            Abi::Vectorcall
+                if !ctx.options().rust_features().vectorcall_abi =>
+            {
+                warn!("Skipping function with vectorcall ABI that isn't supported by the configured Rust target");
+                return None;
+            }
             Abi::Win64 if signature.is_variadic() => {
                 warn!("Skipping variadic function with Win64 ABI that isn't supported");
                 return None;
@@ -3940,11 +4018,13 @@
         }
 
         let link_name = mangled_name.unwrap_or(name);
-        if !utils::names_will_be_identical_after_mangling(
-            &canonical_name,
-            link_name,
-            Some(abi),
-        ) {
+        if !is_dynamic_function &&
+            !utils::names_will_be_identical_after_mangling(
+                &canonical_name,
+                link_name,
+                Some(abi),
+            )
+        {
             attributes.push(attributes::link_name(link_name));
         }
 
@@ -3966,9 +4046,7 @@
         };
 
         // If we're doing dynamic binding generation, add to the dynamic items.
-        if ctx.options().dynamic_library_name.is_some() &&
-            self.kind() == FunctionKind::Function
-        {
+        if is_dynamic_function {
             let args_identifiers =
                 utils::fnsig_argument_identifiers(ctx, signature);
             let return_item = ctx.resolve_item(signature.return_type());
@@ -3985,6 +4063,7 @@
                 args_identifiers,
                 ret,
                 ret_ty,
+                attributes,
             );
         } else {
             result.push(tokens);
@@ -4020,9 +4099,7 @@
 
     let body = if method.is_class_method() {
         let class_name = ctx.rust_ident(
-            class_name
-                .expect("Generating a class method without class name?")
-                .to_owned(),
+            class_name.expect("Generating a class method without class name?"),
         );
         quote! {
             msg_send!(class!(#class_name), #methods_and_args)
@@ -4090,7 +4167,7 @@
                 .collect();
 
             quote! {
-                pub trait #trait_name <#(#template_names),*> : #trait_constraints {
+                pub trait #trait_name <#(#template_names:'static),*> : #trait_constraints {
                     #( #impl_items )*
                 }
             }
@@ -4106,7 +4183,7 @@
         if !self.is_category() && !self.is_protocol() {
             let struct_block = quote! {
                 #[repr(transparent)]
-                #[derive(Clone)]
+                #[derive(Debug, Copy, Clone)]
                 pub struct #class_name(pub id);
                 impl std::ops::Deref for #class_name {
                     type Target = objc::runtime::Object;
@@ -4120,7 +4197,7 @@
                 impl #class_name {
                     pub fn alloc() -> Self {
                         Self(unsafe {
-                            msg_send!(objc::class!(#class_name), alloc)
+                            msg_send!(class!(#class_name), alloc)
                         })
                     }
                 }
@@ -4342,7 +4419,7 @@
             }
         } else {
             quote! {
-                use objc;
+                use objc::{self, msg_send, sel, sel_impl, class};
             }
         };
 
diff --git a/third_party/rust/bindgen/v0_59/crate/src/codegen/struct_layout.rs b/third_party/rust/bindgen/v0_60/crate/src/codegen/struct_layout.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/codegen/struct_layout.rs
rename to third_party/rust/bindgen/v0_60/crate/src/codegen/struct_layout.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/deps.rs b/third_party/rust/bindgen/v0_60/crate/src/deps.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/deps.rs
rename to third_party/rust/bindgen/v0_60/crate/src/deps.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/extra_assertions.rs b/third_party/rust/bindgen/v0_60/crate/src/extra_assertions.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/extra_assertions.rs
rename to third_party/rust/bindgen/v0_60/crate/src/extra_assertions.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/features.rs b/third_party/rust/bindgen/v0_60/crate/src/features.rs
similarity index 96%
rename from third_party/rust/bindgen/v0_59/crate/src/features.rs
rename to third_party/rust/bindgen/v0_60/crate/src/features.rs
index a786f07..59467703 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/features.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/features.rs
@@ -129,6 +129,7 @@
             => Stable_1_47 => 1.47;
             /// Nightly rust
             ///  * `thiscall` calling convention ([Tracking issue](https://github.com/rust-lang/rust/issues/42202))
+            ///  * `vectorcall` calling convention (no tracking issue)
             => Nightly => nightly;
         );
     }
@@ -234,6 +235,7 @@
     }
     Nightly {
         => thiscall_abi;
+        => vectorcall_abi;
     }
 );
 
@@ -259,7 +261,8 @@
                 !f_1_0.associated_const &&
                 !f_1_0.builtin_clone_impls &&
                 !f_1_0.repr_align &&
-                !f_1_0.thiscall_abi
+                !f_1_0.thiscall_abi &&
+                !f_1_0.vectorcall_abi
         );
         let f_1_21 = RustFeatures::from(RustTarget::Stable_1_21);
         assert!(
@@ -269,7 +272,8 @@
                 f_1_21.associated_const &&
                 f_1_21.builtin_clone_impls &&
                 !f_1_21.repr_align &&
-                !f_1_21.thiscall_abi
+                !f_1_21.thiscall_abi &&
+                !f_1_21.vectorcall_abi
         );
         let f_nightly = RustFeatures::from(RustTarget::Nightly);
         assert!(
@@ -280,7 +284,8 @@
                 f_nightly.builtin_clone_impls &&
                 f_nightly.maybe_uninit &&
                 f_nightly.repr_align &&
-                f_nightly.thiscall_abi
+                f_nightly.thiscall_abi &&
+                f_nightly.vectorcall_abi
         );
     }
 
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/analysis/derive.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/analysis/derive.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/analysis/derive.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/analysis/derive.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/analysis/has_destructor.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/analysis/has_destructor.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/analysis/has_destructor.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/analysis/has_destructor.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/analysis/has_float.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/analysis/has_float.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/analysis/has_float.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/analysis/has_float.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/analysis/has_type_param_in_array.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/analysis/has_type_param_in_array.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/analysis/has_type_param_in_array.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/analysis/has_type_param_in_array.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/analysis/has_vtable.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/analysis/has_vtable.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/analysis/has_vtable.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/analysis/has_vtable.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/analysis/mod.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/analysis/mod.rs
similarity index 96%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/analysis/mod.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/analysis/mod.rs
index eb9a1c0d..40dfc6d6 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/ir/analysis/mod.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/ir/analysis/mod.rs
@@ -281,9 +281,13 @@
         fn reverse(&self) -> Graph {
             let mut reversed = Graph::default();
             for (node, edges) in self.0.iter() {
-                reversed.0.entry(*node).or_insert(vec![]);
+                reversed.0.entry(*node).or_insert_with(Vec::new);
                 for referent in edges.iter() {
-                    reversed.0.entry(*referent).or_insert(vec![]).push(*node);
+                    reversed
+                        .0
+                        .entry(*referent)
+                        .or_insert_with(Vec::new)
+                        .push(*node);
                 }
             }
             reversed
@@ -306,8 +310,8 @@
             let reversed = graph.reverse();
             ReachableFrom {
                 reachable: Default::default(),
-                graph: graph,
-                reversed: reversed,
+                graph,
+                reversed,
             }
         }
 
@@ -328,7 +332,7 @@
             let original_size = self
                 .reachable
                 .entry(node)
-                .or_insert(HashSet::default())
+                .or_insert_with(HashSet::default)
                 .len();
 
             for sub_node in self.graph.0[&node].iter() {
@@ -337,7 +341,7 @@
                 let sub_reachable = self
                     .reachable
                     .entry(*sub_node)
-                    .or_insert(HashSet::default())
+                    .or_insert_with(HashSet::default)
                     .clone();
 
                 for transitive in sub_reachable {
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/analysis/sizedness.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/analysis/sizedness.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/analysis/sizedness.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/analysis/sizedness.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/analysis/template_params.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/analysis/template_params.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/analysis/template_params.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/analysis/template_params.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/annotations.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/annotations.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/annotations.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/annotations.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/comment.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/comment.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/comment.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/comment.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/comp.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/comp.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/comp.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/comp.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/context.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/context.rs
similarity index 98%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/context.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/context.rs
index a9e19fb2..3bfe549 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/ir/context.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/ir/context.rs
@@ -364,14 +364,11 @@
 
     in_codegen: bool,
 
-    /// The clang index for parsing.
-    index: clang::Index,
-
     /// The translation unit for parsing.
     translation_unit: clang::TranslationUnit,
 
     /// Target information that can be useful for some stuff.
-    target_info: Option<clang::TargetInfo>,
+    target_info: clang::TargetInfo,
 
     /// The options given by the user via cli or other medium.
     options: BindgenOptions,
@@ -420,12 +417,6 @@
     /// and is always `None` before that and `Some` after.
     cannot_derive_copy: Option<HashSet<ItemId>>,
 
-    /// The set of (`ItemId`s of) types that can't derive copy in array.
-    ///
-    /// This is populated when we enter codegen by `compute_cannot_derive_copy`
-    /// and is always `None` before that and `Some` after.
-    cannot_derive_copy_in_array: Option<HashSet<ItemId>>,
-
     /// The set of (`ItemId`s of) types that can't derive hash.
     ///
     /// This is populated when we enter codegen by `compute_can_derive_hash`
@@ -569,7 +560,6 @@
             replacements: Default::default(),
             collected_typerefs: false,
             in_codegen: false,
-            index,
             translation_unit,
             target_info,
             options,
@@ -582,7 +572,6 @@
             cannot_derive_debug: None,
             cannot_derive_default: None,
             cannot_derive_copy: None,
-            cannot_derive_copy_in_array: None,
             cannot_derive_hash: None,
             cannot_derive_partialeq_or_partialord: None,
             sizedness: None,
@@ -595,10 +584,7 @@
 
     /// Returns `true` if the target architecture is wasm32
     pub fn is_target_wasm32(&self) -> bool {
-        match self.target_info {
-            Some(ref ti) => ti.triple.starts_with("wasm32-"),
-            None => false,
-        }
+        self.target_info.triple.starts_with("wasm32-")
     }
 
     /// Creates a timer for the current bindgen phase. If time_phases is `true`,
@@ -611,10 +597,7 @@
     /// Returns the pointer width to use for the target for the current
     /// translation.
     pub fn target_pointer_size(&self) -> usize {
-        if let Some(ref ti) = self.target_info {
-            return ti.pointer_width / 8;
-        }
-        mem::size_of::<*mut ()>()
+        self.target_info.pointer_width / 8
     }
 
     /// Get the stack of partially parsed types that we are in the middle of
@@ -853,9 +836,9 @@
             )
         {
             let mut s = name.to_owned();
-            s = s.replace("@", "_");
-            s = s.replace("?", "_");
-            s = s.replace("$", "_");
+            s = s.replace('@', "_");
+            s = s.replace('?', "_");
+            s = s.replace('$', "_");
             s.push('_');
             return Cow::Owned(s);
         }
@@ -2307,7 +2290,8 @@
                     // game.
                     if self.options().allowlisted_types.is_empty() &&
                         self.options().allowlisted_functions.is_empty() &&
-                        self.options().allowlisted_vars.is_empty()
+                        self.options().allowlisted_vars.is_empty() &&
+                        self.options().allowlisted_files.is_empty()
                     {
                         return true;
                     }
@@ -2318,6 +2302,23 @@
                         return true;
                     }
 
+                    // Items with a source location in an explicitly allowlisted file
+                    // are always included.
+                    if !self.options().allowlisted_files.is_empty() {
+                        if let Some(location) = item.location() {
+                            let (file, _, _, _) = location.location();
+                            if let Some(filename) = file.name() {
+                                if self
+                                    .options()
+                                    .allowlisted_files
+                                    .matches(&filename)
+                                {
+                                    return true;
+                                }
+                            }
+                        }
+                    }
+
                     let name = item.path_for_allowlisting(self)[1..].join("::");
                     debug!("allowlisted_items: testing {:?}", name);
                     match *item.kind() {
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/derive.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/derive.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/derive.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/derive.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/dot.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/dot.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/dot.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/dot.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/enum_ty.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/enum_ty.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/enum_ty.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/enum_ty.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/function.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/function.rs
similarity index 98%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/function.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/function.rs
index a3a2bbfb..e8e2c2d 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/ir/function.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/ir/function.rs
@@ -131,6 +131,11 @@
         self.signature
     }
 
+    /// Get this function's comment.
+    pub fn comment(&self) -> Option<&str> {
+        self.comment.as_deref()
+    }
+
     /// Get this function's kind.
     pub fn kind(&self) -> FunctionKind {
         self.kind
@@ -176,6 +181,8 @@
     Fastcall,
     /// The "thiscall" ABI.
     ThisCall,
+    /// The "vectorcall" ABI.
+    Vectorcall,
     /// The "aapcs" ABI.
     Aapcs,
     /// The "win64" ABI.
@@ -198,6 +205,7 @@
             Abi::Stdcall => quote! { "stdcall" },
             Abi::Fastcall => quote! { "fastcall" },
             Abi::ThisCall => quote! { "thiscall" },
+            Abi::Vectorcall => quote! { "vectorcall" },
             Abi::Aapcs => quote! { "aapcs" },
             Abi::Win64 => quote! { "win64" },
             Abi::Unknown(cc) => panic!(
@@ -236,6 +244,7 @@
         CXCallingConv_X86StdCall => Abi::Stdcall,
         CXCallingConv_X86FastCall => Abi::Fastcall,
         CXCallingConv_X86ThisCall => Abi::ThisCall,
+        CXCallingConv_X86VectorCall => Abi::Vectorcall,
         CXCallingConv_AAPCS => Abi::Aapcs,
         CXCallingConv_X86_64Win64 => Abi::Win64,
         other => Abi::Unknown(other),
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/int.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/int.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/int.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/int.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/item.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/item.rs
similarity index 99%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/item.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/item.rs
index 8692575..3b15cd6 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/ir/item.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/ir/item.rs
@@ -530,6 +530,11 @@
         &mut self.kind
     }
 
+    /// Where in the source is this item located?
+    pub fn location(&self) -> Option<&clang::SourceLocation> {
+        self.location.as_ref()
+    }
+
     /// Get an identifier that differentiates this item from its siblings.
     ///
     /// This should stay relatively stable in the face of code motion outside or
@@ -1091,6 +1096,11 @@
             _ => return None,
         })
     }
+
+    /// Whether this is a #[must_use] type.
+    pub fn must_use(&self, ctx: &BindgenContext) -> bool {
+        self.annotations().must_use_type() || ctx.must_use_type_by_name(self)
+    }
 }
 
 impl<T> IsOpaque for T
@@ -1889,7 +1899,7 @@
 
         // See tests/headers/const_tparam.hpp and
         // tests/headers/variadic_tname.hpp.
-        let name = ty_spelling.replace("const ", "").replace(".", "");
+        let name = ty_spelling.replace("const ", "").replace('.', "");
 
         let id = with_id.unwrap_or_else(|| ctx.next_item_id());
         let item = Item::new(
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/item_kind.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/item_kind.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/item_kind.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/item_kind.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/layout.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/layout.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/layout.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/layout.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/mod.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/mod.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/mod.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/mod.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/module.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/module.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/module.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/module.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/objc.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/objc.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/objc.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/objc.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/template.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/template.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/template.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/template.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/traversal.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/traversal.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/traversal.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/traversal.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/ty.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/ty.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/ty.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/ty.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/ir/var.rs b/third_party/rust/bindgen/v0_60/crate/src/ir/var.rs
similarity index 84%
rename from third_party/rust/bindgen/v0_59/crate/src/ir/var.rs
rename to third_party/rust/bindgen/v0_60/crate/src/ir/var.rs
index cd17937..e44d57a 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/ir/var.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/ir/var.rs
@@ -149,52 +149,27 @@
     }
 }
 
-/// Determines whether a set of tokens from a CXCursor_MacroDefinition
-/// represent a function-like macro. If so, calls the func_macro callback
-/// and returns `Err(ParseError::Continue)` to signal to skip further
-/// processing. If conversion to UTF-8 fails (it is performed only where it
-/// should be infallible), then `Err(ParseError::Continue)` is returned as well.
+/// Parses tokens from a CXCursor_MacroDefinition pointing into a function-like
+/// macro, and calls the func_macro callback.
 fn handle_function_macro(
     cursor: &clang::Cursor,
-    tokens: &[ClangToken],
     callbacks: &dyn crate::callbacks::ParseCallbacks,
-) -> Result<(), ParseError> {
-    // TODO: Hoist the `is_macro_function_like` check into this function's
-    // caller, and thus avoid allocating the `tokens` vector for non-functional
-    // macros.
-    let is_functional_macro = cursor.is_macro_function_like();
-
-    if !is_functional_macro {
-        return Ok(());
-    }
-
+) {
     let is_closing_paren = |t: &ClangToken| {
         // Test cheap token kind before comparing exact spellings.
         t.kind == clang_sys::CXToken_Punctuation && t.spelling() == b")"
     };
-    let boundary = tokens.iter().position(is_closing_paren);
-
-    let mut spelled = tokens.iter().map(ClangToken::spelling);
-    // Add 1, to convert index to length.
-    let left = spelled
-        .by_ref()
-        .take(boundary.ok_or(ParseError::Continue)? + 1);
-    let left = left.collect::<Vec<_>>().concat();
-    let left = String::from_utf8(left).map_err(|_| ParseError::Continue)?;
-    let right = spelled;
-    // Drop last token with LLVM < 4.0, due to an LLVM bug.
-    //
-    // See:
-    //   https://bugs.llvm.org//show_bug.cgi?id=9069
-    let len = match (right.len(), crate::clang_version().parsed) {
-        (len, Some((v, _))) if len > 0 && v < 4 => len - 1,
-        (len, _) => len,
-    };
-    let right: Vec<_> = right.take(len).collect();
-    callbacks.func_macro(&left, &right);
-
-    // We handled the macro, skip future macro processing.
-    Err(ParseError::Continue)
+    let tokens: Vec<_> = cursor.tokens().iter().collect();
+    if let Some(boundary) = tokens.iter().position(is_closing_paren) {
+        let mut spelled = tokens.iter().map(ClangToken::spelling);
+        // Add 1, to convert index to length.
+        let left = spelled.by_ref().take(boundary + 1);
+        let left = left.collect::<Vec<_>>().concat();
+        if let Ok(left) = String::from_utf8(left) {
+            let right: Vec<_> = spelled.collect();
+            callbacks.func_macro(&left, &right);
+        }
+    }
 }
 
 impl ClangSubItemParser for Var {
@@ -207,8 +182,6 @@
         use clang_sys::*;
         match cursor.kind() {
             CXCursor_MacroDefinition => {
-                let tokens: Vec<_> = cursor.tokens().iter().collect();
-
                 if let Some(callbacks) = ctx.parse_callbacks() {
                     match callbacks.will_parse_macro(&cursor.spelling()) {
                         MacroParsingBehavior::Ignore => {
@@ -217,10 +190,14 @@
                         MacroParsingBehavior::Default => {}
                     }
 
-                    handle_function_macro(&cursor, &tokens, callbacks)?;
+                    if cursor.is_macro_function_like() {
+                        handle_function_macro(&cursor, callbacks);
+                        // We handled the macro, skip macro processing below.
+                        return Err(ParseError::Continue);
+                    }
                 }
 
-                let value = parse_macro(ctx, &tokens);
+                let value = parse_macro(ctx, &cursor);
 
                 let (id, value) = match value {
                     Some(v) => v,
@@ -387,29 +364,14 @@
 /// Try and parse a macro using all the macros parsed until now.
 fn parse_macro(
     ctx: &BindgenContext,
-    tokens: &[ClangToken],
+    cursor: &clang::Cursor,
 ) -> Option<(Vec<u8>, cexpr::expr::EvalResult)> {
     use cexpr::expr;
 
-    let mut cexpr_tokens: Vec<_> = tokens
-        .iter()
-        .filter_map(ClangToken::as_cexpr_token)
-        .collect();
+    let cexpr_tokens = cursor.cexpr_tokens();
 
     let parser = expr::IdentifierParser::new(ctx.parsed_macros());
 
-    if let Ok((_, (id, val))) = parser.macro_definition(&cexpr_tokens) {
-        return Some((id.into(), val));
-    }
-
-    // Try without the last token, to workaround a libclang bug in versions
-    // previous to 4.0.
-    //
-    // See:
-    //   https://bugs.llvm.org//show_bug.cgi?id=9069
-    //   https://reviews.llvm.org/D26446
-    cexpr_tokens.pop()?;
-
     match parser.macro_definition(&cexpr_tokens) {
         Ok((_, (id, val))) => Some((id.into(), val)),
         _ => None,
diff --git a/third_party/rust/bindgen/v0_59/crate/src/lib.rs b/third_party/rust/bindgen/v0_60/crate/src/lib.rs
similarity index 95%
rename from third_party/rust/bindgen/v0_59/crate/src/lib.rs
rename to third_party/rust/bindgen/v0_60/crate/src/lib.rs
index abe1ed7..3d09ab7 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/lib.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/lib.rs
@@ -232,6 +232,20 @@
     Default::default()
 }
 
+fn get_extra_clang_args() -> Vec<String> {
+    // Add any extra arguments from the environment to the clang command line.
+    let extra_clang_args =
+        match get_target_dependent_env_var("BINDGEN_EXTRA_CLANG_ARGS") {
+            None => return vec![],
+            Some(s) => s,
+        };
+    // Try to parse it with shell quoting. If we fail, make it one single big argument.
+    if let Some(strings) = shlex::split(&extra_clang_args) {
+        return strings;
+    }
+    vec![extra_clang_args]
+}
+
 impl Builder {
     /// Generates the command line flags use for creating `Builder`.
     pub fn command_line_flags(&self) -> Vec<String> {
@@ -313,6 +327,7 @@
             (&self.options.allowlisted_functions, "--allowlist-function"),
             (&self.options.allowlisted_types, "--allowlist-type"),
             (&self.options.allowlisted_vars, "--allowlist-var"),
+            (&self.options.allowlisted_files, "--allowlist-file"),
             (&self.options.no_partialeq_types, "--no-partialeq"),
             (&self.options.no_copy_types, "--no-copy"),
             (&self.options.no_debug_types, "--no-debug"),
@@ -568,6 +583,10 @@
             output_vector.push("--explicit-padding".into());
         }
 
+        if self.options.vtable_generation {
+            output_vector.push("--vtable-generation".into());
+        }
+
         // Add clang arguments
 
         output_vector.push("--".into());
@@ -908,6 +927,12 @@
         self
     }
 
+    /// Allowlist the given file so that its contents appear in the generated bindings.
+    pub fn allowlist_file<T: AsRef<str>>(mut self, arg: T) -> Builder {
+        self.options.allowlisted_files.insert(arg);
+        self
+    }
+
     /// Deprecated: use allowlist_var instead.
     #[deprecated(note = "use allowlist_var instead")]
     pub fn whitelist_var<T: AsRef<str>>(self, arg: T) -> Builder {
@@ -1443,19 +1468,18 @@
         self
     }
 
+    /// If true, enables experimental support to generate vtable functions.
+    ///
+    /// Should mostly work, though some edge cases are likely to be broken.
+    pub fn vtable_generation(mut self, doit: bool) -> Self {
+        self.options.vtable_generation = doit;
+        self
+    }
+
     /// Generate the Rust bindings using the options built up thus far.
-    pub fn generate(mut self) -> Result<Bindings, ()> {
+    pub fn generate(mut self) -> Result<Bindings, BindgenError> {
         // Add any extra arguments from the environment to the clang command line.
-        if let Some(extra_clang_args) =
-            get_target_dependent_env_var("BINDGEN_EXTRA_CLANG_ARGS")
-        {
-            // Try to parse it with shell quoting. If we fail, make it one single big argument.
-            if let Some(strings) = shlex::split(&extra_clang_args) {
-                self.options.clang_args.extend(strings);
-            } else {
-                self.options.clang_args.push(extra_clang_args);
-            };
-        }
+        self.options.clang_args.extend(get_extra_clang_args());
 
         // Transform input headers to arguments on the clang command line.
         self.options.input_header = self.input_headers.pop();
@@ -1542,6 +1566,10 @@
             cmd.arg(a);
         }
 
+        for a in get_extra_clang_args() {
+            cmd.arg(a);
+        }
+
         let mut child = cmd.spawn()?;
 
         let mut preprocessed = child.stdout.take().unwrap();
@@ -1705,6 +1733,9 @@
     /// Allowlisted variables. See docs for `allowlisted_types` for more.
     allowlisted_vars: RegexSet,
 
+    /// The set of files whose contents should be allowlisted.
+    allowlisted_files: RegexSet,
+
     /// The default style of code to generate for enums
     default_enum_style: codegen::EnumVariation,
 
@@ -1827,13 +1858,6 @@
     /// Whether to time the bindgen phases.
     time_phases: bool,
 
-    /// True if we should generate constant names that are **directly** under
-    /// namespaces.
-    namespaced_constants: bool,
-
-    /// True if we should use MSVC name mangling rules.
-    msvc_mangling: bool,
-
     /// Whether we should convert float types to f32/f64 types.
     convert_floats: bool,
 
@@ -1978,6 +2002,9 @@
 
     /// Always output explicit padding fields
     force_explicit_padding: bool,
+
+    /// Emit vtable functions.
+    vtable_generation: bool,
 }
 
 /// TODO(emilio): This is sort of a lie (see the error message that results from
@@ -1991,6 +2018,7 @@
             &mut self.allowlisted_vars,
             &mut self.allowlisted_types,
             &mut self.allowlisted_functions,
+            &mut self.allowlisted_files,
             &mut self.blocklisted_types,
             &mut self.blocklisted_functions,
             &mut self.blocklisted_items,
@@ -2049,6 +2077,7 @@
             allowlisted_types: Default::default(),
             allowlisted_functions: Default::default(),
             allowlisted_vars: Default::default(),
+            allowlisted_files: Default::default(),
             default_enum_style: Default::default(),
             bitfield_enums: Default::default(),
             newtype_enums: Default::default(),
@@ -2084,8 +2113,6 @@
             use_core: false,
             ctypes_prefix: None,
             anon_fields_prefix: DEFAULT_ANON_FIELDS_PREFIX.into(),
-            namespaced_constants: true,
-            msvc_mangling: false,
             convert_floats: true,
             raw_lines: vec![],
             module_lines: HashMap::default(),
@@ -2125,6 +2152,7 @@
             translate_enum_integer_types: false,
             c_naming: false,
             force_explicit_padding: false,
+            vtable_generation: false,
         }
     }
 }
@@ -2155,6 +2183,41 @@
 #[cfg(not(feature = "runtime"))]
 fn ensure_libclang_is_loaded() {}
 
+/// Error type for rust-bindgen.
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+#[non_exhaustive]
+pub enum BindgenError {
+    /// The header was a folder.
+    FolderAsHeader(PathBuf),
+    /// Permissions to read the header is insufficient.
+    InsufficientPermissions(PathBuf),
+    /// The header does not exist.
+    NotExist(PathBuf),
+    /// Clang diagnosed an error.
+    ClangDiagnostic(String),
+}
+
+impl std::fmt::Display for BindgenError {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            BindgenError::FolderAsHeader(h) => {
+                write!(f, "'{}' is a folder", h.display())
+            }
+            BindgenError::InsufficientPermissions(h) => {
+                write!(f, "insufficient permissions to read '{}'", h.display())
+            }
+            BindgenError::NotExist(h) => {
+                write!(f, "header '{}' does not exist.", h.display())
+            }
+            BindgenError::ClangDiagnostic(message) => {
+                write!(f, "clang diagnosed error: {}", message)
+            }
+        }
+    }
+}
+
+impl std::error::Error for BindgenError {}
+
 /// Generated Rust bindings.
 #[derive(Debug)]
 pub struct Bindings {
@@ -2173,6 +2236,10 @@
         clang_target
             .push_str(rust_target.strip_prefix("aarch64-apple-").unwrap());
         return clang_target;
+    } else if rust_target.starts_with("riscv64gc-") {
+        let mut clang_target = "riscv64-".to_owned();
+        clang_target.push_str(rust_target.strip_prefix("riscv64gc-").unwrap());
+        return clang_target;
     }
     rust_target.to_owned()
 }
@@ -2207,7 +2274,7 @@
     /// Generate bindings for the given options.
     pub(crate) fn generate(
         mut options: BindgenOptions,
-    ) -> Result<Bindings, ()> {
+    ) -> Result<Bindings, BindgenError> {
         ensure_libclang_is_loaded();
 
         #[cfg(feature = "runtime")]
@@ -2325,22 +2392,19 @@
         }
 
         if let Some(h) = options.input_header.as_ref() {
-            if let Ok(md) = std::fs::metadata(h) {
+            let path = Path::new(h);
+            if let Ok(md) = std::fs::metadata(path) {
                 if md.is_dir() {
-                    eprintln!("error: '{}' is a folder", h);
-                    return Err(());
+                    return Err(BindgenError::FolderAsHeader(path.into()));
                 }
                 if !can_read(&md.permissions()) {
-                    eprintln!(
-                        "error: insufficient permissions to read '{}'",
-                        h
-                    );
-                    return Err(());
+                    return Err(BindgenError::InsufficientPermissions(
+                        path.into(),
+                    ));
                 }
                 options.clang_args.push(h.clone())
             } else {
-                eprintln!("error: header '{}' does not exist.", h);
-                return Err(());
+                return Err(BindgenError::NotExist(path.into()));
             }
         }
 
@@ -2561,19 +2625,24 @@
 }
 
 /// Parse the Clang AST into our `Item` internal representation.
-fn parse(context: &mut BindgenContext) -> Result<(), ()> {
+fn parse(context: &mut BindgenContext) -> Result<(), BindgenError> {
     use clang_sys::*;
 
-    let mut any_error = false;
+    let mut error = None;
     for d in context.translation_unit().diags().iter() {
         let msg = d.format();
         let is_err = d.severity() >= CXDiagnostic_Error;
-        eprintln!("{}, err: {}", msg, is_err);
-        any_error |= is_err;
+        if is_err {
+            let error = error.get_or_insert_with(String::new);
+            error.push_str(&msg);
+            error.push('\n');
+        } else {
+            eprintln!("clang diag: {}", msg);
+        }
     }
 
-    if any_error {
-        return Err(());
+    if let Some(message) = error {
+        return Err(BindgenError::ClangDiagnostic(message));
     }
 
     let cursor = context.translation_unit().cursor();
@@ -2645,7 +2714,7 @@
             return Some(v);
         }
         if let Ok(v) =
-            env::var(&format!("{}_{}", var, target.replace("-", "_")))
+            env::var(&format!("{}_{}", var, target.replace('-', "_")))
         {
             return Some(v);
         }
@@ -2691,9 +2760,7 @@
     .map(|&x| x.into())
     .collect::<Vec<String>>();
 
-    assert!(test_cases
-        .iter()
-        .all(|ref x| command_line_flags.contains(x),));
+    assert!(test_cases.iter().all(|x| command_line_flags.contains(x)));
 
     //Test 2
     let bindings = crate::builder()
@@ -2718,12 +2785,18 @@
     .collect::<Vec<String>>();
     println!("{:?}", command_line_flags);
 
-    assert!(test_cases
-        .iter()
-        .all(|ref x| command_line_flags.contains(x),));
+    assert!(test_cases.iter().all(|x| command_line_flags.contains(x)));
 }
 
 #[test]
 fn test_rust_to_clang_target() {
     assert_eq!(rust_to_clang_target("aarch64-apple-ios"), "arm64-apple-ios");
 }
+
+#[test]
+fn test_rust_to_clang_target_riscv() {
+    assert_eq!(
+        rust_to_clang_target("riscv64gc-unknown-linux-gnu"),
+        "riscv64-unknown-linux-gnu"
+    )
+}
diff --git a/third_party/rust/bindgen/v0_59/crate/src/log_stubs.rs b/third_party/rust/bindgen/v0_60/crate/src/log_stubs.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/log_stubs.rs
rename to third_party/rust/bindgen/v0_60/crate/src/log_stubs.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/main.rs b/third_party/rust/bindgen/v0_60/crate/src/main.rs
similarity index 94%
rename from third_party/rust/bindgen/v0_59/crate/src/main.rs
rename to third_party/rust/bindgen/v0_60/crate/src/main.rs
index f3398db..50f3e71 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/main.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/main.rs
@@ -23,10 +23,6 @@
         Some((9, 0))
     } else if cfg!(feature = "testing_only_libclang_5") {
         Some((5, 0))
-    } else if cfg!(feature = "testing_only_libclang_4") {
-        Some((4, 0))
-    } else if cfg!(feature = "testing_only_libclang_3_9") {
-        Some((3, 9))
     } else {
         None
     };
diff --git a/third_party/rust/bindgen/v0_59/crate/src/options.rs b/third_party/rust/bindgen/v0_60/crate/src/options.rs
similarity index 82%
rename from third_party/rust/bindgen/v0_59/crate/src/options.rs
rename to third_party/rust/bindgen/v0_60/crate/src/options.rs
index bc7431c..4e1fb93 100644
--- a/third_party/rust/bindgen/v0_59/crate/src/options.rs
+++ b/third_party/rust/bindgen/v0_60/crate/src/options.rs
@@ -23,18 +23,18 @@
     );
 
     let matches = App::new("bindgen")
-        .version(option_env!("CARGO_PKG_VERSION").unwrap_or("unknown"))
         .about("Generates Rust bindings from C/C++ headers.")
-        .usage("bindgen [FLAGS] [OPTIONS] <header> -- <clang-args>...")
+        .setting(clap::AppSettings::NoAutoVersion)
+        .override_usage("bindgen [FLAGS] [OPTIONS] <header> -- <clang-args>...")
         .args(&[
-            Arg::with_name("header")
+            Arg::new("header")
                 .help("C or C++ header file")
-                .required(true),
-            Arg::with_name("depfile")
+                .required_unless_present("V"),
+            Arg::new("depfile")
                 .long("depfile")
                 .takes_value(true)
                 .help("Path to write depfile to"),
-            Arg::with_name("default-enum-style")
+            Arg::new("default-enum-style")
                 .long("default-enum-style")
                 .help("The default style of code used to generate enums.")
                 .value_name("variant")
@@ -47,8 +47,8 @@
                     "rust",
                     "rust_non_exhaustive",
                 ])
-                .multiple(false),
-            Arg::with_name("bitfield-enum")
+                .multiple_occurrences(false),
+            Arg::new("bitfield-enum")
                 .long("bitfield-enum")
                 .help(
                     "Mark any enum whose name matches <regex> as a set of \
@@ -56,23 +56,23 @@
                 )
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("newtype-enum")
+            Arg::new("newtype-enum")
                 .long("newtype-enum")
                 .help("Mark any enum whose name matches <regex> as a newtype.")
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("rustified-enum")
+            Arg::new("rustified-enum")
                 .long("rustified-enum")
                 .help("Mark any enum whose name matches <regex> as a Rust enum.")
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("constified-enum")
+            Arg::new("constified-enum")
                 .long("constified-enum")
                 .help(
                     "Mark any enum whose name matches <regex> as a series of \
@@ -80,9 +80,9 @@
                 )
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("constified-enum-module")
+            Arg::new("constified-enum-module")
                 .long("constified-enum-module")
                 .help(
                     "Mark any enum whose name matches <regex> as a module of \
@@ -90,16 +90,16 @@
                 )
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("default-macro-constant-type")
+            Arg::new("default-macro-constant-type")
                 .long("default-macro-constant-type")
                 .help("The default signed/unsigned type for C macro constants.")
                 .value_name("variant")
                 .default_value("unsigned")
                 .possible_values(&["signed", "unsigned"])
-                .multiple(false),
-            Arg::with_name("default-alias-style")
+                .multiple_occurrences(false),
+            Arg::new("default-alias-style")
                 .long("default-alias-style")
                 .help("The default style of code used to generate typedefs.")
                 .value_name("variant")
@@ -109,8 +109,8 @@
                     "new_type",
                     "new_type_deref",
                 ])
-                .multiple(false),
-            Arg::with_name("normal-alias")
+                .multiple_occurrences(false),
+            Arg::new("normal-alias")
                 .long("normal-alias")
                 .help(
                     "Mark any typedef alias whose name matches <regex> to use \
@@ -118,9 +118,9 @@
                 )
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-             Arg::with_name("new-type-alias")
+             Arg::new("new-type-alias")
                 .long("new-type-alias")
                 .help(
                     "Mark any typedef alias whose name matches <regex> to have \
@@ -128,9 +128,9 @@
                 )
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-             Arg::with_name("new-type-alias-deref")
+             Arg::new("new-type-alias-deref")
                 .long("new-type-alias-deref")
                 .help(
                     "Mark any typedef alias whose name matches <regex> to have \
@@ -138,94 +138,94 @@
                 )
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("blocklist-type")
+            Arg::new("blocklist-type")
                 .alias("blacklist-type")
                 .long("blocklist-type")
                 .help("Mark <type> as hidden.")
                 .value_name("type")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("blocklist-function")
+            Arg::new("blocklist-function")
                 .alias("blacklist-function")
                 .long("blocklist-function")
                 .help("Mark <function> as hidden.")
                 .value_name("function")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("blocklist-item")
+            Arg::new("blocklist-item")
                 .alias("blacklist-item")
                 .long("blocklist-item")
                 .help("Mark <item> as hidden.")
                 .value_name("item")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("blocklist-file")
+            Arg::new("blocklist-file")
                 .alias("blacklist-file")
                 .long("blocklist-file")
                 .help("Mark all contents of <path> as hidden.")
                 .value_name("path")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("no-layout-tests")
+            Arg::new("no-layout-tests")
                 .long("no-layout-tests")
                 .help("Avoid generating layout tests for any type."),
-            Arg::with_name("no-derive-copy")
+            Arg::new("no-derive-copy")
                 .long("no-derive-copy")
                 .help("Avoid deriving Copy on any type."),
-            Arg::with_name("no-derive-debug")
+            Arg::new("no-derive-debug")
                 .long("no-derive-debug")
                 .help("Avoid deriving Debug on any type."),
-            Arg::with_name("no-derive-default")
+            Arg::new("no-derive-default")
                 .long("no-derive-default")
-                .hidden(true)
+                .hide(true)
                 .help("Avoid deriving Default on any type."),
-            Arg::with_name("impl-debug").long("impl-debug").help(
+            Arg::new("impl-debug").long("impl-debug").help(
                 "Create Debug implementation, if it can not be derived \
                  automatically.",
             ),
-            Arg::with_name("impl-partialeq")
+            Arg::new("impl-partialeq")
                 .long("impl-partialeq")
                 .help(
                     "Create PartialEq implementation, if it can not be derived \
                      automatically.",
                 ),
-            Arg::with_name("with-derive-default")
+            Arg::new("with-derive-default")
                 .long("with-derive-default")
                 .help("Derive Default on any type."),
-            Arg::with_name("with-derive-hash")
+            Arg::new("with-derive-hash")
                 .long("with-derive-hash")
                 .help("Derive hash on any type."),
-            Arg::with_name("with-derive-partialeq")
+            Arg::new("with-derive-partialeq")
                 .long("with-derive-partialeq")
                 .help("Derive partialeq on any type."),
-            Arg::with_name("with-derive-partialord")
+            Arg::new("with-derive-partialord")
                 .long("with-derive-partialord")
                 .help("Derive partialord on any type."),
-            Arg::with_name("with-derive-eq")
+            Arg::new("with-derive-eq")
                 .long("with-derive-eq")
                 .help(
                     "Derive eq on any type. Enable this option also \
                      enables --with-derive-partialeq",
                 ),
-            Arg::with_name("with-derive-ord")
+            Arg::new("with-derive-ord")
                 .long("with-derive-ord")
                 .help(
                     "Derive ord on any type. Enable this option also \
                      enables --with-derive-partialord",
                 ),
-            Arg::with_name("no-doc-comments")
+            Arg::new("no-doc-comments")
                 .long("no-doc-comments")
                 .help(
                     "Avoid including doc comments in the output, see: \
                      https://github.com/rust-lang/rust-bindgen/issues/426",
                 ),
-            Arg::with_name("no-recursive-allowlist")
+            Arg::new("no-recursive-allowlist")
                 .long("no-recursive-allowlist")
                 .alias("no-recursive-whitelist")
                 .help(
@@ -234,23 +234,23 @@
                      `bindgen::Builder::allowlist_recursively` method's \
                      documentation for details.",
                 ),
-            Arg::with_name("objc-extern-crate")
+            Arg::new("objc-extern-crate")
                 .long("objc-extern-crate")
                 .help("Use extern crate instead of use for objc."),
-            Arg::with_name("generate-block")
+            Arg::new("generate-block")
                 .long("generate-block")
                 .help("Generate block signatures instead of void pointers."),
-            Arg::with_name("block-extern-crate")
+            Arg::new("block-extern-crate")
                 .long("block-extern-crate")
                 .help("Use extern crate instead of use for block."),
-            Arg::with_name("distrust-clang-mangling")
+            Arg::new("distrust-clang-mangling")
                 .long("distrust-clang-mangling")
                 .help("Do not trust the libclang-provided mangling"),
-            Arg::with_name("builtins").long("builtins").help(
+            Arg::new("builtins").long("builtins").help(
                 "Output bindings for builtin definitions, e.g. \
                  __builtin_va_list.",
             ),
-            Arg::with_name("ctypes-prefix")
+            Arg::new("ctypes-prefix")
                 .long("ctypes-prefix")
                 .help(
                     "Use the given prefix before raw types instead of \
@@ -258,61 +258,61 @@
                 )
                 .value_name("prefix")
                 .takes_value(true),
-            Arg::with_name("anon-fields-prefix")
+            Arg::new("anon-fields-prefix")
                 .long("anon-fields-prefix")
                 .help("Use the given prefix for the anon fields.")
                 .value_name("prefix")
                 .default_value(DEFAULT_ANON_FIELDS_PREFIX)
                 .takes_value(true),
-            Arg::with_name("time-phases")
+            Arg::new("time-phases")
                 .long("time-phases")
                 .help("Time the different bindgen phases and print to stderr"),
             // All positional arguments after the end of options marker, `--`
-            Arg::with_name("clang-args").last(true).multiple(true),
-            Arg::with_name("emit-clang-ast")
+            Arg::new("clang-args").last(true).multiple_occurrences(true),
+            Arg::new("emit-clang-ast")
                 .long("emit-clang-ast")
                 .help("Output the Clang AST for debugging purposes."),
-            Arg::with_name("emit-ir")
+            Arg::new("emit-ir")
                 .long("emit-ir")
                 .help("Output our internal IR for debugging purposes."),
-            Arg::with_name("emit-ir-graphviz")
+            Arg::new("emit-ir-graphviz")
                 .long("emit-ir-graphviz")
                 .help("Dump graphviz dot file.")
                 .value_name("path")
                 .takes_value(true),
-            Arg::with_name("enable-cxx-namespaces")
+            Arg::new("enable-cxx-namespaces")
                 .long("enable-cxx-namespaces")
                 .help("Enable support for C++ namespaces."),
-            Arg::with_name("disable-name-namespacing")
+            Arg::new("disable-name-namespacing")
                 .long("disable-name-namespacing")
                 .help(
                     "Disable namespacing via mangling, causing bindgen to \
                      generate names like \"Baz\" instead of \"foo_bar_Baz\" \
                      for an input name \"foo::bar::Baz\".",
                 ),
-            Arg::with_name("disable-nested-struct-naming")
+            Arg::new("disable-nested-struct-naming")
                 .long("disable-nested-struct-naming")
                 .help(
                     "Disable nested struct naming, causing bindgen to generate \
                      names like \"bar\" instead of \"foo_bar\" for a nested \
                      definition \"struct foo { struct bar { } b; };\"."
                 ),
-            Arg::with_name("disable-untagged-union")
+            Arg::new("disable-untagged-union")
                 .long("disable-untagged-union")
                 .help(
                     "Disable support for native Rust unions.",
                 ),
-            Arg::with_name("disable-header-comment")
+            Arg::new("disable-header-comment")
                 .long("disable-header-comment")
                 .help("Suppress insertion of bindgen's version identifier into generated bindings.")
-                .multiple(true),
-            Arg::with_name("ignore-functions")
+                .multiple_occurrences(true),
+            Arg::new("ignore-functions")
                 .long("ignore-functions")
                 .help(
                     "Do not generate bindings for functions or methods. This \
                      is useful when you only care about struct layouts.",
                 ),
-            Arg::with_name("generate")
+            Arg::new("generate")
                 .long("generate")
                 .help(
                     "Generate only given items, split by commas. \
@@ -320,67 +320,67 @@
                      \"methods\", \"constructors\" and \"destructors\".",
                 )
                 .takes_value(true),
-            Arg::with_name("ignore-methods")
+            Arg::new("ignore-methods")
                 .long("ignore-methods")
                 .help("Do not generate bindings for methods."),
-            Arg::with_name("no-convert-floats")
+            Arg::new("no-convert-floats")
                 .long("no-convert-floats")
                 .help("Do not automatically convert floats to f32/f64."),
-            Arg::with_name("no-prepend-enum-name")
+            Arg::new("no-prepend-enum-name")
                 .long("no-prepend-enum-name")
                 .help("Do not prepend the enum name to constant or newtype variants."),
-            Arg::with_name("no-include-path-detection")
+            Arg::new("no-include-path-detection")
                 .long("no-include-path-detection")
                 .help("Do not try to detect default include paths"),
-            Arg::with_name("fit-macro-constant-types")
+            Arg::new("fit-macro-constant-types")
                 .long("fit-macro-constant-types")
                 .help("Try to fit macro constants into types smaller than u32/i32"),
-            Arg::with_name("unstable-rust")
+            Arg::new("unstable-rust")
                 .long("unstable-rust")
                 .help("Generate unstable Rust code (deprecated; use --rust-target instead).")
-                .multiple(true), // FIXME: Pass legacy test suite
-            Arg::with_name("opaque-type")
+                .multiple_occurrences(true), // FIXME: Pass legacy test suite
+            Arg::new("opaque-type")
                 .long("opaque-type")
                 .help("Mark <type> as opaque.")
                 .value_name("type")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("output")
-                .short("o")
+            Arg::new("output")
+                .short('o')
                 .long("output")
                 .help("Write Rust bindings to <output>.")
                 .takes_value(true),
-            Arg::with_name("raw-line")
+            Arg::new("raw-line")
                 .long("raw-line")
                 .help("Add a raw line of Rust code at the beginning of output.")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("module-raw-line")
+            Arg::new("module-raw-line")
                 .long("module-raw-line")
                 .help("Add a raw line of Rust code to a given module.")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(2)
                 .value_names(&["module-name", "raw-line"]),
-            Arg::with_name("rust-target")
+            Arg::new("rust-target")
                 .long("rust-target")
-                .help(&rust_target_help)
+                .help(rust_target_help.as_ref())
                 .takes_value(true),
-            Arg::with_name("use-core")
+            Arg::new("use-core")
                 .long("use-core")
                 .help("Use types from Rust core instead of std."),
-            Arg::with_name("conservative-inline-namespaces")
+            Arg::new("conservative-inline-namespaces")
                 .long("conservative-inline-namespaces")
                 .help(
                     "Conservatively generate inline namespaces to avoid name \
                      conflicts.",
                 ),
-            Arg::with_name("use-msvc-mangling")
+            Arg::new("use-msvc-mangling")
                 .long("use-msvc-mangling")
                 .help("MSVC C++ ABI mangling. DEPRECATED: Has no effect."),
-            Arg::with_name("allowlist-function")
+            Arg::new("allowlist-function")
                 .long("allowlist-function")
                 .alias("whitelist-function")
                 .help(
@@ -390,12 +390,12 @@
                 )
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("generate-inline-functions")
+            Arg::new("generate-inline-functions")
                 .long("generate-inline-functions")
                 .help("Generate inline functions."),
-            Arg::with_name("allowlist-type")
+            Arg::new("allowlist-type")
                 .long("allowlist-type")
                 .alias("whitelist-type")
                 .help(
@@ -404,9 +404,9 @@
                 )
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("allowlist-var")
+            Arg::new("allowlist-var")
                 .long("allowlist-var")
                 .alias("whitelist-var")
                 .help(
@@ -416,12 +416,20 @@
                 )
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("verbose")
+            Arg::new("allowlist-file")
+                .alias("allowlist-file")
+                .long("allowlist-file")
+                .help("Allowlist all contents of <path>.")
+                .value_name("path")
+                .takes_value(true)
+                .multiple_occurrences(true)
+                .number_of_values(1),
+            Arg::new("verbose")
                 .long("verbose")
                 .help("Print verbose error messages."),
-            Arg::with_name("dump-preprocessed-input")
+            Arg::new("dump-preprocessed-input")
                 .long("dump-preprocessed-input")
                 .help(
                     "Preprocess and dump the input header files to disk. \
@@ -429,26 +437,26 @@
                      filing issues. The resulting file will be named \
                      something like `__bindgen.i` or `__bindgen.ii`.",
                 ),
-            Arg::with_name("no-record-matches")
+            Arg::new("no-record-matches")
                 .long("no-record-matches")
                 .help(
                     "Do not record matching items in the regex sets. \
                      This disables reporting of unused items.",
                 ),
-            Arg::with_name("size_t-is-usize")
+            Arg::new("size_t-is-usize")
                 .long("size_t-is-usize")
                 .help("Translate size_t to usize."),
-            Arg::with_name("no-rustfmt-bindings")
+            Arg::new("no-rustfmt-bindings")
                 .long("no-rustfmt-bindings")
                 .help("Do not format the generated bindings with rustfmt."),
-            Arg::with_name("rustfmt-bindings")
+            Arg::new("rustfmt-bindings")
                 .long("rustfmt-bindings")
                 .help(
                     "Format the generated bindings with rustfmt. DEPRECATED: \
                      --rustfmt-bindings is now enabled by default. Disable \
                      with --no-rustfmt-bindings.",
                 ),
-            Arg::with_name("rustfmt-configuration-file")
+            Arg::new("rustfmt-configuration-file")
                 .long("rustfmt-configuration-file")
                 .help(
                     "The absolute path to the rustfmt configuration file. \
@@ -457,86 +465,104 @@
                 )
                 .value_name("path")
                 .takes_value(true)
-                .multiple(false)
+                .multiple_occurrences(false)
                 .number_of_values(1),
-            Arg::with_name("no-partialeq")
+            Arg::new("no-partialeq")
                 .long("no-partialeq")
                 .help("Avoid deriving PartialEq for types matching <regex>.")
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("no-copy")
+            Arg::new("no-copy")
                 .long("no-copy")
                 .help("Avoid deriving Copy for types matching <regex>.")
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("no-debug")
+            Arg::new("no-debug")
                 .long("no-debug")
                 .help("Avoid deriving Debug for types matching <regex>.")
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("no-default")
+            Arg::new("no-default")
                 .long("no-default")
                 .help("Avoid deriving/implement Default for types matching <regex>.")
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("no-hash")
+            Arg::new("no-hash")
                 .long("no-hash")
                 .help("Avoid deriving Hash for types matching <regex>.")
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("must-use-type")
+            Arg::new("must-use-type")
                 .long("must-use-type")
                 .help("Add #[must_use] annotation to types matching <regex>.")
                 .value_name("regex")
                 .takes_value(true)
-                .multiple(true)
+                .multiple_occurrences(true)
                 .number_of_values(1),
-            Arg::with_name("enable-function-attribute-detection")
+            Arg::new("enable-function-attribute-detection")
                 .long("enable-function-attribute-detection")
                 .help(
                     "Enables detecting unexposed attributes in functions (slow).
                        Used to generate #[must_use] annotations.",
                 ),
-            Arg::with_name("use-array-pointers-in-arguments")
+            Arg::new("use-array-pointers-in-arguments")
                 .long("use-array-pointers-in-arguments")
                 .help("Use `*const [T; size]` instead of `*const T` for C arrays"),
-            Arg::with_name("wasm-import-module-name")
+            Arg::new("wasm-import-module-name")
                 .long("wasm-import-module-name")
                 .value_name("name")
                 .takes_value(true)
                 .help("The name to be used in a #[link(wasm_import_module = ...)] statement"),
-            Arg::with_name("dynamic-loading")
+            Arg::new("dynamic-loading")
                 .long("dynamic-loading")
                 .takes_value(true)
                 .help("Use dynamic loading mode with the given library name."),
-            Arg::with_name("dynamic-link-require-all")
+            Arg::new("dynamic-link-require-all")
                 .long("dynamic-link-require-all")
                 .help("Require successful linkage to all functions in the library."),
-            Arg::with_name("respect-cxx-access-specs")
+            Arg::new("respect-cxx-access-specs")
                 .long("respect-cxx-access-specs")
                 .help("Makes generated bindings `pub` only for items if the items are publically accessible in C++."),
-            Arg::with_name("translate-enum-integer-types")
+            Arg::new("translate-enum-integer-types")
                 .long("translate-enum-integer-types")
                 .help("Always translate enum integer types to native Rust integer types."),
-            Arg::with_name("c-naming")
+            Arg::new("c-naming")
                 .long("c-naming")
                 .help("Generate types with C style naming."),
-            Arg::with_name("explicit-padding")
+            Arg::new("explicit-padding")
                 .long("explicit-padding")
                 .help("Always output explicit padding fields."),
+            Arg::new("vtable-generation")
+                .long("vtable-generation")
+                .help("Enables generation of vtable functions."),
+            Arg::new("V")
+                .long("version")
+                .help("Prints the version, and exits"),
         ]) // .args()
         .get_matches_from(args);
 
+    let verbose = matches.is_present("verbose");
+    if matches.is_present("V") {
+        println!(
+            "bindgen {}",
+            option_env!("CARGO_PKG_VERSION").unwrap_or("unknown")
+        );
+        if verbose {
+            println!("Clang: {}", crate::clang_version().full);
+        }
+        std::process::exit(0);
+    }
+
     let mut builder = builder();
 
     if let Some(header) = matches.value_of("header") {
@@ -871,6 +897,12 @@
         }
     }
 
+    if let Some(hidden_files) = matches.values_of("allowlist-file") {
+        for file in hidden_files {
+            builder = builder.allowlist_file(file);
+        }
+    }
+
     if let Some(args) = matches.values_of("clang-args") {
         for arg in args {
             builder = builder.clang_arg(arg);
@@ -994,7 +1026,9 @@
         builder = builder.explicit_padding(true);
     }
 
-    let verbose = matches.is_present("verbose");
+    if matches.is_present("vtable-generation") {
+        builder = builder.vtable_generation(true);
+    }
 
     Ok((builder, output, verbose))
 }
diff --git a/third_party/rust/bindgen/v0_59/crate/src/parse.rs b/third_party/rust/bindgen/v0_60/crate/src/parse.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/parse.rs
rename to third_party/rust/bindgen/v0_60/crate/src/parse.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/regex_set.rs b/third_party/rust/bindgen/v0_60/crate/src/regex_set.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/regex_set.rs
rename to third_party/rust/bindgen/v0_60/crate/src/regex_set.rs
diff --git a/third_party/rust/bindgen/v0_59/crate/src/time.rs b/third_party/rust/bindgen/v0_60/crate/src/time.rs
similarity index 100%
rename from third_party/rust/bindgen/v0_59/crate/src/time.rs
rename to third_party/rust/bindgen/v0_60/crate/src/time.rs
diff --git a/third_party/rust/clap/v2/BUILD.gn b/third_party/rust/clap/v2/BUILD.gn
deleted file mode 100644
index f7c0e0e05..0000000
--- a/third_party/rust/clap/v2/BUILD.gn
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2022 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/rust/cargo_crate.gni")
-
-cargo_crate("lib") {
-  crate_name = "clap"
-  epoch = "2"
-  crate_type = "rlib"
-
-  # Only for usage from third-party crates. Add the crate to
-  # third_party.toml to use it from first-party code.
-  visibility = [ "//third_party/rust/*" ]
-  crate_root = "crate/src/lib.rs"
-
-  # Unit tests skipped. Generate with --with-tests to include them.
-  build_native_rust_unit_tests = false
-  sources = [ "crate/src/lib.rs" ]
-  edition = "2015"
-  cargo_pkg_version = "2.33.3"
-  cargo_pkg_authors = "Kevin K. <kbknapp@gmail.com>"
-  cargo_pkg_name = "clap"
-  cargo_pkg_description = "A simple to use, efficient, and full-featured Command Line Argument Parser"
-  deps = [
-    "//third_party/rust/atty/v0_2:lib",
-    "//third_party/rust/bitflags/v1:lib",
-    "//third_party/rust/strsim/v0_8:lib",
-    "//third_party/rust/textwrap/v0_11:lib",
-    "//third_party/rust/unicode_width/v0_1:lib",
-    "//third_party/rust/vec_map/v0_8:lib",
-  ]
-  if (!is_win) {
-    deps += [ "//third_party/rust/ansi_term/v0_11:lib" ]
-  }
-  features = [
-    "ansi_term",
-    "atty",
-    "color",
-    "strsim",
-    "suggestions",
-    "vec_map",
-  ]
-}
diff --git a/third_party/rust/clap/v2/README.chromium b/third_party/rust/clap/v2/README.chromium
deleted file mode 100644
index 20fd2d5..0000000
--- a/third_party/rust/clap/v2/README.chromium
+++ /dev/null
@@ -1,7 +0,0 @@
-Name: clap
-URL: https://crates.io/crates/clap
-Description: A simple to use, efficient, and full-featured Command Line Argument Parser
-
-Version: 2.33.3
-Security Critical: no
-License: MIT
diff --git a/third_party/rust/clap/v2/crate/.azure-pipelines.yml b/third_party/rust/clap/v2/crate/.azure-pipelines.yml
deleted file mode 100644
index 464b792f..0000000
--- a/third_party/rust/clap/v2/crate/.azure-pipelines.yml
+++ /dev/null
@@ -1,61 +0,0 @@
-name: $(Build.BuildId)
-trigger:
-  # Always build master
-  - v2-master
-pr:
-  # Enable building pull requests.
-  - v2-master
-stages:
-  - stage: Testing
-    jobs:
-      - job:
-        variables:
-          rust: 1.36.0
-        strategy:
-          matrix:
-            Windows 32-bit (MSVC):
-              image: vs2017-win2016
-              target: i686-pc-windows-msvc
-            Windows 64-bit (MSVC):
-              image: vs2017-win2016
-              target: x86_64-pc-windows-msvc
-            Windows 32-bit (MinGW):
-              image: vs2017-win2016
-              target: i686-pc-windows-gnu
-            Windows 64-bit (MinGW):
-              image: vs2017-win2016
-              target: x86_64-pc-windows-gnu
-        pool:
-          vmImage: $(image)
-        steps:
-          - checkout: self
-            fetchDepth: 1
-            path: clap
-            displayName: Checkout repository
-          - task: Cache@2
-            inputs:
-              key: cargo | "$(rust)" | $(target) | Cargo.toml
-              path: C:\Rust\.cargo
-            displayName: Caching cargo
-          - task: Cache@2
-            inputs:
-              key: compiled | "$(rust)" | $(target) | Cargo.toml
-              path: target
-            displayName: Caching compiled
-          - script: rustup default $(rust)-$(target)
-            displayName: Install rust
-          - script: cargo test --no-default-features
-            displayName: Test without default features
-            env:
-              RUST_BACKTRACE: full
-          - script: cargo test --features "yaml unstable"
-            displayName: Test with most features
-            env:
-              RUST_BACKTRACE: full
-          - script: |
-              rmdir /Q /S C:\Rust\.cargo\registry\src
-              rmdir /Q /S target\.rustc_info.json
-              rmdir /Q /S target\debug\examples
-              rmdir /Q /S target\debug\incremental
-            displayName: Cleaning for cache
-            continueOnError: true
diff --git a/third_party/rust/clap/v2/crate/.cargo_vcs_info.json b/third_party/rust/clap/v2/crate/.cargo_vcs_info.json
deleted file mode 100644
index ff4eb04..0000000
--- a/third_party/rust/clap/v2/crate/.cargo_vcs_info.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "git": {
-    "sha1": "33bebeda52b52c6f643b4ed6fa880671ba0ab80a"
-  }
-}
diff --git a/third_party/rust/clap/v2/crate/.clog.toml b/third_party/rust/clap/v2/crate/.clog.toml
deleted file mode 100644
index 301dd92..0000000
--- a/third_party/rust/clap/v2/crate/.clog.toml
+++ /dev/null
@@ -1,14 +0,0 @@
-[clog]
-repository = "https://github.com/kbknapp/clap-rs"
-outfile = "CHANGELOG.md"
-from-latest-tag = true
-
-[sections]
-Performance = ["perf"]
-Improvements = ["impr", "im", "imp"]
-Documentation = ["docs"]
-Deprecations = ["depr"]
-Examples = ["examples"]
-"New Settings" = ["setting", "settings"]
-"API Additions" = ["add", "api"]
-"New Sponsor" = ["sponsor"]
diff --git a/third_party/rust/clap/v2/crate/.github/CONTRIBUTING.md b/third_party/rust/clap/v2/crate/.github/CONTRIBUTING.md
deleted file mode 100644
index 2c6f752..0000000
--- a/third_party/rust/clap/v2/crate/.github/CONTRIBUTING.md
+++ /dev/null
@@ -1,115 +0,0 @@
-# How to Contribute
-
-Contributions are always welcome! And there is a multitude of ways in which you can help depending on what you like to do, or are good at. Anything from documentation, code cleanup, issue completion, new features, you name it, even filing issues is contributing and greatly appreciated!
-
-Another really great way to help is if you find an interesting, or helpful way in which to use `clap`. You can either add it to the [examples/](examples) directory, or file an issue and tell me. I'm all about giving credit where credit is due :)
-
-### Testing Code
-
-To test with all features both enabled and disabled, you can run these commands:
-
-```sh
-$ cargo test --no-default-features
-$ cargo test --features "yaml unstable"
-```
-
-Alternatively, if you have [`just`](https://github.com/casey/just) installed you can run the prebuilt recipes. *Not* using `just` is perfectly fine as well, it simply bundles commands automatically.
-
-For example, to test the code, as above simply run:
-
-```sh
-$ just run-tests
-```
-
-From here on, I will list the appropriate `cargo` command as well as the `just` command.
-
-Sometimes it's helpful to only run a subset of the tests, which can be done via:
-
-```sh
-$ cargo test --test <test_name>
-
-# Or
-
-$ just run-test <test_name>
-```
-
-### Linting Code
-
-During the CI process `clap` runs against many different lints using [`clippy`](https://github.com/rust-lang-nursery/rust-clippy). In order to check if these lints pass on your own computer prior to submitting a PR you'll need a nightly compiler.
-
-In order to check the code for lints run either:
-
-```sh
-$ rustup override add nightly
-$ cargo build --features lints
-$ rustup override remove
-
-# Or
-
-$ just lint
-```
-
-### Debugging Code
-
-Another helpful technique is to see the `clap` debug output while developing features. In order to see the debug output while running the full test suite or individual tests, run:
-
-```sh
-$ cargo test --features debug
-
-# Or for individual tests
-$ cargo test --test <test_name> --features debug
-
-# The corresponding just command for individual debugging tests is:
-$ just debug <test_name>
-```
-
-### Commit Messages
-
-I use a [conventional](https://github.com/ajoslin/conventional-changelog/blob/a5505865ff3dd710cf757f50530e73ef0ca641da/conventions/angular.md) changelog format so I can update my changelog automatically using [clog](https://github.com/clog-tool/clog-cli)
-
- * Please format your commit subject line using the following format: `TYPE(COMPONENT): MESSAGE` where `TYPE` is one of the following:
-    - `api`  - An addition to the API
-    - `setting` - A new `AppSettings` variant
-    - `feat` - A new feature of an existing API
-    - `imp`  - An improvement to an existing feature/API
-    - `perf` - A performance improvement
-    - `docs` - Changes to documentation only
-    - `tests` - Changes to the testing framework or tests only
-    - `fix` - A bug fix
-    - `refactor` - Code functionality doesn't change, but underlying structure may
-    - `style` - Stylistic changes only, no functionality changes
-    - `wip` - A work in progress commit (Should typically be `git rebase`'ed away)
-    - `chore` - Catch all or things that have to do with the build system, etc
-    - `examples` - Changes to existing example, or a new example
- * The `COMPONENT` is optional, and may be a single file, directory, or logical component. Parenthesis can be omitted if you are opting not to use the `COMPONENT`. 
-
-### Tests and Documentation
-
-1. Create tests for your changes
-2. **Ensure the tests are passing.** Run the tests (`cargo test --features "yaml unstable"`), alternatively `just run-tests` if you have `just` installed.
-3. **Optional** Run the lints (`cargo build --features lints`) (requires a nightly compiler), alternatively `just lint`
-4. Ensure your changes contain documentation if adding new APIs or features.
-
-### Preparing the PR
-
-1. `git rebase` into concise commits and remove `--fixup`s or `wip` commits (`git rebase -i HEAD~NUM` where `NUM` is number of commits back to start the rebase)
-2. Push your changes back to your fork (`git push origin $your-branch`)
-3. Create a pull request against `master`! (You can also create the pull request first, and we'll merge when ready. This a good way to discuss proposed changes.)
-
-### Other ways to contribute
-
-Another really great way to help is if you find an interesting, or helpful way in which to use `clap`. You can either add it to the [examples/](../examples) directory, or file an issue and tell me. I'm all about giving credit where credit is due :)
-
-### Goals
-
-There are a few goals of `clap` that I'd like to maintain throughout contributions. If your proposed changes break, or go against any of these goals we'll discuss the changes further before merging (but will *not* be ignored, all contributes are welcome!). These are by no means hard-and-fast rules, as I'm no expert and break them myself from time to time (even if by mistake or ignorance :P).
-
-* Remain backwards compatible when possible
-  - If backwards compatibility *must* be broken, use deprecation warnings if at all possible before removing legacy code
-  - This does not apply for security concerns
-* Parse arguments quickly
-  - Parsing of arguments shouldn't slow down usage of the main program
-  - This is also true of generating help and usage information (although *slightly* less stringent, as the program is about to exit)
-* Try to be cognizant of memory usage
-  - Once parsing is complete, the memory footprint of `clap` should be low since the  main program is the star of the show
-* `panic!` on *developer* error, exit gracefully on *end-user* error
diff --git a/third_party/rust/clap/v2/crate/.github/ISSUE_TEMPLATE.md b/third_party/rust/clap/v2/crate/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index 5f94a2c..0000000
--- a/third_party/rust/clap/v2/crate/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1,46 +0,0 @@
-<!--
-Please use the following template to assist with creating an issue and to ensure a speedy resolution. If an area is not applicable, feel free to delete the area or mark with `N/A`
--->
-
-### Rust Version
-
-* Use the output of `rustc -V`
-
-### Affected Version of clap
-
-* Can be found in Cargo.lock of your project (i.e. `grep clap Cargo.lock`)
-
-### Bug or Feature Request Summary
-
-
-### Expected Behavior Summary
-
-
-### Actual Behavior Summary
-
-
-### Steps to Reproduce the issue
-
-
-### Sample Code or Link to Sample Code
-
-
-### Debug output
-
-Compile clap with cargo features `"debug"` such as:
-
-```toml
-[dependencies]
-clap = { version = "2", features = ["debug"] }
-```
-
-<details>
-<summary> Debug Output </summary>
-<pre>
-<code>
-
-Paste Debug Output Here
-
-</code>
-</pre>
-</details>
diff --git a/third_party/rust/clap/v2/crate/.gitignore b/third_party/rust/clap/v2/crate/.gitignore
deleted file mode 100644
index 34253e90..0000000
--- a/third_party/rust/clap/v2/crate/.gitignore
+++ /dev/null
@@ -1,27 +0,0 @@
-# Compiled files
-*.o
-*.so
-*.rlib
-*.dll
-
-# Executables
-*.exe
-
-# Generated by Cargo
-/target/
-/clap-test/target/
-
-# Cargo files
-Cargo.lock
-
-# Temp files
-.*~
-
-# Backup files
-*.bak
-*.bk
-*.orig
-
-# Project files
-.vscode/*
-.idea/*
diff --git a/third_party/rust/clap/v2/crate/.travis.yml b/third_party/rust/clap/v2/crate/.travis.yml
deleted file mode 100644
index f3cf7b7..0000000
--- a/third_party/rust/clap/v2/crate/.travis.yml
+++ /dev/null
@@ -1,66 +0,0 @@
-os: linux
-language: rust
-cache: cargo
-before_cache:
-  - find target/debug -type f -maxdepth 1 -delete
-  - rm -rf target/.rustc_info.json
-  - rm -rf target/debug/examples
-  - rm -rf target/debug/incremental
-  - rm -rf target/tests/target/debug/incremental
-  - rm -rf target/tests/target/debug/deps/{clap*, trybuild*}
-  - rm -rf target/debug/{deps,.fingerpint}/clap*
-  - find target/debug/deps -name "clap*" -exec rm -rf {} +
-  - ls -1 examples/ | sed -e 's/\.rs$//' | xargs -I "{{}}" find target/debug/deps -name "{{}}*" -exec rm -rf {} +
-  - ls -1 tests/ | sed -e 's/\.rs$//' | xargs -I "{{}}" find target/debug/deps -name "{{}}*" -exec rm -rf {} +
-rust: stable
-branches:
-  only:
-    # Always build master & Enable building pull requests.
-    - v2-master
-jobs:
-  allow_failures:
-    - rust: nightly
-    - env:
-        - SHARD=coverage
-  fast_finish: true
-  include:
-    - os: osx
-      rust: 1.36.0
-    - rust: 1.36.0
-    - {}
-    - rust: beta
-    - rust: nightly
-    - env:
-        - SHARD=lint
-      before_script:
-        - rustup component add clippy
-        - rustup component add rustfmt
-      script:
-        - echo "Checking codebase with Clippy release `cargo clippy --version`."
-        - cargo clippy --lib --features "yaml unstable"
-        - cargo clippy --tests --examples --features "yaml unstable"
-        - cargo fmt -- --check
-    - rust: nightly
-      env:
-        - SHARD=bench
-      script:
-        - cargo bench
-    - env:
-        - SHARD=coverage
-      addons:
-        apt:
-          packages:
-            - libssl-dev
-            - cmake
-            - pkg-config
-            - zlib1g-dev
-          update: true
-      before_script:
-        - cargo install cargo-tarpaulin
-      script:
-        - cargo tarpaulin --features "yaml unstable" --ciserver travis-ci --coveralls $TRAVIS_JOB_ID
-script:
-  - cargo test --no-default-features
-  - cargo test --features yaml unstable
-notifications:
-  email: false
diff --git a/third_party/rust/clap/v2/crate/CHANGELOG.md b/third_party/rust/clap/v2/crate/CHANGELOG.md
deleted file mode 100644
index a2400b57..0000000
--- a/third_party/rust/clap/v2/crate/CHANGELOG.md
+++ /dev/null
@@ -1,2890 +0,0 @@
-<a name="v2.33.3"></a>
-### v2.33.3 (2020-08-13)
-
-#### Improvements
-
-* Suppress deprecation warnings when using `crate_*` macros.
-
-<a name="v2.33.2"></a>
-### v2.33.2 (2020-08-5)
-
-#### Documentation
-
-* Fixed links to `2.x` examples. Now they point to the right place.
-
-<a name="v2.33.1"></a>
-### v2.33.1 (2020-05-11)
-
-#### Bug Fixes
-
-* Windows: Prevent some panics when parsing invalid Unicode on Windows ([922c645](https://github.com/clap-rs/clap/commit/922c64508389170c9c77f1c8a4e597d14d3ed2f0), closes [#1905](https://github.com/clap-rs/clap/issues/1905))
-
-#### Documentation
-
-*   fixes versions referenced in the README ([d307466a](https://github.com/kbknapp/clap-rs/commit/d307466af1013f172b8ec0252f01a473e2192d6b))
-* **README.md:**
-  *  cuts down the number of examples to reduce confusion ([6e508ee0](https://github.com/kbknapp/clap-rs/commit/6e508ee09e7153de4adf4e88b0aa6418a537dadd))
-
-#### Improvements
-
-* **Deps:**  doesnt compile ansi_term on Windows since its not used ([b57ee946](https://github.com/kbknapp/clap-rs/commit/b57ee94609da3ddc897286cfba968f26ff961491), closes [#1155](https://github.com/kbknapp/clap-rs/issues/1155))
-
-#### Minimum Required Rust
-
-* As of this release, `clap` requires `rustc 1.36.0` or greater.
-
-<a name="v2.33.0"></a>
-## v2.33.0 (2019-04-06)
-
-#### New Sponsor
-
-*   Stephen Oats is now a sponsor \o/ ([823457c0](https://github.com/kbknapp/clap-rs/commit/823457c0ef5e994ed7080cf62addbfe1aa3b1833))
-* **SPONSORS.md:**  fixes Josh Triplett's info in the sponsor document ([24cb5740](https://github.com/kbknapp/clap-rs/commit/24cb574090a11159b48bba105d5ec2dfb0a20e4e))
-
-#### Features
-
-* **Completions:**  adds completion support for Elvish. ([e9d0562a](https://github.com/kbknapp/clap-rs/commit/e9d0562a1dc5dfe731ed7c767e6cee0af08f0cf9))
-* There is a new setting to disable automatic building of `--help` and `-h` flags (`AppSettings::DisableAutoHelp`)
-
-#### Improvements
-
-* **arg_matches.rs:**  add Debug implementations ([47192b7a](https://github.com/kbknapp/clap-rs/commit/47192b7a2d84ec716b81ae4af621e008a8762dc9))
-* **macros:**  Support shorthand syntax for ArgGroups ([df9095e7](https://github.com/kbknapp/clap-rs/commit/df9095e75bb1e7896415251d0d4ffd8a0ebcd559))
-
-#### Documentation
-
-*   Refer to macOS rather than OSX. ([ab0d767f](https://github.com/kbknapp/clap-rs/commit/ab0d767f3a5a57e2bbb97d0183c2ef63c8c77a6c))
-* **README.md:**  use https for all links ([96a7639a](https://github.com/kbknapp/clap-rs/commit/96a7639a36bcb184c3f45348986883115ef1ab3a))
-
-#### Bug Fixes
-
-*   add debug assertion for missing args in subcommand ArgGroup ([2699d9e5](https://github.com/kbknapp/clap-rs/commit/2699d9e51e7eadc258ba64c4e347c5d1fef61343))
-*   Restore compat with Rust 1.21 ([6b263de1](https://github.com/kbknapp/clap-rs/commit/6b263de1d42ede692ec5ee55019ad2fc6386f92e))
-*   Dont mention unused subcommands ([ef92e2b6](https://github.com/kbknapp/clap-rs/commit/ef92e2b639ed305bdade4741f60fa85cb0101c5a))
-* **OsValues:**  Add `ExactSizeIterator` implementation ([356c69e5](https://github.com/kbknapp/clap-rs/commit/356c69e508fd25a9f0ea2d27bf80ae1d9a8d88f4))
-* **arg_enum!:**
-  *  Fix comma position for valid values. ([1f1f9ff3](https://github.com/kbknapp/clap-rs/commit/1f1f9ff3fa38a43231ef8be9cfea89a32e53f518))
-  *  Invalid expansions of some trailing-comma patterns ([7023184f](https://github.com/kbknapp/clap-rs/commit/7023184fca04e852c270341548d6a16207d13862))
-* **completions:**  improve correctness of completions when whitespace is involved ([5a08ff29](https://github.com/kbknapp/clap-rs/commit/5a08ff295b2aa6ce29420df6252a0e3ff4441bdc))
-* **help message:**  Unconditionally uses long description for subcommands ([6acc8b6a](https://github.com/kbknapp/clap-rs/commit/6acc8b6a621a765cbf513450188000d943676a30), closes [#897](https://github.com/kbknapp/clap-rs/issues/897))
-* **macros:**  fixes broken pattern which prevented calling multi-argument Arg methods ([9e7a352e](https://github.com/kbknapp/clap-rs/commit/9e7a352e13aaf8025d80f2bac5c47fb32528672b))
-* **parser:**  Better interaction between AllowExternalSubcommands and SubcommandRequired ([9601c95a](https://github.com/kbknapp/clap-rs/commit/9601c95a03d2b82bf265c328b4769238f1b79002))
-
-#### Minimum Required Rust
-
-* As of this release, `clap` requires `rustc 1.31.0` or greater.
-
-<a name="v2.32.0"></a>
-## v2.32.0 (2018-06-26)
-
-#### Minimum Required Rust
-
-* As of this release, `clap` requires `rustc 1.21.0` or greater.
-
-
-#### Features
-
-* **Completions:**  adds completion support for Elvish. ([e9d0562a](https://github.com/kbknapp/clap-rs/commit/e9d0562a1dc5dfe731ed7c767e6cee0af08f0cf9))
-
-#### Improvements
-
-* **macros:**  Support shorthand syntax for ArgGroups ([df9095e7](https://github.com/kbknapp/clap-rs/commit/df9095e75bb1e7896415251d0d4ffd8a0ebcd559))
-
-#### Bug Fixes
-
-* **OsValues:**  Add `ExactSizeIterator` implementation ([356c69e5](https://github.com/kbknapp/clap-rs/commit/356c69e508fd25a9f0ea2d27bf80ae1d9a8d88f4))
-* **arg_enum!:**  Invalid expansions of some trailing-comma patterns ([7023184f](https://github.com/kbknapp/clap-rs/commit/7023184fca04e852c270341548d6a16207d13862))
-* **help message:**  Unconditionally uses long description for subcommands ([6acc8b6a](https://github.com/kbknapp/clap-rs/commit/6acc8b6a621a765cbf513450188000d943676a30), closes [#897](https://github.com/kbknapp/clap-rs/issues/897))
-
-#### Documentation
-
-*   Refer to macOS rather than OSX. ([ab0d767f](https://github.com/kbknapp/clap-rs/commit/ab0d767f3a5a57e2bbb97d0183c2ef63c8c77a6c))
-
-
-
-<a name="v2.31.2"></a>
-### v2.31.2 (2018-03-19)
-
-#### Bug Fixes
-
-* **Fish Completions:**  fixes a bug that only allowed a single completion in in Fish Shell ([e8774a8](https://github.com/kbknapp/clap-rs/pull/1214/commits/e8774a84ee4a319c888036e7c595ab46451d8e48), closes [#1212](https://github.com/kbknapp/clap-rs/issues/1212))
-* **AllowExternalSubcommands**: fixes a bug where external subcommands would be blocked by a similarly named subcommand (suggestions were getting in the way). ([a410e85](https://github.com/kbknapp/clap-rs/pull/1215/commits/a410e855bcd82b05f9efa73fa8b9774dc8842c6b))
-
-#### Documentation
-
-* Fixes some typos in the `README.md` ([c8e685d7](https://github.com/kbknapp/clap-rs/commit/c8e685d76adee2a3cc06cac6952ffcf6f9548089))
-
-<a name="v2.31.1"></a>
-### v2.31.1 (2018-03-06)
-
-
-#### Improvements
-
-* **AllowMissingPositional:**  improves the ability of AllowMissingPositional to allow 'skipping' to the last positional arg with '--' ([df20e6e2](https://github.com/kbknapp/clap-rs/commit/df20e6e24b4e782be0b423b484b9798e3e2efe2f))
-
-
-<a name="v2.31.0"></a>
-## v2.31.0 (2018-03-04)
-
-
-#### Features
-
-* **Arg Indices:**  adds the ability to query argument value indices ([f58d0576](https://github.com/kbknapp/clap-rs/commit/f58d05767ec8133c8eb2de117cb642b9ae29ccbc))
-* **Indices:**  implements an Indices<Item=&usize> iterator ([1e67be44](https://github.com/kbknapp/clap-rs/commit/1e67be44f0ccf161cc84c4e6082382072e89c302))
-* **Raw Args** adds a convenience function to `Arg` that allows implying all of `Arg::last` `Arg::allow_hyphen_values` and `Arg::multiple(true)` ([66a78f29](https://github.com/kbknapp/clap-rs/commit/66a78f2972786f5fe7c07937a1ac23da2542afd2))
-
-#### Documentation
-
-*   Fix some typos and markdown issues. ([935ba0dd](https://github.com/kbknapp/clap-rs/commit/935ba0dd547a69c3f636c5486795012019408794))
-* **Arg Indices:**  adds the documentation for the arg index querying methods ([50bc0047](https://github.com/kbknapp/clap-rs/commit/50bc00477afa64dc6cdc5de161d3de3ba1d105a7))
-* **CONTRIBUTING.md:**  fix url to clippy upstream repo to point to https://github.com/rust-lang-nursery/rust-clippy instead of https://github.com/Manishearth/rust-clippy ([42407d7f](https://github.com/kbknapp/clap-rs/commit/42407d7f21d794103cda61f49d2615aae0a4bcd9))
-* **Values:**  improves the docs example of the Values iterator ([74075d65](https://github.com/kbknapp/clap-rs/commit/74075d65e8db1ddb5e2a4558009a5729d749d1b6))
-* Updates readme to hint that the `wrap_help` feature is a thing ([fc7ab227](https://github.com/kbknapp/clap-rs/commit/66a78f2972786f5fe7c07937a1ac23da2542afd2))
-
-### Improvements
-
-*  Cargo.toml: use codegen-units = 1 in release and bench profiles ([19f425ea](https://github.com/kbknapp/clap-rs/commit/66a78f2972786f5fe7c07937a1ac23da2542afd2))
-*  Adds WASM support (clap now compiles on WASM!) ([689949e5](https://github.com/kbknapp/clap-rs/commit/689949e57d390bb61bc69f3ed91f60a2105738d0))
-*  Uses the short help tool-tip for PowerShell completion scripts ([ecda22ce](https://github.com/kbknapp/clap-rs/commit/ecda22ce7210ce56d7b2d1a5445dd1b8a2959656))
-
-
-<a name="v2.30.0"></a>
-## v2.30.0 (2018-02-13)
-
-#### Bug Fixes
-
-* **YAML:** Adds a missing conversion from  `Arg::last` when instantiating from a YAML file ([aab77c81a5](https://github.com/kbknapp/clap-rs/pull/1175/commits/aab77c81a519b045f95946ae0dd3e850f9b93070), closes [#1160](https://github.com/kbknapp/clap-rs/issues/1173))
-
-#### Improvements
-
-* **Bash Completions:**  instead of completing a generic option name, all bash completions fall back to file completions UNLESS `Arg::possible_values` was used ([872f02ae](https://github.com/kbknapp/clap-rs/commit/872f02aea900ffa376850a279eb164645e1234fa))
-* **Deps:**  No longer needlessly compiles `ansi_term` on Windows since its not used ([b57ee946](https://github.com/kbknapp/clap-rs/commit/b57ee94609da3ddc897286cfba968f26ff961491), closes [#1155](https://github.com/kbknapp/clap-rs/issues/1155))
-* **Help Message:** changes the `[values: foo bar baz]` array to `[possible values: foo bar baz]` for consistency with the API ([414707e4e97](https://github.com/kbknapp/clap-rs/pull/1176/commits/414707e4e979d07bfe555247e5d130c546673708), closes [#1160](https://github.com/kbknapp/clap-rs/issues/1160))
-
-
-<a name="v2.29.4"></a>
-### v2.29.4 (2018-02-06)
-
-
-#### Bug Fixes
-
-* **Overrides Self:**  fixes a bug where options with multiple values couldnt ever have multiple values ([d95907cf](https://github.com/kbknapp/clap-rs/commit/d95907cff6d011a901fe35fa00b0f4e18547a1fb))
-
-
-
-<a name="v2.29.3"></a>
-### v2.29.3 (2018-02-05)
-
-
-#### Improvements
-
-* **Overrides:**  clap now supports arguments which override with themselves ([6c7a0010](https://github.com/kbknapp/clap-rs/commit/6c7a001023ca1eac1cc6ffe6c936b4c4a2aa3c45), closes [#976](https://github.com/kbknapp/clap-rs/issues/976))
-
-#### Bug Fixes
-
-* **Requirements:**  fixes an issue where conflicting args would still show up as required ([e06cefac](https://github.com/kbknapp/clap-rs/commit/e06cefac97083838c0a4e1444dcad02a5c3f911e), closes [#1158](https://github.com/kbknapp/clap-rs/issues/1158))
-* Fixes a bug which disallows proper nesting of `--` ([73993fe](https://github.com/kbknapp/clap-rs/commit/73993fe30d135f682e763ec93dcb0814ed518011), closes [#1161](https://github.com/kbknapp/clap-rs/issues/1161))
-
-#### New Settings
-
-* **AllArgsOverrideSelf:**  adds a new convenience setting to allow all args to override themselves ([4670325d](https://github.com/kbknapp/clap-rs/commit/4670325d1bf0369addec2ae2bcb56f1be054c924))
-
-
-
-<a name="v2.29.2"></a>
-### v2.29.2 (2018-01-16)
-
-
-#### Features
-
-* **completions/zsh.rs:**
-  *  Escape possible values for options ([25561dec](https://github.com/kbknapp/clap-rs/commit/25561decf147d329b64634a14d9695673c2fc78f))
-  *  Implement postional argument possible values completion ([f3b0afd2](https://github.com/kbknapp/clap-rs/commit/f3b0afd2bef8b7be97162f8a7802ddf7603dff36))
-  *  Complete positional arguments properly ([e39aeab8](https://github.com/kbknapp/clap-rs/commit/e39aeab8487596046fbdbc6a226e5c8820585245))
-
-#### Bug Fixes
-
-* **completions/zsh.rs:**
-  *  Add missing autoload for is-at-least ([a6522607](https://github.com/kbknapp/clap-rs/commit/a652260795d1519f6ec2a7a09ccc1258499cad7b))
-  *  Don't pass -S to _arguments if Zsh is too old ([16b4f143](https://github.com/kbknapp/clap-rs/commit/16b4f143ff466b7ef18a267bc44ade0f9639109b))
-  *  Maybe fix completions with mixed positionals and subcommands ([1146f0da](https://github.com/kbknapp/clap-rs/commit/1146f0da154d6796fbfcb09db8efa3593cb0d898))
-* **completions/zsh.zsh:**  Remove redundant code from output ([0e185b92](https://github.com/kbknapp/clap-rs/commit/0e185b922ed1e0fd653de00b4cd8d567d72ff68e), closes [#1142](https://github.com/kbknapp/clap-rs/issues/1142))
-
-
-
-<a name="2.29.1"></a>
-### 2.29.1 (2018-01-09)
-
-
-#### Documentation
-
-*   fixes broken links. ([56e734b8](https://github.com/kbknapp/clap-rs/commit/56e734b839303d733d2e5baf7dac39bd7b97b8e4))
-*   updates contributors list ([e1313a5a](https://github.com/kbknapp/clap-rs/commit/e1313a5a0f69d8f4016f73b860a63af8318a6676))
-
-#### Performance
-
-*   further debloating by removing generics from error cases ([eb8d919e](https://github.com/kbknapp/clap-rs/commit/eb8d919e6f3443db279ba0c902f15d76676c02dc))
-*   debloats clap by deduplicating logic and refactors ([03e413d7](https://github.com/kbknapp/clap-rs/commit/03e413d7175d35827cd7d8908d47dbae15a849a3))
-
-#### Bug Fixes
-
-*   fixes the ripgrep benchmark by adding a value to a flag that expects it ([d26ab2b9](https://github.com/kbknapp/clap-rs/commit/d26ab2b97cf9c0ea675b440b7b0eaf6ac3ad01f4))
-* **bash completion:**  Change the bash completion script code generation to support hyphens. ([ba7f1d18](https://github.com/kbknapp/clap-rs/commit/ba7f1d18eba7a07ce7f57e0981986f66c994b639))
-* **completions/zsh.rs:**  Fix completion of long option values ([46365cf8](https://github.com/kbknapp/clap-rs/commit/46365cf8be5331ba04c895eb183e2f230b5aad51))
-
-
-<a name="2.29.0"></a>
-## 2.29.0 (2017-12-02)
-
-
-#### API Additions
-
-* **Arg:**  adds Arg::hide_env_values(bool) which allows one to hide any current env values and display only the key in help messages ([fb41d062](https://github.com/kbknapp/clap-rs/commit/fb41d062eedf37cb4f805c90adca29909bd197d7))
-
-
-
-<a name="2.28.0"></a>
-## 2.28.0 (2017-11-28)
-
-The minimum required Rust is now 1.20. This was done to start using bitflags 1.0 and having >1.0 deps is a *very good* thing!
-
-#### Documentation
-
-*   changes the demo version to 2.28 to stay in sync ([ce6ca492](https://github.com/kbknapp/clap-rs/commit/ce6ca492c7510ab6474075806360b96081b021a9))
-*   Fix URL path to github hosted files ([ce72aada](https://github.com/kbknapp/clap-rs/commit/ce72aada56a9581d4a6cb4bf9bdb861c3906f8df), closes [#1106](https://github.com/kbknapp/clap-rs/issues/1106))
-*   fix typo ([002b07fc](https://github.com/kbknapp/clap-rs/commit/002b07fc98a1c85acb66296b1eec0b2aba906125))
-* **README.md:**  updates the readme and pulls out some redundant sections ([db6caf86](https://github.com/kbknapp/clap-rs/commit/db6caf8663747e679d2f4ed3bd127f33476754aa))
-
-#### Improvements
-
-*   adds '[SUBCOMMAND]' to usage strings with only AppSettings::AllowExternalSubcommands is used with no other subcommands ([e78bb757](https://github.com/kbknapp/clap-rs/commit/e78bb757a3df16e82d539e450c06767a6bfcf859), closes [#1093](https://github.com/kbknapp/clap-rs/issues/1093))
-
-#### API Additions
-
-*   Adds Arg::case_insensitive(bool) which allows matching Arg::possible_values without worrying about ASCII case ([1fec268e](https://github.com/kbknapp/clap-rs/commit/1fec268e51736602e38e67c76266f439e2e0ef12), closes [#1118](https://github.com/kbknapp/clap-rs/issues/1118))
-*   Adds the traits to be used with the clap-derive crate to be able to use Custom Derive ([6f4c3412](https://github.com/kbknapp/clap-rs/commit/6f4c3412415e882f5ca2cc3fbd6d4dce79440828))
-
-#### Bug Fixes
-
-*   Fixes a regression where --help couldn't be overridden ([a283d69f](https://github.com/kbknapp/clap-rs/commit/a283d69fc08aa016ae1bf9ba010012abecc7ba69), closes [#1112](https://github.com/kbknapp/clap-rs/issues/1112))
-*   fixes a bug that allowed options to pass parsing when no value was provided ([2fb75821](https://github.com/kbknapp/clap-rs/commit/2fb758219c7a60d639da67692e100b855a8165ac), closes [#1105](https://github.com/kbknapp/clap-rs/issues/1105))
-*   ignore PropagateGlobalValuesDown deprecation warning ([f61ce3f5](https://github.com/kbknapp/clap-rs/commit/f61ce3f55fe65e16b3db0bd4facdc4575de22767), closes [#1086](https://github.com/kbknapp/clap-rs/issues/1086))
-
-#### Deps
-
-*  Updates `bitflags` to 1.0
-
-
-
-<a name="v2.27.1"></a>
-## v2.27.1 (2017-10-24)
-
-
-#### Bug Fixes
-
-* Adds `term_size` as an optional dependency (with feature `wrap_help`) to fix compile bug
-
-<a name="v2.27.0"></a>
-## v2.27.0 (2017-10-24)
-
-** This release raises the minimum required version of Rust to 1.18 **
-
-** This release also contains a very minor breaking change to fix a bug **
-
-The only CLIs affected will be those using unrestrained multiple values and subcommands where the
-subcommand name can coincide with one of the multiple values.
-
-See the commit [0c223f54](https://github.com/kbknapp/clap-rs/commit/0c223f54ed46da406bc8b43a5806e0b227863b31) for full details.
-
-
-#### Bug Fixes
-
-*   Values from global args are now propagated UP and DOWN!
-*   fixes a bug where using AppSettings::AllowHyphenValues would allow invalid arguments even when there is no way for them to be valid ([77ed4684](https://github.com/kbknapp/clap-rs/commit/77ed46841fc0263d7aa32fcc5cc49ef703b37c04), closes [#1066](https://github.com/kbknapp/clap-rs/issues/1066))
-*   when an argument requires a value and that value happens to match a subcommand name, its parsed as a value ([0c223f54](https://github.com/kbknapp/clap-rs/commit/0c223f54ed46da406bc8b43a5806e0b227863b31), closes [#1031](https://github.com/kbknapp/clap-rs/issues/1031), breaks [#](https://github.com/kbknapp/clap-rs/issues/), [#](https://github.com/kbknapp/clap-rs/issues/))
-*   fixes a bug that prevented number_of_values and default_values to be used together ([5eb342a9](https://github.com/kbknapp/clap-rs/commit/5eb342a99dde07b0f011048efde3e283bc1110fc), closes [#1050](https://github.com/kbknapp/clap-rs/issues/1050), [#1056](https://github.com/kbknapp/clap-rs/issues/1056))
-*   fixes a bug that didn't allow args with default values to have conflicts ([58b5b4be](https://github.com/kbknapp/clap-rs/commit/58b5b4be315280888d50d9b15119b91a9028f050), closes [#1071](https://github.com/kbknapp/clap-rs/issues/1071))
-*   fixes a panic when using global args and calling App::get_matches_from_safe_borrow multiple times ([d86ec797](https://github.com/kbknapp/clap-rs/commit/d86ec79742c77eb3f663fb30e225954515cf25bb), closes [#1076](https://github.com/kbknapp/clap-rs/issues/1076))
-*   fixes issues and potential regressions with global args values not being propagated properly or at all ([a43f9dd4](https://github.com/kbknapp/clap-rs/commit/a43f9dd4aaf1864dd14a3c28dec89ccdd70c61e5), closes [#1010](https://github.com/kbknapp/clap-rs/issues/1010), [#1061](https://github.com/kbknapp/clap-rs/issues/1061), [#978](https://github.com/kbknapp/clap-rs/issues/978))
-*   fixes a bug where default values are not applied if the option supports zero values ([9c248cbf](https://github.com/kbknapp/clap-rs/commit/9c248cbf7d8a825119bc387c23e9a1d1989682b0), closes [#1047](https://github.com/kbknapp/clap-rs/issues/1047))
-
-#### Documentation
-
-*   adds addtional blurbs about using multiples with subcommands ([03455b77](https://github.com/kbknapp/clap-rs/commit/03455b7751a757e7b2f6ffaf2d16168539c99661))
-*   updates the docs to reflect changes to global args and that global args values can now be propagated back up the stack ([ead076f0](https://github.com/kbknapp/clap-rs/commit/ead076f03ada4c322bf3e34203925561ec496d87))
-*   add html_root_url attribute ([e67a061b](https://github.com/kbknapp/clap-rs/commit/e67a061bcf567c6518d6c2f58852e01f02764b22))
-*   sync README version numbers with crate version ([5536361b](https://github.com/kbknapp/clap-rs/commit/5536361bcda29887ed86bb68e43d0b603cbc423f))
-
-#### Improvements
-
-*   args that have require_delimiter(true) is now reflected in help and usage strings ([dce61699](https://github.com/kbknapp/clap-rs/commit/dce616998ed9bd95e8ed3bec1f09a4883da47b85), closes [#1052](https://github.com/kbknapp/clap-rs/issues/1052))
-*   if all subcommands are hidden, the subcommands section of the help message is no longer displayed ([4ae7b046](https://github.com/kbknapp/clap-rs/commit/4ae7b0464750bc07ec80ece38e43f003fdd1b8ae), closes [#1046](https://github.com/kbknapp/clap-rs/issues/1046))
-
-#### Breaking Changes
-
-*   when an argument requires a value and that value happens to match a subcommand name, its parsed as a value ([0c223f54](https://github.com/kbknapp/clap-rs/commit/0c223f54ed46da406bc8b43a5806e0b227863b31), closes [#1031](https://github.com/kbknapp/clap-rs/issues/1031), breaks [#](https://github.com/kbknapp/clap-rs/issues/), [#](https://github.com/kbknapp/clap-rs/issues/))
-
-#### Deprecations
-
-* **AppSettings::PropagateGlobalValuesDown:**  this setting is no longer required to propagate values down or up ([2bb5ddce](https://github.com/kbknapp/clap-rs/commit/2bb5ddcee61c791ca1aaca494fbeb4bd5e277488))
-
-
-
-<a name="v2.26.2"></a>
-### v2.26.2 (2017-09-14)
-
-
-#### Improvements
-
-*   if all subcommands are hidden, the subcommands section of the help message is no longer displayed ([4ae7b046](https://github.com/kbknapp/clap-rs/commit/4ae7b0464750bc07ec80ece38e43f003fdd1b8ae), closes [#1046](https://github.com/kbknapp/clap-rs/issues/1046))
-
-#### Bug Fixes
-
-*   fixes a bug where default values are not applied if the option supports zero values ([9c248cbf](https://github.com/kbknapp/clap-rs/commit/9c248cbf7d8a825119bc387c23e9a1d1989682b0), closes [#1047](https://github.com/kbknapp/clap-rs/issues/1047))
-
-
-
-<a name="v2.26.1"></a>
-### v2.26.1 (2017-09-14)
-
-
-#### Bug Fixes
-
-*   fixes using require_equals(true) and min_values(0) together ([10ae208f](https://github.com/kbknapp/clap-rs/commit/10ae208f68518eff6e98166724065745f4083174), closes [#1044](https://github.com/kbknapp/clap-rs/issues/1044))
-*   escape special characters in zsh and fish completions ([87e019fc](https://github.com/kbknapp/clap-rs/commit/87e019fc84ba6193a8c4ddc26c61eb99efffcd25))
-*   avoid panic generating default help msg if term width set to 0 due to bug in textwrap 0.7.0 ([b3eadb0d](https://github.com/kbknapp/clap-rs/commit/b3eadb0de516106db4e08f078ad32e8f6d6e7a57))
-*   Change `who's` -> `whose` ([53c1ffe8](https://github.com/kbknapp/clap-rs/commit/53c1ffe87f38b05d8804a0f7832412a952845349))
-*   adds a debug assertion to ensure all args added to groups actually exist ([7ad123e2](https://github.com/kbknapp/clap-rs/commit/7ad123e2c02577e3ca30f7e205181e896b157d11), closes [#917](https://github.com/kbknapp/clap-rs/issues/917))
-*   fixes a bug where args that allow values to start with a hyphen couldnt contain a double hyphen -- as a value ([ab2f4c9e](https://github.com/kbknapp/clap-rs/commit/ab2f4c9e563e36ec739a4b55d5a5b76fdb9e9fa4), closes [#960](https://github.com/kbknapp/clap-rs/issues/960))
-*   fixes a bug where positional argument help text is misaligned ([54c16836](https://github.com/kbknapp/clap-rs/commit/54c16836dea4651806a2cfad53146a83fa3abf21))
-* **Help Message:**  fixes long_about not being usable ([a8257ea0](https://github.com/kbknapp/clap-rs/commit/a8257ea0ffb812e552aca256c4a3d2aebfd8065b), closes [#1043](https://github.com/kbknapp/clap-rs/issues/1043))
-* **Suggestions:**  output for flag after subcommand ([434ea5ba](https://github.com/kbknapp/clap-rs/commit/434ea5ba71395d8c1afcf88e69f0b0d8339b01a1))
-
-
-
-<a name="v2.26.0"></a>
-## v2.26.0 (2017-07-29)
-
-Minimum version of Rust is now v1.13.0 (Stable)
-
-
-#### Improvements
-
-*   bumps unicode-segmentation to v1.2 ([cd7b40a2](https://github.com/kbknapp/clap-rs/commit/cd7b40a21c77bae17ba453c5512cb82b7d1ce474))
-
-
-#### Performance
-
-*   update textwrap to version 0.7.0 ([c2d4e637](https://github.com/kbknapp/clap-rs/commit/c2d4e63756a6f070e38c16dff846e9b0a53d6f93))
-
-
-
-
-<a name="v2.25.1"></a>
-### v2.25.1 (2017-07-21)
-
-#### Improvements
-
-* impl Default for Values + OsValues for any lifetime. ([fb7d6231f1](https://github.com/kbknapp/clap-rs/commit/fb7d6231f13a2f79f411e62dca210b7dc9994c18))
-
-#### Documentation
-
-* Various documentation typos and grammar fixes
-
-<a name="v2.25.0"></a>
-### v2.25.0 (2017-06-20)
-
-
-#### Features
-
-*   use textwrap crate for wrapping help texts ([b93870c1](https://github.com/kbknapp/clap-rs/commit/b93870c10ae3bd90d233c586a33e086803117285))
-
-#### Improvements
-
-* **Suggestions:**  suggests to use flag after subcommand when applicable ([2671ca72](https://github.com/kbknapp/clap-rs/commit/2671ca7260119d4311d21c4075466aafdd9da734))
-* Bumps bitflags crate to v0.9
-
-#### Documentation
-
-*   Change `who's` -> `whose` ([53c1ffe8](https://github.com/kbknapp/clap-rs/commit/53c1ffe87f38b05d8804a0f7832412a952845349))
-
-#### Documentation
-
-* **App::template:**  adds details about the necessity to use AppSettings::UnifiedHelpMessage when using {unified} tags in the help template ([cbea3d5a](https://github.com/kbknapp/clap-rs/commit/cbea3d5acf3271a7a734498c4d99c709941c331e), closes [#949](https://github.com/kbknapp/clap-rs/issues/949))
-* **Arg::allow_hyphen_values:**  updates the docs to include warnings for allow_hyphen_values and multiple(true) used together ([f9b0d657](https://github.com/kbknapp/clap-rs/commit/f9b0d657835d3f517f313d70962177dc30acf4a7))
-* **README.md:**
-  *  added a warning about using ~ deps ([821929b5](https://github.com/kbknapp/clap-rs/commit/821929b51bd60213955705900a436c9a64fcb79f), closes [#964](https://github.com/kbknapp/clap-rs/issues/964))
-* **clap_app!:**  adds using the @group specifier to the macro docs ([826048cb](https://github.com/kbknapp/clap-rs/commit/826048cb3cbc0280169303f1498ff0a2b7395883), closes [#932](https://github.com/kbknapp/clap-rs/issues/932))
-
-
-
-<a name="v2.24.2"></a>
-### v2.24.2 (2017-05-15)
-
-
-#### Bug Fixes
-
-*   adds a debug assertion to ensure all args added to groups actually exist ([14f6b8f3](https://github.com/kbknapp/clap-rs/commit/14f6b8f3a2f6df73aeeec9c54a54909b1acfc158), closes [#917](https://github.com/kbknapp/clap-rs/issues/917))
-*   fixes a bug where args that allow values to start with a hyphen couldnt contain a double hyphen -- as a value ([ebf73a09](https://github.com/kbknapp/clap-rs/commit/ebf73a09db6f3c03c19cdd76b1ba6113930e1643), closes [#960](https://github.com/kbknapp/clap-rs/issues/960))
-*   fixes a bug where positional argument help text is misaligned ([54c16836](https://github.com/kbknapp/clap-rs/commit/54c16836dea4651806a2cfad53146a83fa3abf21))
-
-#### Documentation
-
-* **App::template:**  adds details about the necessity to use AppSettings::UnifiedHelpMessage when using {unified} tags in the help template ([cf569438](https://github.com/kbknapp/clap-rs/commit/cf569438f309c199800bb8e46c9f140187de69d7), closes [#949](https://github.com/kbknapp/clap-rs/issues/949))
-* **Arg::allow_hyphen_values:**  updates the docs to include warnings for allow_hyphen_values and multiple(true) used together ([ded5a2f1](https://github.com/kbknapp/clap-rs/commit/ded5a2f15474d4a5bd46a67b130ccb8b6781bd01))
-* **clap_app!:**  adds using the @group specifier to the macro docs ([fe85fcb1](https://github.com/kbknapp/clap-rs/commit/fe85fcb1772b61f13b20b7ea5290e2437a76190c), closes [#932](https://github.com/kbknapp/clap-rs/issues/932))
-
-
-
-<a name="v2.24.0"></a>
-### v2.24.0 (2017-05-07)
-
-
-#### Bug Fixes
-
-*   fixes a bug where args with last(true) and required(true) set were not being printed in the usage string ([3ac533fe](https://github.com/kbknapp/clap-rs/commit/3ac533fedabf713943eedf006f830a5a486bbe80), closes [#944](https://github.com/kbknapp/clap-rs/issues/944))
-*   fixes a bug that was printing the arg name, instead of value name when Arg::last(true) was used ([e1fe8ac3](https://github.com/kbknapp/clap-rs/commit/e1fe8ac3bc1f9cf4e36df0d881f8419755f1787b), closes [#940](https://github.com/kbknapp/clap-rs/issues/940))
-*   fixes a bug where flags were parsed as flags AND positional values when specific combinations of settings were used ([20f83292](https://github.com/kbknapp/clap-rs/commit/20f83292d070038b8cee2a6b47e91f6b0a2f7871), closes [#946](https://github.com/kbknapp/clap-rs/issues/946))
-
-
-
-<a name="v2.24.0"></a>
-## v2.24.0 (2017-05-05)
-
-
-#### Documentation
-
-* **README.md:**  fix some typos ([fa34deac](https://github.com/kbknapp/clap-rs/commit/fa34deac079f334c3af97bb7fb151880ba8887f8))
-
-#### API Additions
-
-* **Arg:**  add `default_value_os` ([d5ef8955](https://github.com/kbknapp/clap-rs/commit/d5ef8955414b1587060f7218385256105b639c88))
-* **arg_matches.rs:**  Added a Default implementation for Values and OsValues iterators. ([0a4384e3](https://github.com/kbknapp/clap-rs/commit/0a4384e350eed74c2a4dc8964c203f21ac64897f))
-
-
-<a name="v2.23.2"></a>
-### v2.23.2 (2017-04-19)
-
-
-#### Bug Fixes
-
-* **PowerShell Completions:**  fixes a bug where powershells completions cant be used if no subcommands are defined ([a8bce558](https://github.com/kbknapp/clap-rs/commit/a8bce55837dc4e0fb187dc93180884a40ae09c6f), closes [#931](https://github.com/kbknapp/clap-rs/issues/931))
-
-#### Improvements
-
-*   bumps term_size to take advantage of better terminal dimension handling ([e05100b7](https://github.com/kbknapp/clap-rs/commit/e05100b73d74066a90876bf38f952adf5e8ee422))
-* **PowerShell Completions:**  massively dedups subcommand names in the generate script to make smaller scripts that are still functionally equiv ([85b0e1cc](https://github.com/kbknapp/clap-rs/commit/85b0e1cc4b9755dda75a93d898d79bc38631552b))
-
-#### Documentation
-
-*   Fix a typo the minimum rust version required ([71dabba3](https://github.com/kbknapp/clap-rs/commit/71dabba3ea0a17c88b0e2199c9d99f0acbf3bc17))
-
-<a name="v2.23.1"></a>
-### v2.23.1 (2017-04-05)
-
-
-#### Bug Fixes
-
-*   fixes a missing newline character in the autogenerated help and version messages in some instances ([5ae9007d](https://github.com/kbknapp/clap-rs/commit/5ae9007d984ae94ae2752df51bcbaeb0ec89bc15))
-
-
-<a name="v2.23.0"></a>
-## v2.23.0 (2017-04-05)
-
-
-#### API Additions
-
-* `App::long_about`
-* `App::long_version`
-* `App::print_long_help`
-* `App::write_long_help`
-* `App::print_long_version`
-* `App::write_long_version`
-* `Arg::long_help`
-
-#### Features
-
-*   allows distinguishing between short and long version messages (-V/short or --version/long) ([59272b06](https://github.com/kbknapp/clap-rs/commit/59272b06cc213289dc604dbc694cb95d383a5d68))
-*   allows distinguishing between short and long help with subcommands in the same manner as args ([6b371891](https://github.com/kbknapp/clap-rs/commit/6b371891a1702173a849d1e95f9fecb168bf6fc4))
-*   allows specifying a short help vs a long help (i.e. varying levels of detail depending on if -h or --help was used) ([ef1b24c3](https://github.com/kbknapp/clap-rs/commit/ef1b24c3a0dff2f58c5e2e90880fbc2b69df20ee))
-* **clap_app!:**  adds support for arg names with hyphens similar to longs with hyphens ([f7a88779](https://github.com/kbknapp/clap-rs/commit/f7a8877978c8f90e6543d4f0d9600c086cf92cd7), closes [#869](https://github.com/kbknapp/clap-rs/issues/869))
-
-#### Bug Fixes
-
-*   fixes a bug that wasn't allowing help and version to be properly overridden ([8b2ceb83](https://github.com/kbknapp/clap-rs/commit/8b2ceb8368bcb70689fadf1c7f4b9549184926c1), closes [#922](https://github.com/kbknapp/clap-rs/issues/922))
-
-#### Documentation
-
-* **clap_app!:**  documents the `--("some-arg")` method for using args with hyphens inside them ([bc08ef3e](https://github.com/kbknapp/clap-rs/commit/bc08ef3e185393073d969d301989b6319c616c1f), closes [#919](https://github.com/kbknapp/clap-rs/issues/919))
-
-
-
-<a name="v2.22.2"></a>
-### v2.22.2 (2017-03-30)
-
-
-#### Bug Fixes
-
-* **Custom Usage Strings:**  fixes the usage string regression when using help templates ([0e4fd96d](https://github.com/kbknapp/clap-rs/commit/0e4fd96d74280d306d09e60ac44f938a82321769))
-
-
-
-<a name="v2.22.1"></a>
-### v2.22.1 (2017-03-24)
-
-
-#### Bug Fixes
-
-* **usage:**  fixes a big regression with custom usage strings ([2c41caba](https://github.com/kbknapp/clap-rs/commit/2c41caba3c7d723a2894e315d04da796b0e97759))
-
-<a name="v2.22.0"></a>
-## v2.22.0 (2017-03-23)
-
-#### API Additions
-
-* **App::name:**  adds the ability to change the name of the App instance after creation ([d49e8292](https://github.com/kbknapp/clap-rs/commit/d49e8292b026b06e2b70447cd9f08299f4fcba76), closes [#908](https://github.com/kbknapp/clap-rs/issues/908))
-* **Arg::hide_default_value:**  adds ability to hide the default value of an argument from the help string ([89e6ea86](https://github.com/kbknapp/clap-rs/commit/89e6ea861e16a1ad56757ca12f6b32d02253e44a), closes [#902](https://github.com/kbknapp/clap-rs/issues/902))
-
-
-<a name="v2.21.3"></a>
-### v2.21.3 (2017-03-23)
-
-#### Bug Fixes
-
-* **yaml:**  adds support for loading author info from yaml ([e04c390c](https://github.com/kbknapp/clap-rs/commit/e04c390c597a55fa27e724050342f16c42f1c5c9))
-
-
-<a name="v2.21.2"></a>
-### v2.21.2 (2017-03-17)
-
-
-#### Improvements
-
-*   add fish subcommand help support ([f8f68cf8](https://github.com/kbknapp/clap-rs/commit/f8f68cf8251669aef4539a25a7c1166f0ac81ea6))
-*   options that use `require_equals(true)` now display the equals sign in help messages, usage strings, and errors" ([c8eb0384](https://github.com/kbknapp/clap-rs/commit/c8eb0384d394d2900ccdc1593099c97808a3fa05), closes [#903](https://github.com/kbknapp/clap-rs/issues/903))
-
-
-#### Bug Fixes
-
-*  setting the max term width now correctly propagates down through child subcommands
-
-
-
-<a name="v2.21.1"></a>
-### v2.21.1 (2017-03-12)
-
-
-#### Bug Fixes
-
-* **ArgRequiredElseHelp:**  fixes the precedence of this error to prioritize over other error messages ([74b751ff](https://github.com/kbknapp/clap-rs/commit/74b751ff2e3631e337b7946347c1119829a41c53), closes [#895](https://github.com/kbknapp/clap-rs/issues/895))
-* **Positionals:**  fixes some regression bugs resulting from old asserts in debug mode. ([9a3bc98e](https://github.com/kbknapp/clap-rs/commit/9a3bc98e9b55e7514b74b73374c5ac8b6e5e0508), closes [#896](https://github.com/kbknapp/clap-rs/issues/896))
-
-
-
-<a name="v2.21.0"></a>
-## v2.21.0 (2017-03-09)
-
-#### Performance
-
-*   doesn't run `arg_post_processing` on multiple values anymore ([ec516182](https://github.com/kbknapp/clap-rs/commit/ec5161828729f6a53f0fccec8648f71697f01f78))
-*   changes internal use of `VecMap` to `Vec` for matched values of `Arg`s ([22bf137a](https://github.com/kbknapp/clap-rs/commit/22bf137ac581684c6ed460d2c3c640c503d62621))
-*   vastly reduces the amount of cloning when adding non-global args minus when they're added from `App::args` which is forced to clone ([8da0303b](https://github.com/kbknapp/clap-rs/commit/8da0303bc02db5fe047cfc0631a9da41d9dc60f7))
-*   refactor to remove unneeded vectors and allocations and checks for significant performance increases ([0efa4119](https://github.com/kbknapp/clap-rs/commit/0efa4119632f134fc5b8b9695b007dd94b76735d))
-
-#### Documentation
-
-*   Fix examples link in CONTRIBUTING.md ([60cf875d](https://github.com/kbknapp/clap-rs/commit/60cf875d67a252e19bb85054be57696fac2c57a1))
-
-#### Improvements
-
-*   when `AppSettings::SubcommandsNegateReqs` and `ArgsNegateSubcommands` are used, a new more accurate double line usage string is shown ([50f02300](https://github.com/kbknapp/clap-rs/commit/50f02300d81788817acefef0697e157e01b6ca32), closes [#871](https://github.com/kbknapp/clap-rs/issues/871))
-
-#### API Additions
-
-* **Arg::last:**  adds the ability to mark a positional argument as 'last' which means it should be used with `--` syntax and can be accessed early ([6a7aea90](https://github.com/kbknapp/clap-rs/commit/6a7aea9043b83badd9ab038b4ecc4c787716147e), closes [#888](https://github.com/kbknapp/clap-rs/issues/888))
-*   provides `default_value_os` and `default_value_if[s]_os` ([0f2a3782](https://github.com/kbknapp/clap-rs/commit/0f2a378219a6930748d178ba350fe5925be5dad5), closes [#849](https://github.com/kbknapp/clap-rs/issues/849))
-*   provides `App::help_message` and `App::version_message` which allows one to override the auto-generated help/version flag associated help ([389c413](https://github.com/kbknapp/clap-rs/commit/389c413b7023dccab8c76aa00577ea1d048e7a99), closes [#889](https://github.com/kbknapp/clap-rs/issues/889))
-
-#### New Settings
-
-* **InferSubcommands:**  adds a setting to allow one to infer shortened subcommands or aliases (i.e. for subcommmand "test", "t", "te", or "tes" would be allowed assuming no other ambiguities) ([11602032](https://github.com/kbknapp/clap-rs/commit/11602032f6ff05881e3adf130356e37d5e66e8f9), closes [#863](https://github.com/kbknapp/clap-rs/issues/863))
-
-#### Bug Fixes
-
-*   doesn't print the argument sections in the help message if all args in that section are hidden ([ce5ee5f5](https://github.com/kbknapp/clap-rs/commit/ce5ee5f5a76f838104aeddd01c8ec956dd347f50))
-*   doesn't include the various [ARGS] [FLAGS] or [OPTIONS] if the only ones available are hidden ([7b4000af](https://github.com/kbknapp/clap-rs/commit/7b4000af97637703645c5fb2ac8bb65bd546b95b), closes [#882](https://github.com/kbknapp/clap-rs/issues/882))
-*   now correctly shows subcommand as required in the usage string when AppSettings::SubcommandRequiredElseHelp is used ([8f0884c1](https://github.com/kbknapp/clap-rs/commit/8f0884c1764983a49b45de52a1eddf8d721564d8))
-*   fixes some memory leaks when an error is detected and clap exits ([8c2dd287](https://github.com/kbknapp/clap-rs/commit/8c2dd28718262ace4ae0db98563809548e02a86b))
-*   fixes a trait that's marked private accidentlly, but should be crate internal public ([1ae21108](https://github.com/kbknapp/clap-rs/commit/1ae21108015cea87e5360402e1747025116c7878))
-* **Completions:**   fixes a bug that tried to propogate global args multiple times when generating multiple completion scripts ([5e9b9cf4](https://github.com/kbknapp/clap-rs/commit/5e9b9cf4dd80fa66a624374fd04e6545635c1f94), closes [#846](https://github.com/kbknapp/clap-rs/issues/846))
-
-#### Features
-
-* **Options:**  adds the ability to require the equals syntax with options --opt=val ([f002693d](https://github.com/kbknapp/clap-rs/commit/f002693dec6a6959c4e9590cb7b7bfffd6d6e5bc), closes [#833](https://github.com/kbknapp/clap-rs/issues/833))
-
-
-
-<a name="v2.20.5"></a>
-### v2.20.5 (2017-02-18)
-
-
-#### Bug Fixes
-
-* **clap_app!:**   fixes a critical bug of a missing fragment specifier when using `!property` style tags. ([5635c1f94](https://github.com/kbknapp/clap-rs/commit/5e9b9cf4dd80fa66a624374fd04e6545635c1f94))
-
-
-<a name="v2.20.4"></a>
-### v2.20.4 (2017-02-15)
-
-
-#### Bug Fixes
-
-* **Completions:**   fixes a bug that tried to propogate global args multiple times when generating multiple completion scripts ([5e9b9cf4](https://github.com/kbknapp/clap-rs/commit/5e9b9cf4dd80fa66a624374fd04e6545635c1f94), closes [#846](https://github.com/kbknapp/clap-rs/issues/846))
-
-#### Documentation
-
-*   Fix examples link in CONTRIBUTING.md ([60cf875d](https://github.com/kbknapp/clap-rs/commit/60cf875d67a252e19bb85054be57696fac2c57a1))
-
-
-<a name="v2.20.3"></a>
-### v2.20.3 (2017-02-03)
-
-
-#### Documentation
-
-* **Macros:**  adds a warning about changing values in Cargo.toml not triggering a rebuild automatically ([112aea3e](https://github.com/kbknapp/clap-rs/commit/112aea3e42ae9e0c0a2d33ebad89496dbdd95e5d), closes [#838](https://github.com/kbknapp/clap-rs/issues/838))
-
-#### Bug Fixes
-
-*   fixes a println->debugln typo ([279aa62e](https://github.com/kbknapp/clap-rs/commit/279aa62eaf08f56ce090ba16b937bc763cbb45be))
-*   fixes bash completions for commands that have an underscore in the name ([7f5cfa72](https://github.com/kbknapp/clap-rs/commit/7f5cfa724f0ac4e098f5fe466c903febddb2d994), closes [#581](https://github.com/kbknapp/clap-rs/issues/581))
-*   fixes a bug where ZSH completions would panic if the binary name had an underscore in it ([891a2a00](https://github.com/kbknapp/clap-rs/commit/891a2a006f775e92c556dda48bb32fac9807c4fb), closes [#581](https://github.com/kbknapp/clap-rs/issues/581))
-*   allow final word to be wrapped in wrap_help ([564c5f0f](https://github.com/kbknapp/clap-rs/commit/564c5f0f1730f4a2c1cdd128664f1a981c31dcd4), closes [#828](https://github.com/kbknapp/clap-rs/issues/828))
-* fixes a bug where global args weren't included in the generated completion scripts ([9a1e006e](https://github.com/kbknapp/clap-rs/commit/9a1e006eb75ad5a6057ebd119aa90f7e06c0ace8), closes [#841](https://github.com/kbknapp/clap-rs/issues/841))
-
-
-
-<a name="v2.20.2"></a>
-### v2.20.2 (2017-02-03)
-
-#### Bug Fixes
-
-*   fixes a critical bug where subcommand settings were being propogated too far ([74648c94](https://github.com/kbknapp/clap-rs/commit/74648c94b893df542bfa5bb595e68c7bb8167e36), closes [#832](https://github.com/kbknapp/clap-rs/issues/832))
-
-
-#### Improvements
-
-*   adds ArgGroup::multiple to the supported YAML fields for building ArgGroups from YAML ([d8590037](https://github.com/kbknapp/clap-rs/commit/d8590037ce07dafd8cd5b26928aa4a9fd3018288), closes [#840](https://github.com/kbknapp/clap-rs/issues/840))
-
-<a name="v2.20.1"></a>
-### v2.20.1 (2017-01-31)
-
-#### Bug Fixes
-
-*   allow final word to be wrapped in wrap_help ([564c5f0f](https://github.com/kbknapp/clap-rs/commit/564c5f0f1730f4a2c1cdd128664f1a981c31dcd4), closes [#828](https://github.com/kbknapp/clap-rs/issues/828))
-*   actually show character in debug output ([84d8c547](https://github.com/kbknapp/clap-rs/commit/84d8c5476de95b7f37d61888bc4f13688b712434))
-*   include final character in line lenght ([aff4ba18](https://github.com/kbknapp/clap-rs/commit/aff4ba18da8147e1259b04b0bfbc1fcb5c78a3c0))
-
-#### Improvements
-
-*   updates libc and term_size deps for the libc version conflict ([6802ac4a](https://github.com/kbknapp/clap-rs/commit/6802ac4a59c142cda9ec55ca0c45ae5cb9a6ab55))
-
-#### Documentation
-
-*   fix link from app_from_crate! to crate_authors! (#822) ([5b29be9b](https://github.com/kbknapp/clap-rs/commit/5b29be9b073330ab1f7227cdd19fe4aab39d5dcb))
-*   fix spelling of "guaranteed" ([4f30a65b](https://github.com/kbknapp/clap-rs/commit/4f30a65b9c03eb09607eb91a929a6396637dc105))
-
-<a name="v2.20.0"></a>
-
-#### New Settings
-
-* **ArgsNegateSubcommands:**  disables args being allowed between subcommands ([5e2af8c9](https://github.com/kbknapp/clap-rs/commit/5e2af8c96adb5ab75fa2d1536237ebcb41869494), closes [#793](https://github.com/kbknapp/clap-rs/issues/793))
-* **DontCollapseArgsInUsage:** disables the collapsing of positional args into `[ARGS]` in the usage string  ([c2978afc](https://github.com/kbknapp/clap-rs/commit/c2978afc61fb46d5263ab3b2d87ecde1c9ce1553), closes [#769](https://github.com/kbknapp/clap-rs/issues/769))
-* **DisableHelpSubcommand:**  disables building the `help` subcommand  ([a10fc859](https://github.com/kbknapp/clap-rs/commit/a10fc859ee20159fbd9ff4337be59b76467a64f2))
-* **AllowMissingPositional:**  allows one to implement `$ prog [optional] <required>` style CLIs where the second postional argument is required, but the first is optional ([1110fdc7](https://github.com/kbknapp/clap-rs/commit/1110fdc7a345c108820dc45783a9bf893fa4c214), closes [#636](https://github.com/kbknapp/clap-rs/issues/636))
-* **PropagateGlobalValuesDown:**  automatically propagats global arg's values down through *used* subcommands ([985536c8](https://github.com/kbknapp/clap-rs/commit/985536c8ebcc09af98aac835f42a8072ad58c262), closes [#694](https://github.com/kbknapp/clap-rs/issues/694))
-
-#### API Additions
-
-##### Arg
-
-* **Arg::value_terminator:**  adds the ability to terminate multiple values with a given string or char ([be64ce0c](https://github.com/kbknapp/clap-rs/commit/be64ce0c373efc106384baca3f487ea99fe7b8cf), closes [#782](https://github.com/kbknapp/clap-rs/issues/782))
-* **Arg::default_value_if[s]:**  adds new methods for *conditional* default values (such as a particular value from another argument was used) ([eb4010e7](https://github.com/kbknapp/clap-rs/commit/eb4010e7b21724447ef837db11ac441915728f22))
-* **Arg::requires_if[s]:**  adds the ability to *conditionally* require additional args (such as if a particular value was used) ([198449d6](https://github.com/kbknapp/clap-rs/commit/198449d64393c265f0bc327aaeac23ec4bb97226))
-* **Arg::required_if[s]:**  adds the ability for an arg to be *conditionally* required (i.e. "arg X is only required if arg Y was used with value Z") ([ee9cfddf](https://github.com/kbknapp/clap-rs/commit/ee9cfddf345a6b5ae2af42ba72aa5c89e2ca7f59))
-* **Arg::validator_os:**  adds ability to validate values which may contain invalid UTF-8 ([47232498](https://github.com/kbknapp/clap-rs/commit/47232498a813db4f3366ccd3e9faf0bff56433a4))
-
-##### Macros
-
-* **crate_description!:** Uses the `Cargo.toml` description field to fill in the `App::about` method at compile time ([4d9a82db](https://github.com/kbknapp/clap-rs/commit/4d9a82db8e875e9b64a9c2a5c6e22c25afc1279d), closes [#778](https://github.com/kbknapp/clap-rs/issues/778))
-* **crate_name!:** Uses the `Cargo.toml` name field to fill in the `App::new` method at compile time ([4d9a82db](https://github.com/kbknapp/clap-rs/commit/4d9a82db8e875e9b64a9c2a5c6e22c25afc1279d), closes [#778](https://github.com/kbknapp/clap-rs/issues/778))
-* **app_from_crate!:** Combines `crate_version!`, `crate_name!`, `crate_description!`, and `crate_authors!` into a single macro call to build a default `App` instance from the `Cargo.toml` fields ([4d9a82db](https://github.com/kbknapp/clap-rs/commit/4d9a82db8e875e9b64a9c2a5c6e22c25afc1279d), closes [#778](https://github.com/kbknapp/clap-rs/issues/778))
-
-
-#### Features
-
-* **no_cargo:**  adds a `no_cargo` feature to disable Cargo-env-var-dependent macros for those *not* using `cargo` to build their crates (#786) ([6fdd2f9d](https://github.com/kbknapp/clap-rs/commit/6fdd2f9d693aaf1118fc61bd362273950703f43d))
-
-#### Bug Fixes
-
-* **Options:**  fixes a critical bug where options weren't forced to have a value ([5a5f2b1e](https://github.com/kbknapp/clap-rs/commit/5a5f2b1e9f598a0d0280ef3e98abbbba2bc41132), closes [#665](https://github.com/kbknapp/clap-rs/issues/665))
-*   fixes a bug where calling the help of a subcommand wasn't ignoring required args of parent commands ([d3d34a2b](https://github.com/kbknapp/clap-rs/commit/d3d34a2b51ef31004055b0ab574f766d801c3adf), closes [#789](https://github.com/kbknapp/clap-rs/issues/789))
-* **Help Subcommand:**  fixes a bug where the help subcommand couldn't be overriden ([d34ec3e0](https://github.com/kbknapp/clap-rs/commit/d34ec3e032d03e402d8e87af9b2942fe2819b2da), closes [#787](https://github.com/kbknapp/clap-rs/issues/787))
-* **Low Index Multiples:**  fixes a bug which caused combinations of LowIndexMultiples and `Arg::allow_hyphen_values` to fail parsing ([26c670ca](https://github.com/kbknapp/clap-rs/commit/26c670ca16d2c80dc26d5c1ce83380ace6357318))
-
-#### Improvements
-
-* **Default Values:**  improves the error message when default values are involved ([1f33de54](https://github.com/kbknapp/clap-rs/commit/1f33de545036e7fd2f80faba251fca009bd519b8), closes [#774](https://github.com/kbknapp/clap-rs/issues/774))
-* **YAML:**  adds conditional requirements and conditional default values to YAML ([9a4df327](https://github.com/kbknapp/clap-rs/commit/9a4df327893486adb5558ffefba790c634ccdc6e), closes [#764](https://github.com/kbknapp/clap-rs/issues/764))
-*  Support `--("some-arg-name")` syntax for defining long arg names when using `clap_app!` macro ([f41ec962](https://github.com/kbknapp/clap-rs/commit/f41ec962c243a5ffff8b1be1ae2ad63970d3d1d4))
-*  Support `("some app name")` syntax for defining app names when using `clap_app!` macro ([9895b671](https://github.com/kbknapp/clap-rs/commit/9895b671cff784f35cf56abcd8270f7c2ba09699), closes [#759](https://github.com/kbknapp/clap-rs/issues/759))
-* **Help Wrapping:**  long app names (with spaces), authors, and descriptions are now wrapped appropriately ([ad4691b7](https://github.com/kbknapp/clap-rs/commit/ad4691b71a63e951ace346318238d8834e04ad8a), closes [#777](https://github.com/kbknapp/clap-rs/issues/777))
-
-
-#### Documentation
-
-* **Conditional Default Values:**  fixes the failing doc tests of Arg::default_value_ifs ([4ef09101](https://github.com/kbknapp/clap-rs/commit/4ef091019c083b4db1a0c13f1c1e95ac363259f2))
-* **Conditional Requirements:**  adds docs for Arg::requires_ifs ([7f296e29](https://github.com/kbknapp/clap-rs/commit/7f296e29db7d9036e76e5dbcc9c8b20dfe7b25bd))
-* **README.md:**  fix some typos ([f22c21b4](https://github.com/kbknapp/clap-rs/commit/f22c21b422d5b287d1a1ac183a379ee02eebf54f))
-* **src/app/mod.rs:**  fix some typos ([5c9b0d47](https://github.com/kbknapp/clap-rs/commit/5c9b0d47ca78dea285c5b9dec79063d24c3e451a))
-
-<a name="v2.19.3"></a>
-### v2.19.3 (2016-12-28)
-
-
-#### Bug Fixes
-
-*   fixes a bug where calling the help of a subcommand wasn't ignoring required args of parent commands ([a0ee4993](https://github.com/kbknapp/clap-rs/commit/a0ee4993015ea97b06b5bc9f378d8bcb18f1c51c), closes [#789](https://github.com/kbknapp/clap-rs/issues/789))
-
-
-
-<a name="v2.19.2"></a>
-### v2.19.2 (2016-12-08)
-
-#### Bug Fixes
-
-* **ZSH Completions:**  escapes square brackets in ZSH completions ([7e17d5a3](https://github.com/kbknapp/clap-rs/commit/7e17d5a36b2cc2cc77e7b15796b14d639ed3cbf7), closes [#771](https://github.com/kbknapp/clap-rs/issues/771))
-
-#### Documentation
-
-* **Examples:**  adds subcommand examples ([0e0f3354](https://github.com/kbknapp/clap-rs/commit/0e0f33547a6901425afc1d9fbe19f7ae3832d9a4), closes [#766](https://github.com/kbknapp/clap-rs/issues/766))
-* **README.md:**  adds guidance on when to use ~ in version pinning, and clarifies breaking change policy ([591eaefc](https://github.com/kbknapp/clap-rs/commit/591eaefc7319142ba921130e502bb0729feed907), closes [#765](https://github.com/kbknapp/clap-rs/issues/765))
-
-
-
-<a name="v2.19.1"></a>
-### v2.19.1 (2016-12-01)
-
-
-#### Bug Fixes
-
-* **Help Messages:**  fixes help message alignment when specific settings are used on options ([cd94b318](https://github.com/kbknapp/clap-rs/commit/cd94b3188d63b63295a319e90e826bca46befcd2), closes [#760](https://github.com/kbknapp/clap-rs/issues/760))
-
-#### Improvements
-
-* **Bash Completion:**  allows bash completion to fall back to traidtional bash completion upon no matching completing function ([b1b16d56](https://github.com/kbknapp/clap-rs/commit/b1b16d56d8fddf819bdbe24b3724bb6a9f3fa613)))
-
-
-<a name="v2.19.0"></a>
-## v2.19.0 (2016-11-21)
-
-#### Features
-
-*   allows specifying AllowLeadingHyphen style values, but only for specific args vice command wide ([c0d70feb](https://github.com/kbknapp/clap-rs/commit/c0d70febad9996a77a54107054daf1914c50d4ef), closes [#742](https://github.com/kbknapp/clap-rs/issues/742))
-
-#### Bug Fixes
-
-* **Required Unless:**  fixes a bug where having required_unless set doesn't work when conflicts are also set ([d20331b6](https://github.com/kbknapp/clap-rs/commit/d20331b6f7940ac3a4e919999f8bb4780875125d), closes [#753](https://github.com/kbknapp/clap-rs/issues/753))
-* **ZSH Completions:**  fixes an issue where zsh completions caused panics if there were no subcommands ([49e7cdab](https://github.com/kbknapp/clap-rs/commit/49e7cdab76dd1ccc07221e360f07808ec62648aa), closes [#754](https://github.com/kbknapp/clap-rs/issues/754))
-
-#### Improvements
-
-* **Validators:**  improves the error messages for validators ([65eb3385](https://github.com/kbknapp/clap-rs/commit/65eb33859d3ff53e7d3277f02a9d3fd9038a9dfb), closes [#744](https://github.com/kbknapp/clap-rs/issues/744))
-
-#### Documentation
-
-*   updates the docs landing page ([01e1e33f](https://github.com/kbknapp/clap-rs/commit/01e1e33f377934099a4a725fab5cd6c5ff50eaa2))
-*   adds the macro version back to the readme ([45eb9bf1](https://github.com/kbknapp/clap-rs/commit/45eb9bf130329c3f3853aba0342c2fe3c64ff80f))
-*   fix broken docs links ([808e7cee](https://github.com/kbknapp/clap-rs/commit/808e7ceeb86d4a319bdc270f51c23a64621dbfb3))
-* **Compatibility Policy:**  adds an official compatibility policy to ([760d66dc](https://github.com/kbknapp/clap-rs/commit/760d66dc17310b357f257776624151da933cd25d), closes [#740](https://github.com/kbknapp/clap-rs/issues/740))
-* **Contributing:**  updates the readme to improve the readability and contributing sections ([eb51316c](https://github.com/kbknapp/clap-rs/commit/eb51316cdfdc7258d287ba13b67ef2f42bd2b8f6))
-
-<a name="v2.18.0"></a>
-## v2.18.0 (2016-11-05)
-
-
-#### Features
-
-* **Completions:**  adds completion support for PowerShell. ([cff82c88](https://github.com/kbknapp/clap-rs/commit/cff82c880e21064fca63351507b80350df6caadf), closes [#729](https://github.com/kbknapp/clap-rs/issues/729))
-
-
-
-<a name="v2.17.1"></a>
-### v2.17.1 (2016-11-02)
-
-
-#### Bug Fixes
-
-* **Low Index Multiples:**  fixes a bug where using low index multiples was propagated to subcommands ([33924e88](https://github.com/kbknapp/clap-rs/commit/33924e884461983c4e6b5ea1330fecc769a4ade7), closes [#725](https://github.com/kbknapp/clap-rs/issues/725))
-
-
-
-<a name="v2.17.0"></a>
-## v2.17.0 (2016-11-01)
-
-
-#### Features
-
-* **Positional Args:**  allows specifying the second to last positional argument as multiple(true) ([1ced2a74](https://github.com/kbknapp/clap-rs/commit/1ced2a7433ea8937a1b260ea65d708f32ca7c95e), closes [#725](https://github.com/kbknapp/clap-rs/issues/725))
-
-
-
-<a name="v2.16.4"></a>
-### v2.16.4 (2016-10-31)
-
-
-#### Improvements
-
-* **Error Output:**  conflicting errors are now symetrical, meaning more consistent and less confusing ([3d37001d](https://github.com/kbknapp/clap-rs/commit/3d37001d1dc647d73cc597ff172f1072d4beb80d), closes [#718](https://github.com/kbknapp/clap-rs/issues/718))
-
-#### Documentation
-
-*   Fix typo in example `13a_enum_values_automatic` ([c22fbc07](https://github.com/kbknapp/clap-rs/commit/c22fbc07356e556ffb5d1a79ec04597d149b915e))
-* **README.md:**  fixes failing yaml example (#715) ([21fba9e6](https://github.com/kbknapp/clap-rs/commit/21fba9e6cd8c163012999cd0ce271ec8780c5695))
-
-#### Bug Fixes
-
-* **ZSH Completions:**  fixes bug that caused panic on subcommands with aliases ([5c70e1a0](https://github.com/kbknapp/clap-rs/commit/5c70e1a01bc977e44c10015d18bb8e215c32dfc8), closes [#714](https://github.com/kbknapp/clap-rs/issues/714))
-* **debug:**  fixes the debug feature (#716) ([6c11ccf4](https://github.com/kbknapp/clap-rs/commit/6c11ccf443d46258d51f7cda33fbcc81e7fe8e90))
-
-
-
-<a name="v2.16.3"></a>
-### v2.16.3 (2016-10-28)
-
-
-#### Bug Fixes
-
-*   Derive display order after propagation ([9cb6facf](https://github.com/kbknapp/clap-rs/commit/9cb6facf507aff7cddd124b8c29714d2b0e7bd13), closes [#706](https://github.com/kbknapp/clap-rs/issues/706))
-* **yaml-example:**  inconsistent args ([847f7199](https://github.com/kbknapp/clap-rs/commit/847f7199219ead5065561d91d64780d99ae4b587))
-
-
-
-<a name="v2.15.1"></a>
-### v2.16.2 (2016-10-25)
-
-
-#### Bug Fixes
-
-* **Fish Completions:**  fixes a bug where single quotes are not escaped ([780b4a18](https://github.com/kbknapp/clap-rs/commit/780b4a18281b6f7f7071e1b9db2290fae653c406), closes [#704](https://github.com/kbknapp/clap-rs/issues/704))
-
-
-<a name="v2.16.1"></a>
-### v2.16.1 (2016-10-24)
-
-
-#### Bug Fixes
-
-* **Help Message:**  fixes a regression bug where args with multiple(true) threw off alignment ([ebddac79](https://github.com/kbknapp/clap-rs/commit/ebddac791f3ceac193d5ad833b4b734b9643a7af), closes [#702](https://github.com/kbknapp/clap-rs/issues/702))
-
-
-
-<a name="v2.16.0"></a>
-## v2.16.0 (2016-10-23)
-
-
-#### Features
-
-* **Completions:**  adds ZSH completion support ([3e36b0ba](https://github.com/kbknapp/clap-rs/commit/3e36b0bac491d3f6194aee14604caf7be26b3d56), closes [#699](https://github.com/kbknapp/clap-rs/issues/699))
-
-
-
-<a name="v2.15.0"></a>
-## v2.15.0 (2016-10-21)
-
-
-#### Features
-
-* **AppSettings:**  adds new setting `AppSettings::AllowNegativeNumbers` ([ab064546](https://github.com/kbknapp/clap-rs/commit/ab06454677fb6aa9b9f804644fcca2168b1eaee3), closes [#696](https://github.com/kbknapp/clap-rs/issues/696))
-
-#### Documentation
-
-* **app/settings.rs:**  moves variants to roughly alphabetical order ([9ed4d4d7](https://github.com/kbknapp/clap-rs/commit/9ed4d4d7957a23357aef60081e45639ab9e3905f))
-
-
-<a name="v2.14.1"></a>
-### v2.14.1 (2016-10-20)
-
-
-#### Documentation
-
-*   Improve documentation around features ([4ee85b95](https://github.com/kbknapp/clap-rs/commit/4ee85b95d2d16708a016a3ba4e6e2c93b89b7fad))
-*   reword docs for ErrorKind and app::Settings ([3ccde7a4](https://github.com/kbknapp/clap-rs/commit/3ccde7a4b8f7a2ea8b916a5415c04a8ff4b5cb7a))
-*   fix tests that fail when the "suggestions" feature is disabled ([996fc381](https://github.com/kbknapp/clap-rs/commit/996fc381763a48d125c7ea8a58fed057fd0b4ac6))
-*   fix the OsString-using doc-tests ([af9e1a39](https://github.com/kbknapp/clap-rs/commit/af9e1a393ce6cdda46a03c8a4f48df222b015a24))
-*   tag non-rust code blocks as such instead of ignoring them ([0ba9f4b1](https://github.com/kbknapp/clap-rs/commit/0ba9f4b123f281952581b6dec948f7e51dd22890))
-* **ErrorKind:**  improve some errors about subcommands ([9f6217a4](https://github.com/kbknapp/clap-rs/commit/9f6217a424da823343d7b801b9c350dee3cd1906))
-* **yaml:**  make sure the doc-tests don't fail before "missing file" ([8c0f5551](https://github.com/kbknapp/clap-rs/commit/8c0f55516f4910c78c9f8a2bdbd822729574f95b))
-
-#### Improvements
-
-*   Stabilize clap_app! ([cd516006](https://github.com/kbknapp/clap-rs/commit/cd516006e35c37b005f329338560a0a53d1f3e00))
-* **with_defaults:**  Deprecate App::with_defaults() ([26085409](https://github.com/kbknapp/clap-rs/commit/2608540940c8bb66e517b65706bc7dea55510682), closes [#638](https://github.com/kbknapp/clap-rs/issues/638))
-
-#### Bug Fixes
-
-*   fixes a bug that made determining when to auto-wrap long help messages inconsistent ([468baadb](https://github.com/kbknapp/clap-rs/commit/468baadb8398fc1d37897b0c49374aef4cf97dca), closes [#688](https://github.com/kbknapp/clap-rs/issues/688))
-* **Completions:**  fish completions for nested subcommands ([a61eaf8a](https://github.com/kbknapp/clap-rs/commit/a61eaf8aade76cfe90ccc0f7125751ebf60e3254))
-* **features:**  Make lints not enable other nightly-requiring features ([835f75e3](https://github.com/kbknapp/clap-rs/commit/835f75e3ba20999117363ed9f916464d777f36ef))
-
-
-
-<a name="v2.14.0"></a>
-## v2.14.0 (2016-10-05)
-
-
-#### Features
-
-* **arg_aliases:**  Ability to alias arguments ([33b5f6ef](https://github.com/kbknapp/clap-rs/commit/33b5f6ef2c9612ecabb31f96b824793e46bfd3dd), closes [#669](https://github.com/kbknapp/clap-rs/issues/669))
-* **flag_aliases:**  Ability to alias flags ([40d6dac9](https://github.com/kbknapp/clap-rs/commit/40d6dac973927dded6ab423481634ef47ee7bfd7))
-
-#### Bug Fixes
-
-* **UsageParser:**  Handle non-ascii names / options. ([1d6a7c6e](https://github.com/kbknapp/clap-rs/commit/1d6a7c6e7e6aadc527346aa822f19d8587f714f3), closes [#664](https://github.com/kbknapp/clap-rs/issues/664))
-
-#### Documentation
-
-*   typo ([bac417fa](https://github.com/kbknapp/clap-rs/commit/bac417fa1cea3d32308334c7cccfcf54546cd9d8))
-
-
-<a name="v2.13.0"></a>
-## v2.13.0 (2016-09-18)
-
-
-#### Documentation
-
-*   updates README.md with new website information and updated video tutorials info ([0c19c580](https://github.com/kbknapp/clap-rs/commit/0c19c580cf50f1b82ff32f70b36708ae2bcac132))
-*   updates the docs about removing implicit value_delimiter(true) ([c81bc722](https://github.com/kbknapp/clap-rs/commit/c81bc722ebb8a86d22be89b5aec98df9fe222a08))
-* **Default Values:**  adds better examples on using default values ([57a8d9ab](https://github.com/kbknapp/clap-rs/commit/57a8d9abb2f973c235a8a14f8fc031673d7a7460), closes [#418](https://github.com/kbknapp/clap-rs/issues/418))
-
-#### Bug Fixes
-
-* **Value Delimiters:**  fixes the confusion around implicitly setting value delimiters. (default is now `false`) ([09d4d0a9](https://github.com/kbknapp/clap-rs/commit/09d4d0a9038d7ce2df55c2aec95e16f36189fcee), closes [#666](https://github.com/kbknapp/clap-rs/issues/666))
-
-
-
-<a name="v2.12.1"></a>
-### v2.12.1 (2016-09-13)
-
-
-#### Bug Fixes
-
-* **Help Wrapping:**  fixes a regression-bug where the old {n} newline char stopped working ([92ac353b](https://github.com/kbknapp/clap-rs/commit/92ac353b48b7caa2511ad2a046d94da93c236cf6), closes [#661](https://github.com/kbknapp/clap-rs/issues/661))
-
-
-
-<a name="v2.12.0"></a>
-## v2.12.0 (2016-09-13)
-
-
-#### Features
-
-* **Help:**  adds ability to hide the possible values on a per argument basis ([9151ef73](https://github.com/kbknapp/clap-rs/commit/9151ef739871f2e74910c342299c0de196b95dec), closes [#640](https://github.com/kbknapp/clap-rs/issues/640))
-* **help:**  allow for limiting detected terminal width ([a43e28af](https://github.com/kbknapp/clap-rs/commit/a43e28af85c9a9deaedd5ef735f4f13008daab29), closes [#653](https://github.com/kbknapp/clap-rs/issues/653))
-
-#### Documentation
-
-* **Help Wrapping:**  removes the verbiage about using `'{n}'` to insert newlines in help text ([c5a2b352](https://github.com/kbknapp/clap-rs/commit/c5a2b352ca600f5b802290ad945731066cd53611))
-* **Value Delimiters:**  updates the docs for the Arg::multiple method WRT value delimiters and default settings ([f9d17a06](https://github.com/kbknapp/clap-rs/commit/f9d17a060aa53f10d0a6e1a7eed5d989d1a59533))
-* **appsettings:**  Document AppSetting::DisableVersion ([94501965](https://github.com/kbknapp/clap-rs/commit/945019654d2ca67eb2b1d6014fdf80b84d528d30), closes [#589](https://github.com/kbknapp/clap-rs/issues/589))
-
-#### Bug Fixes
-
-* **AllowLeadingHyphen:**  fixes a bug where valid args aren't recognized with this setting ([a9699e4d](https://github.com/kbknapp/clap-rs/commit/a9699e4d7cdc9a06e73b845933ff1fe6d76f016a), closes [#588](https://github.com/kbknapp/clap-rs/issues/588))
-
-#### Improvements
-
-* **Help Wrapping:**
-  *  clap now ignores hard newlines in help messages and properly re-aligns text, but still wraps if the term width is too small ([c7678523](https://github.com/kbknapp/clap-rs/commit/c76785239fd42adc8ca04f9202b6fec615aa9f14), closes [#617](https://github.com/kbknapp/clap-rs/issues/617))
-  *  makes some minor changes to when next line help is automatically used ([01cae799](https://github.com/kbknapp/clap-rs/commit/01cae7990a33167ac35103fb36c811b4fe6eb98f))
-* **Value Delimiters:**  changes the default value delimiter rules ([f9e69254](https://github.com/kbknapp/clap-rs/commit/f9e692548e8c94de15f909432de301407d6bb834), closes [#655](https://github.com/kbknapp/clap-rs/issues/655))
-* **YAML:**  supports setting Arg::require_delimiter from YAML ([b9b55a39](https://github.com/kbknapp/clap-rs/commit/b9b55a39dfebcdbdc05dca2692927e503db50816))
-
-#### Performance
-
-* **help:**  fix redundant contains() checks ([a8afed74](https://github.com/kbknapp/clap-rs/commit/a8afed7428bf0733f8e93bb11ad6c00d9e970fcc))
-
-
-
-<a name="v2.11.3"></a>
-### v2.11.3 (2016-09-07)
-
-
-#### Documentation
-
-* **Help Wrapping:**  removes the verbiage about using `'{n}'` to insert newlines in help text ([c5a2b352](https://github.com/kbknapp/clap-rs/commit/c5a2b352ca600f5b802290ad945731066cd53611))
-
-#### Improvements
-
-* **Help Wrapping:**
-  *  clap now ignores hard newlines in help messages and properly re-aligns text, but still wraps if the term width is too small ([c7678523](https://github.com/kbknapp/clap-rs/commit/c76785239fd42adc8ca04f9202b6fec615aa9f14), closes [#617](https://github.com/kbknapp/clap-rs/issues/617))
-  *  makes some minor changes to when next line help is automatically used ([01cae799](https://github.com/kbknapp/clap-rs/commit/01cae7990a33167ac35103fb36c811b4fe6eb98f))
-* **YAML:**  supports setting Arg::require_delimiter from YAML ([b9b55a39](https://github.com/kbknapp/clap-rs/commit/b9b55a39dfebcdbdc05dca2692927e503db50816))
-
-
-
-
-<a name="v2.11.2"></a>
-### v2.11.2 (2016-09-06)
-
-#### Improvements
-
-* **Help Wrapping:**  makes some minor changes to when next line help is automatically used ([5658b117](https://github.com/kbknapp/clap-rs/commit/5658b117aec3e03adff9c8c52a4c4bc1fcb4e1ff))
-
-
-<a name="v2.11.1"></a>
-### v2.11.1 (2016-09-05)
-
-
-#### Bug Fixes
-
-* **Settings:**  fixes an issue where settings weren't propogated down through grand-child subcommands ([b3efc107](https://github.com/kbknapp/clap-rs/commit/b3efc107515d78517b20798ff3890b8a2b04498e), closes [#638](https://github.com/kbknapp/clap-rs/issues/638))
-
-#### Features
-
-* **Errors:**  Errors with custom description ([58512f2f](https://github.com/kbknapp/clap-rs/commit/58512f2fcb430745f1ee6ee8f1c67f62dc216c73))
-
-#### Improvements
-
-* **help:**  use term_size instead of home-grown solution ([fc7327e9](https://github.com/kbknapp/clap-rs/commit/fc7327e9dcf4258ef2baebf0a8714d9c0622855b))
-
-
-
-<a name="v2.11.0"></a>
-### v2.11.0 (2016-08-28)
-
-
-#### Bug Fixes
-
-* **Groups:**  fixes some usage strings that contain both args in groups and ones that conflict with each other ([3d782def](https://github.com/kbknapp/clap-rs/commit/3d782def57725e2de26ca5a5bc5cc2e40ddebefb), closes [#616](https://github.com/kbknapp/clap-rs/issues/616))
-
-#### Documentation
-
-*   moves docs to docs.rs ([03209d5e](https://github.com/kbknapp/clap-rs/commit/03209d5e1300906f00bafec1869c2047a92e5071), closes [#634](https://github.com/kbknapp/clap-rs/issues/634))
-
-#### Improvements
-
-* **Completions:**  uses standard conventions for bash completion files, namely '{bin}.bash-completion' ([27f5bbfb](https://github.com/kbknapp/clap-rs/commit/27f5bbfbcc9474c2f57c2b92b1feb898ae46ee70), closes [#567](https://github.com/kbknapp/clap-rs/issues/567))
-* **Help:**  automatically moves help text to the next line and wraps when term width is determined to be too small, or help text is too long ([150964c4](https://github.com/kbknapp/clap-rs/commit/150964c4e7124d54476c9d9b4b3f2406f0fd00e5), closes [#597](https://github.com/kbknapp/clap-rs/issues/597))
-* **YAML Errors:**  vastly improves error messages when using YAML ([f43b7c65](https://github.com/kbknapp/clap-rs/commit/f43b7c65941c53adc0616b8646a21dc255862eb2), closes [#574](https://github.com/kbknapp/clap-rs/issues/574))
-
-#### Features
-
-*   adds App::with_defaults to automatically use crate_authors! and crate_version! macros ([5520bb01](https://github.com/kbknapp/clap-rs/commit/5520bb012c127dfd299fd55699443c744d8dcd5b), closes [#600](https://github.com/kbknapp/clap-rs/issues/600))
-
-
-
-<a name="v2.10.4"></a>
-### v2.10.4 (2016-08-25)
-
-
-#### Bug Fixes
-
-* **Help Wrapping:**  fixes a bug where help is wrapped incorrectly and causing a panic with some non-English characters ([d0b442c7](https://github.com/kbknapp/clap-rs/commit/d0b442c7beeecac9764406bc3bd171ced0b8825e), closes [#626](https://github.com/kbknapp/clap-rs/issues/626))
-
-
-
-<a name="v2.10.3"></a>
-### v2.10.3 (2016-08-25)
-
-#### Features
-
-* **Help:**  adds new short hand way to use source formatting and ignore term width in help messages ([7dfdaf20](https://github.com/kbknapp/clap-rs/commit/7dfdaf200ebb5c431351a045b48f5e0f0d3f31db), closes [#625](https://github.com/kbknapp/clap-rs/issues/625))
-
-#### Documentation
-
-* **Term Width:**  adds details about set_term_width(0) ([00b8205d](https://github.com/kbknapp/clap-rs/commit/00b8205d22639d1b54b9c453c55c785aace52cb2))
-
-#### Bug Fixes
-
-* **Unicode:**  fixes two bugs where non-English characters were stripped or caused a panic with help wrapping ([763a5c92](https://github.com/kbknapp/clap-rs/commit/763a5c920e23efc74d190af0cb8b5dd714b2d67a), closes [#626](https://github.com/kbknapp/clap-rs/issues/626))
-
-
-
-<a name="v2.10.2"></a>
-### v2.10.2 (2016-08-22)
-
-
-#### Bug Fixes
-
-*   fixes a bug where the help is printed twice ([a643fb28](https://github.com/kbknapp/clap-rs/commit/a643fb283acd9905dc727c4579c5c9fa2ceaa7e7), closes [#623](https://github.com/kbknapp/clap-rs/issues/623))
-
-
-
-<a name="v2.10.1"></a>
-### v2.10.1 (2016-08-21)
-
-
-#### Bug Fixes
-
-* **Help Subcommand:**  fixes misleading usage string when using multi-level subcommmands ([e203515e](https://github.com/kbknapp/clap-rs/commit/e203515e3ac495b405dbba4f78fb6af148fd282e), closes [#618](https://github.com/kbknapp/clap-rs/issues/618))
-
-#### Features
-
-* **YAML:**  allows using lists or single values with arg declarations ([9ade2cd4](https://github.com/kbknapp/clap-rs/commit/9ade2cd4b268d6d7fe828319ce6a523c641b9c38), closes [#614](https://github.com/kbknapp/clap-rs/issues/614), [#613](https://github.com/kbknapp/clap-rs/issues/613))
-
-
-
-<a name="v2.10.0"></a>
-## v2.10.0 (2016-07-29)
-
-
-#### Features
-
-* **Completions:**  one can generate a basic fish completions script at compile time ([1979d2f2](https://github.com/kbknapp/clap-rs/commit/1979d2f2f3216e57d02a97e624a8a8f6cf867ed9))
-
-#### Bug Fixes
-
-* **parser:**  preserve external subcommand name ([875df243](https://github.com/kbknapp/clap-rs/commit/875df24316c266920a073c13bbefbf546bc1f635))
-
-#### Breaking Changes
-
-* **parser:**  preserve external subcommand name ([875df243](https://github.com/kbknapp/clap-rs/commit/875df24316c266920a073c13bbefbf546bc1f635))
-
-#### Documentation
-
-* **YAML:**  fixes example 17's incorrect reference to arg_groups instead of groups ([b6c99e13](https://github.com/kbknapp/clap-rs/commit/b6c99e1377f918e78c16c8faced70a71607da931), closes [#601](https://github.com/kbknapp/clap-rs/issues/601))
-
-
-
-<a name="2.9.3"></a>
-### 2.9.3 (2016-07-24)
-
-
-#### Bug Fixes
-
-*   fixes bug where only first arg in list of required_unless_one is recognized ([1fc3b55b](https://github.com/kbknapp/clap-rs/commit/1fc3b55bd6c8653b02e7c4253749c6b77737d2ac), closes [#575](https://github.com/kbknapp/clap-rs/issues/575))
-* **Settings:**  fixes typo subcommandsrequired->subcommandrequired ([fc72cdf5](https://github.com/kbknapp/clap-rs/commit/fc72cdf591d30f5d9375d0b5cc2a2ff3e812f9f6), closes [#593](https://github.com/kbknapp/clap-rs/issues/593))
-
-#### Features
-
-* **Completions:**  adds the ability to generate completions to io::Write object ([9f62cf73](https://github.com/kbknapp/clap-rs/commit/9f62cf7378ba5acb5ce8c5bac89b4aa60c30755f))
-* **Settings:**  Add unset_setting and unset_settings fns to App (#598) ([0ceba231](https://github.com/kbknapp/clap-rs/commit/0ceba231c6767cd6d88fdb1feeeea41deadf77ff), closes [#590](https://github.com/kbknapp/clap-rs/issues/590))
-
-
-<a name="2.9.2"></a>
-### 2.9.2 (2016-07-03)
-
-
-#### Documentation
-
-* **Completions:**  fixes the formatting of the Cargo.toml excerpt in the completions example ([722f2607](https://github.com/kbknapp/clap-rs/commit/722f2607beaef56b6a0e433db5fd09492d9f028c))
-
-#### Bug Fixes
-
-* **Completions:**  fixes bug where --help and --version short weren't added to the completion list ([e9f2438e](https://github.com/kbknapp/clap-rs/commit/e9f2438e2ce99af0ae570a2eaf541fc7f55b771b), closes [#536](https://github.com/kbknapp/clap-rs/issues/536))
-
-
-
-<a name="2.9.1"></a>
-### 2.9.1 (2016-07-02)
-
-
-#### Improvements
-
-* **Completions:**  allows multiple completions to be built by namespacing with bin name ([57484b2d](https://github.com/kbknapp/clap-rs/commit/57484b2daeaac01c1026e8c84efc8bf099e0eb31))
-
-
-<a name="v2.9.0"></a>
-## v2.9.0 (2016-07-01)
-
-
-#### Documentation
-
-* **Completions:**
-  *  fixes some errors in the completion docs ([9b359bf0](https://github.com/kbknapp/clap-rs/commit/9b359bf06255d3dad8f489308044b60a9d1e6a87))
-  *  adds documentation for completion scripts ([c6c519e4](https://github.com/kbknapp/clap-rs/commit/c6c519e40efd6c4533a9ef5efe8e74fd150391b7))
-
-#### Features
-
-* **Completions:**
-  *  one can now generate a bash completions script at compile time! ([e75b6c7b](https://github.com/kbknapp/clap-rs/commit/e75b6c7b75f729afb9eb1d2a2faf61dca7674634), closes [#376](https://github.com/kbknapp/clap-rs/issues/376))
-  *  completions now include aliases to subcommands, including all subcommand options ([0ab9f840](https://github.com/kbknapp/clap-rs/commit/0ab9f84052a8cf65b5551657f46c0c270841e634), closes [#556](https://github.com/kbknapp/clap-rs/issues/556))
-  *  completions now continue completing even after first completion ([18fc2e5b](https://github.com/kbknapp/clap-rs/commit/18fc2e5b5af63bf54a94b72cec5e1223d49f4806))
-  *  allows matching on possible values in options ([89cc2026](https://github.com/kbknapp/clap-rs/commit/89cc2026ba9ac69cf44c5254360bbf99236d4f89), closes [#557](https://github.com/kbknapp/clap-rs/issues/557))
-
-#### Bug Fixes
-
-* **AllowLeadingHyphen:**  fixes an issue where  isn't ignored like it should be with this setting ([96c24c9a](https://github.com/kbknapp/clap-rs/commit/96c24c9a8fa1f85e06138d3cdd133e51659e19d2), closes [#558](https://github.com/kbknapp/clap-rs/issues/558))
-
-<a name="v2.8.0"></a>
-## v2.8.0 (2016-06-30)
-
-
-#### Features
-
-* **Arg:**  adds new setting `Arg::require_delimiter` which requires val delimiter to parse multiple values ([920b5595](https://github.com/kbknapp/clap-rs/commit/920b5595ed72abfb501ce054ab536067d8df2a66))
-
-#### Bug Fixes
-
-*   Declare term::Winsize as repr(C) ([5d663d90](https://github.com/kbknapp/clap-rs/commit/5d663d905c9829ce6e7a164f1f0896cdd70236dd))
-
-#### Documentation
-
-* **Arg:**  adds docs for ([49af4e38](https://github.com/kbknapp/clap-rs/commit/49af4e38a5dae2ab0a7fc3b4147e2c053d532484))
-
-
-
-<a name="v2.7.1"></a>
-### v2.7.1 (2016-06-29)
-
-
-#### Bug Fixes
-
-* **Options:**
-  *  options with multiple values and using delimiters no longer parse additional values after a trailing space ([cdc500bd](https://github.com/kbknapp/clap-rs/commit/cdc500bdde6abe238c36ade406ddafc2bafff583))
-  *  using options with multiple values and with an = no longer parse args after the trailing space as values ([290f61d0](https://github.com/kbknapp/clap-rs/commit/290f61d07177413cf082ada55526d83405f6d011))
-
-
-
-<a name="v2.7.0"></a>
-## v2.7.0 (2016-06-28)
-
-
-#### Documentation
-
-*   fix typos ([43b3d40b](https://github.com/kbknapp/clap-rs/commit/43b3d40b8c38b1571da75af86b5088be96cccec2))
-* **ArgGroup:**  vastly improves ArgGroup docs by adding better examples ([9e5f4f5d](https://github.com/kbknapp/clap-rs/commit/9e5f4f5d734d630bca5535c3a0aa4fd4f9db3e39), closes [#534](https://github.com/kbknapp/clap-rs/issues/534))
-
-#### Features
-
-* **ArgGroup:**  one can now specify groups which require AT LEAST one of the args ([33689acc](https://github.com/kbknapp/clap-rs/commit/33689acc689b217a8c0ee439f1b1225590c38355), closes [#533](https://github.com/kbknapp/clap-rs/issues/533))
-
-#### Bug Fixes
-
-* **App:**  using `App::print_help` now prints the same as would have been printed by `--help` or the like ([e84cc018](https://github.com/kbknapp/clap-rs/commit/e84cc01836bbe0527e97de6db9889bd9e0fd6ba1), closes [#536](https://github.com/kbknapp/clap-rs/issues/536))
-* **Help:**
-  *  prevents invoking <cmd> help help and displaying incorrect help message ([e3d2893f](https://github.com/kbknapp/clap-rs/commit/e3d2893f377942a2d4cf3c6ff04524d0346e6fdb), closes [#538](https://github.com/kbknapp/clap-rs/issues/538))
-  *  subcommand help messages requested via <cmd> help <sub> now correctly match <cmd> <sub> --help ([08ad1cff](https://github.com/kbknapp/clap-rs/commit/08ad1cff4fec57224ea957a2891a057b323c01bc), closes [#539](https://github.com/kbknapp/clap-rs/issues/539))
-
-#### Improvements
-
-* **ArgGroup:**  Add multiple ArgGroups per Arg ([902e182f](https://github.com/kbknapp/clap-rs/commit/902e182f7a58aff11ff01e0a452abcdbdb2262aa), closes [#426](https://github.com/kbknapp/clap-rs/issues/426))
-* **Usage Strings:**  `[FLAGS]` and `[ARGS]` are no longer blindly added to usage strings ([9b2e45b1](https://github.com/kbknapp/clap-rs/commit/9b2e45b170aff567b038d8b3368880b6046c10c6), closes [#537](https://github.com/kbknapp/clap-rs/issues/537))
-* **arg_enum!:**  allows using meta items like repr(C) with arg_enum!s ([edf9b233](https://github.com/kbknapp/clap-rs/commit/edf9b2331c17a2cbcc13f961add4c55c2778e773), closes [#543](https://github.com/kbknapp/clap-rs/issues/543))
-
-
-
-<a name="v2.6.0"></a>
-## v2.6.0 (2016-06-14)
-
-
-#### Improvements
-
-*   removes extra newline from help output ([86e61d19](https://github.com/kbknapp/clap-rs/commit/86e61d19a748fb9870fcf1175308984e51ca1115))
-*   allows printing version to any io::Write object ([921f5f79](https://github.com/kbknapp/clap-rs/commit/921f5f7916597f1d028cd4a65bfe76a01c801724))
-*   removes extra newline when printing version ([7e2e2cbb](https://github.com/kbknapp/clap-rs/commit/7e2e2cbb4a8a0f050bb8072a376f742fc54b8589))
-* **Aliases:**  improves readability of asliases in help messages ([ca511de7](https://github.com/kbknapp/clap-rs/commit/ca511de71f5b8c2ac419f1b188658e8c63b67846), closes [#526](https://github.com/kbknapp/clap-rs/issues/526), [#529](https://github.com/kbknapp/clap-rs/issues/529))
-* **Usage Strings:**  improves the default usage string when only a single positional arg is present ([ec86f2da](https://github.com/kbknapp/clap-rs/commit/ec86f2dada1545a63fc72355e22fcdc4c466c215), closes [#518](https://github.com/kbknapp/clap-rs/issues/518))
-
-#### Features
-
-* **Help:**  allows wrapping at specified term width (Even on Windows!) ([1761dc0d](https://github.com/kbknapp/clap-rs/commit/1761dc0d27d0d621229d792be40c36fbf65c3014), closes [#451](https://github.com/kbknapp/clap-rs/issues/451))
-* **Settings:**
-  *  adds new setting to stop delimiting values with -- or TrailingVarArg ([fc3e0f5a](https://github.com/kbknapp/clap-rs/commit/fc3e0f5afda6d24cdb3c4676614beebe13e1e870), closes [#511](https://github.com/kbknapp/clap-rs/issues/511))
-  *  one can now set an AppSetting which is propogated down through child subcommands ([e2341835](https://github.com/kbknapp/clap-rs/commit/e23418351a3b98bf08dfd7744bc14377c70d59ee), closes [#519](https://github.com/kbknapp/clap-rs/issues/519))
-* **Subcommands:**  adds support for visible aliases ([7b10e7f8](https://github.com/kbknapp/clap-rs/commit/7b10e7f8937a07fdb8d16a6d8df79ce78d080cd3), closes [#522](https://github.com/kbknapp/clap-rs/issues/522))
-
-#### Bug Fixes
-
-*   fixes bug where args are printed out of order with templates ([05abb534](https://github.com/kbknapp/clap-rs/commit/05abb534864764102031a0d402e64ac65867aa87))
-*   fixes bug where one can't override version or help flags ([90d7d6a2](https://github.com/kbknapp/clap-rs/commit/90d7d6a2ea8240122dd9bf8d82d3c4f5ebb5c703), closes [#514](https://github.com/kbknapp/clap-rs/issues/514))
-*   fixes issue where before_help wasn't printed ([b3faff60](https://github.com/kbknapp/clap-rs/commit/b3faff6030f76a23f26afcfa6a90169002ed7106))
-* **Help:**  `App::before_help` and `App::after_help` now correctly wrap ([1f4da767](https://github.com/kbknapp/clap-rs/commit/1f4da7676e6e71aa8dda799f3eeefad105a47819), closes [#516](https://github.com/kbknapp/clap-rs/issues/516))
-* **Settings:**  fixes bug where new color settings couldn't be converted from strs ([706a7c11](https://github.com/kbknapp/clap-rs/commit/706a7c11b0900be594de6d5a3121938eff197602))
-* **Subcommands:**  subcommands with aliases now display help of the aliased subcommand ([5354d14b](https://github.com/kbknapp/clap-rs/commit/5354d14b51f189885ba110e01e6b76cca3752992), closes [#521](https://github.com/kbknapp/clap-rs/issues/521))
-* **Windows:**  fixes a failing windows build ([01e7dfd6](https://github.com/kbknapp/clap-rs/commit/01e7dfd6c07228c0be6695b3c7bf9370d82860d4))
-* **YAML:**  adds missing YAML methods for App and Arg ([e468faf3](https://github.com/kbknapp/clap-rs/commit/e468faf3f05950fd9f72d84b69aa2061e91c6c64), closes [#528](https://github.com/kbknapp/clap-rs/issues/528))
-
-
-
-<a name="v2.5.2"></a>
-### v2.5.2 (2016-05-31)
-
-
-#### Improvements
-
-*   removes extra newline from help output ([86e61d19](https://github.com/kbknapp/clap-rs/commit/86e61d19a748fb9870fcf1175308984e51ca1115))
-*   allows printing version to any io::Write object ([921f5f79](https://github.com/kbknapp/clap-rs/commit/921f5f7916597f1d028cd4a65bfe76a01c801724))
-*   removes extra newline when printing version ([7e2e2cbb](https://github.com/kbknapp/clap-rs/commit/7e2e2cbb4a8a0f050bb8072a376f742fc54b8589))
-
-#### Bug Fixes
-
-*   fixes bug where args are printed out of order with templates ([3935431d](https://github.com/kbknapp/clap-rs/commit/3935431d5633f577c0826ae2142794b301f4b8ca))
-*   fixes bug where one can't override version or help flags ([90d7d6a2](https://github.com/kbknapp/clap-rs/commit/90d7d6a2ea8240122dd9bf8d82d3c4f5ebb5c703), closes [#514](https://github.com/kbknapp/clap-rs/issues/514))
-*   fixes issue where before_help wasn't printed ([b3faff60](https://github.com/kbknapp/clap-rs/commit/b3faff6030f76a23f26afcfa6a90169002ed7106))
-
-#### Documentation
-
-*   inter-links all types and pages ([3312893d](https://github.com/kbknapp/clap-rs/commit/3312893ddaef3f44d68d8d26ed3d08010be50d97), closes [#505](https://github.com/kbknapp/clap-rs/issues/505))
-*   makes all publicly available types viewable in docs ([52ca6505](https://github.com/kbknapp/clap-rs/commit/52ca6505b4fec7b5c2d53d160c072d395eb21da6))
-
-<a name="v2.5.1"></a>
-### v2.5.1 (2016-05-11)
-
-
-#### Bug Fixes
-
-* **Subcommand Aliases**: fixes lifetime issue when setting multiple aliases at once ([ac42f6cf0](https://github.com/kbknapp/clap-rs/commit/ac42f6cf0de6c4920f703807d63061803930b18d))
-
-<a name="v2.5.0"></a>
-## v2.5.0 (2016-05-10)
-
-
-#### Improvements
-
-* **SubCommand Aliases:**  adds feature to yaml configs too ([69592195](https://github.com/kbknapp/clap-rs/commit/695921954dde46dfd483399dcdef482c9dd7f34a))
-
-#### Features
-
-* **SubCommands:**  adds support for subcommand aliases ([66b4dea6](https://github.com/kbknapp/clap-rs/commit/66b4dea65c44d8f77ff522238a9237aed1bcab6d), closes [#469](https://github.com/kbknapp/clap-rs/issues/469))
-
-
-<a name="v2.4.3"></a>
-### v2.4.3 (2016-05-10)
-
-
-#### Bug Fixes
-
-* **Usage Strings:**
-  *  now properly dedups args that are also in groups ([3ca0947c](https://github.com/kbknapp/clap-rs/commit/3ca0947c166b4f8525752255e3a4fa6565eb9689), closes [#498](https://github.com/kbknapp/clap-rs/issues/498))
-  *  removes duplicate groups from usage strings ([f574fb8a](https://github.com/kbknapp/clap-rs/commit/f574fb8a7cde4d4a2fa4c4481d59be2d0f135427))
-
-#### Improvements
-
-* **Groups:**  formats positional args in groups in a better way ([fef11154](https://github.com/kbknapp/clap-rs/commit/fef11154fb7430d1cbf04a672aabb366e456a368))
-* **Help:**
-  *  moves positionals to standard <> formatting ([03dfe5ce](https://github.com/kbknapp/clap-rs/commit/03dfe5ceff1d63f172788ff688567ddad9fe119b))
-  *  default help subcommand string has been shortened ([5b7fe8e4](https://github.com/kbknapp/clap-rs/commit/5b7fe8e4161e43ab19e2e5fcf55fbe46791134e9), closes [#494](https://github.com/kbknapp/clap-rs/issues/494))
-
-<a name="v2.4.2"></a>
-### v2.4.3 (2016-05-10)
-
-* Ghost Release
-
-<a name="v2.4.1"></a>
-### v2.4.3 (2016-05-10)
-
-* Ghost Release
-
-<a name="v2.4.0"></a>
-## v2.4.0 (2016-05-02)
-
-
-#### Features
-
-* **Help:**  adds support for displaying info before help message ([29fbfa3b](https://github.com/kbknapp/clap-rs/commit/29fbfa3b963f2f3ca7704bf5d3e1201531baa373))
-* **Required:**  adds allowing args that are required unless certain args are present ([af1f7916](https://github.com/kbknapp/clap-rs/commit/af1f79168390ea7da4074d0d9777de458ea64971))
-
-#### Documentation
-
-*   hides formatting from docs ([cb708093](https://github.com/kbknapp/clap-rs/commit/cb708093a7cd057f08c98b7bd1ed54c2db86ae7e))
-* **required_unless:**  adds docs and examples for required_unless ([ca727b52](https://github.com/kbknapp/clap-rs/commit/ca727b52423b9883acd88b2f227b2711bc144573))
-
-#### Bug Fixes
-
-* **Required Args:**  fixes issue where missing required args are sometimes duplicatd in error messages ([3beebd81](https://github.com/kbknapp/clap-rs/commit/3beebd81e7bc2faa4115ac109cf570e512c5477f), closes [#492](https://github.com/kbknapp/clap-rs/issues/492))
-
-
-<a name="v2.3.0"></a>
-## v2.3.0 (2016-04-18)
-
-
-#### Improvements
-
-* **macros.rs:**  Added write_nspaces macro (a new version of write_spaces) ([9d757e86](https://github.com/kbknapp/clap-rs/commit/9d757e8678e334e5a740ac750c76a9ed4e785cba))
-* **parser.rs:**
-  *  Provide a way to create a usage string without the USAGE: title ([a91d378b](https://github.com/kbknapp/clap-rs/commit/a91d378ba0c91b5796457f8c6e881b13226ab735))
-  *  Make Parser's create_usage public allowing to have function outside the parser to generate the help ([d51945f8](https://github.com/kbknapp/clap-rs/commit/d51945f8b82ebb0963f4f40b384a9e8335783091))
-  *  Expose Parser's flags, opts and positionals argument as iterators ([9b23e7ee](https://github.com/kbknapp/clap-rs/commit/9b23e7ee40e51f7a823644c4496be955dc6c9d3a))
-* **src/args:**  Exposes argument display order by introducing a new Trait ([1321630e](https://github.com/kbknapp/clap-rs/commit/1321630ef56955f152c73376d4d85cceb0bb4a12))
-* **srs/args:**  Added longest_filter to AnyArg trait ([65b3f667](https://github.com/kbknapp/clap-rs/commit/65b3f667532685f854c699ddd264d326599cf7e5))
-
-#### Features
-
-* **Authors Macro:**  adds a crate_authors macro ([38fb59ab](https://github.com/kbknapp/clap-rs/commit/38fb59abf480eb2b6feca269097412f8b00b5b54), closes [#447](https://github.com/kbknapp/clap-rs/issues/447))
-* **HELP:**
-  *  implements optional colored help messages ([abc8f669](https://github.com/kbknapp/clap-rs/commit/abc8f669c3c8193ffc3a3b0ac6c3ac2198794d4f), closes [#483](https://github.com/kbknapp/clap-rs/issues/483))
-  *  Add a Templated Help system. ([81e121ed](https://github.com/kbknapp/clap-rs/commit/81e121edd616f7285593f11120c63bcccae0d23e))
-
-#### Bug Fixes
-
-* **HELP:**  Adjust Help to semantic changes introduced in 6933b84 ([8d23806b](https://github.com/kbknapp/clap-rs/commit/8d23806bd67530ad412c34a1dcdcb1435555573d))
-
-<a name="v2.2.6"></a>
-### v2.2.6 (2016-04-11)
-
-#### Bug Fixes
-
-* **Arg Groups**: fixes bug where arg name isn't printed properly ([3019a685](https://github.com/kbknapp/clap-rs/commit/3019a685eee747ccbe6be09ad5dddce0b1d1d4db), closes [#476](https://github.com/kbknapp/clap-rs/issues/476))
-
-
-<a name="v2.2.5"></a>
-### v2.2.5 (2016-04-03)
-
-
-#### Bug Fixes
-
-* **Empty Values:**  fixes bug where empty values weren't stored ([885d166f](https://github.com/kbknapp/clap-rs/commit/885d166f04eb3fb581898ae5818c6c8032e5a686), closes [#470](https://github.com/kbknapp/clap-rs/issues/470))
-* **Help Message:**  fixes bug where arg name is printed twice ([71acf1d5](https://github.com/kbknapp/clap-rs/commit/71acf1d576946658b8bbdb5ae79e6716c43a030f), closes [#472](https://github.com/kbknapp/clap-rs/issues/472))
-
-
-<a name="v2.2.4"></a>
-### v2.2.4 (2016-03-30)
-
-
-#### Bug Fixes
-
-*   fixes compiling with debug cargo feature ([d4b55450](https://github.com/kbknapp/clap-rs/commit/d4b554509928031ac0808076178075bb21f8c1da))
-* **Empty Values:**  fixes bug where empty values weren't stored ([885d166f](https://github.com/kbknapp/clap-rs/commit/885d166f04eb3fb581898ae5818c6c8032e5a686), closes [#470](https://github.com/kbknapp/clap-rs/issues/470))
-
-
-
-<a name="v2.2.3"></a>
-### v2.2.3 (2016-03-28)
-
-
-#### Bug Fixes
-
-* **Help Subcommand:**  fixes issue where help and version flags weren't properly displayed ([205b07bf](https://github.com/kbknapp/clap-rs/commit/205b07bf2e6547851f1290f8cd6b169145e144f1), closes [#466](https://github.com/kbknapp/clap-rs/issues/466))
-
-<a name="v2.2.2"></a>
-### v2.2.2 (2016-03-27)
-
-
-#### Bug Fixes
-
-* **Help Message:**  fixes bug with wrapping in the middle of a unicode sequence ([05365ddc](https://github.com/kbknapp/clap-rs/commit/05365ddcc252e4b49e7a75e199d6001a430bd84d), closes [#456](https://github.com/kbknapp/clap-rs/issues/456))
-* **Usage Strings:**  fixes small bug where -- would appear needlessly in usage strings ([6933b849](https://github.com/kbknapp/clap-rs/commit/6933b8491c2a7e28cdb61b47dcf10caf33c2f78a), closes [#461](https://github.com/kbknapp/clap-rs/issues/461))
-
-
-<a name="2.2.1"></a>
-### 2.2.1 (2016-03-16)
-
-
-#### Features
-
-* **Help Message:**  wraps and aligns the help message of subcommands ([813d75d0](https://github.com/kbknapp/clap-rs/commit/813d75d06fbf077c65762608c0fa5e941cfc393c), closes [#452](https://github.com/kbknapp/clap-rs/issues/452))
-
-#### Bug Fixes
-
-* **Help Message:**  fixes a bug where small terminal sizes causing a loop ([1d73b035](https://github.com/kbknapp/clap-rs/commit/1d73b0355236923aeaf6799abc759762ded7e1d0), closes [#453](https://github.com/kbknapp/clap-rs/issues/453))
-
-
-<a name="v2.2.0"></a>
-## v2.2.0 (2016-03-15)
-
-
-#### Features
-
-* **Help Message:**  can auto wrap and aligning help text to term width ([e36af026](https://github.com/kbknapp/clap-rs/commit/e36af0266635f23e85e951b9088d561e9a5d1bf6), closes [#428](https://github.com/kbknapp/clap-rs/issues/428))
-* **Help Subcommand:**  adds support passing additional subcommands to help subcommand ([2c12757b](https://github.com/kbknapp/clap-rs/commit/2c12757bbdf34ce481f3446c074e24c09c2e60fd), closes [#416](https://github.com/kbknapp/clap-rs/issues/416))
-* **Opts and Flags:**  adds support for custom ordering in help messages ([9803b51e](https://github.com/kbknapp/clap-rs/commit/9803b51e799904c0befaac457418ee766ccc1ab9))
-* **Settings:**  adds support for automatically deriving custom display order of args ([ad86e433](https://github.com/kbknapp/clap-rs/commit/ad86e43334c4f70e86909689a088fb87e26ff95a), closes [#444](https://github.com/kbknapp/clap-rs/issues/444))
-* **Subcommands:**  adds support for custom ordering in help messages ([7d2a2ed4](https://github.com/kbknapp/clap-rs/commit/7d2a2ed413f5517d45988eef0765cdcd663b6372), closes [#442](https://github.com/kbknapp/clap-rs/issues/442))
-
-#### Bug Fixes
-
-* **From Usage:**  fixes a bug where adding empty lines werent ignored ([c5c58c86](https://github.com/kbknapp/clap-rs/commit/c5c58c86b9c503d8de19da356a5a5cffb59fbe84))
-
-#### Documentation
-
-* **Groups:**  explains required ArgGroups better ([4ff0205b](https://github.com/kbknapp/clap-rs/commit/4ff0205b85a45151b59bbaf090a89df13438380f), closes [#439](https://github.com/kbknapp/clap-rs/issues/439))
-
-<a name="v2.1.2"></a>
-### v2.1.2 (2016-02-24)
-
-#### Bug Fixes
-
-* **Nightly:**  fixes failing nightly build ([d752c170](https://github.com/kbknapp/clap-rs/commit/d752c17029598b19037710f204b7943f0830ae75), closes [#434](https://github.com/kbknapp/clap-rs/issues/434))
-
-
-<a name="v2.1.1"></a>
-### v2.1.1 (2016-02-19)
-
-
-#### Documentation
-
-* **AppSettings:**  clarifies that AppSettings do not propagate ([3c8db0e9](https://github.com/kbknapp/clap-rs/commit/3c8db0e9be1d24edaad364359513cbb02abb4186), closes [#429](https://github.com/kbknapp/clap-rs/issues/429))
-* **Arg Examples:**  adds better examples ([1e79cccc](https://github.com/kbknapp/clap-rs/commit/1e79cccc12937bc0e7cd2aad8e404410798e9fff))
-
-#### Improvements
-
-* **Help:**  adds setting for next line help by arg ([066df748](https://github.com/kbknapp/clap-rs/commit/066df7486e684cf50a8479a356a12ba972c34ce1), closes [#427](https://github.com/kbknapp/clap-rs/issues/427))
-
-
-<a name="v2.1.0"></a>
-## v2.1.0 (2016-02-10)
-
-
-#### Features
-
-* **Defult Values:**  adds support for default values in args ([73211952](https://github.com/kbknapp/clap-rs/commit/73211952964a79d97b434dd567e6d7d34be7feb5), closes [#418](https://github.com/kbknapp/clap-rs/issues/418))
-
-#### Documentation
-
-* **Default Values:**  adds better examples and notes for default values ([9facd74f](https://github.com/kbknapp/clap-rs/commit/9facd74f843ef3807c5d35259558a344e6c25905))
-
-
-<a name="v2.0.6"></a>
-### v2.0.6 (2016-02-09)
-
-
-#### Improvements
-
-* **Positional Arguments:**  now displays value name if appropriate ([f0a99916](https://github.com/kbknapp/clap-rs/commit/f0a99916c59ce675515c6dcdfe9a40b130510908), closes [#420](https://github.com/kbknapp/clap-rs/issues/420))
-
-
-<a name="v2.0.5"></a>
-### v2.0.5 (2016-02-05)
-
-
-#### Bug Fixes
-
-* **Multiple Values:**  fixes bug where number_of_values wasnt respected ([72c387da](https://github.com/kbknapp/clap-rs/commit/72c387da0bb8a6f526f863770f08bb8ca0d3de03))
-
-
-<a name="v2.0.4"></a>
-### v2.0.4 (2016-02-04)
-
-
-#### Bug Fixes
-
-*   adds support for building ArgGroups from standalone YAML ([fcbc7e12](https://github.com/kbknapp/clap-rs/commit/fcbc7e12f5d7b023b8f30cba8cad28a01cf6cd26))
-*   Stop lonely hyphens from causing panic ([85b11468](https://github.com/kbknapp/clap-rs/commit/85b11468b0189d5cc15f1cfac5db40d17a0077dc), closes [#410](https://github.com/kbknapp/clap-rs/issues/410))
-* **AppSettings:**  fixes bug where subcmds didn't receive parent ver ([a62e4527](https://github.com/kbknapp/clap-rs/commit/a62e452754b3b0e3ac9a15aa8b5330636229ead1))
-
-<a name="v2.0.3"></a>
-### v2.0.3 (2016-02-02)
-
-
-#### Improvements
-
-* **values:**  adds support for up to u64::max values per arg ([c7abf7d7](https://github.com/kbknapp/clap-rs/commit/c7abf7d7611e317b0d31d97632e3d2e13570947c))
-* **occurrences:**  Allow for more than 256 occurrences of an argument. ([3731ddb3](https://github.com/kbknapp/clap-rs/commit/3731ddb361163f3d6b86844362871e48c80fa530))
-
-#### Features
-
-* **AppSettings:**  adds HidePossibleValuesInHelp to skip writing those values ([cdee7a0e](https://github.com/kbknapp/clap-rs/commit/cdee7a0eb2beeec723cb98acfacf03bf629c1da3))
-
-#### Bug Fixes
-
-* **value_t_or_exit:**  fixes typo which causes value_t_or_exit to return a Result ([ee96baff](https://github.com/kbknapp/clap-rs/commit/ee96baffd306cb8d20ddc5575cf739bb1a6354e8))
-
-
-<a name="v2.0.2"></a>
-### v2.0.2 (2016-01-31)
-
-
-#### Improvements
-
-* **arg_enum:**  enum declared with arg_enum returns [&'static str; #] instead of Vec ([9c4b8a1a](https://github.com/kbknapp/clap-rs/commit/9c4b8a1a6b12949222f17d1074578ad7676b9c0d))
-
-#### Bug Fixes
-
-*   clap_app! should be gated by unstable, not nightly feature ([0c8b84af](https://github.com/kbknapp/clap-rs/commit/0c8b84af6161d5baf683688eafc00874846f83fa))
-* **SubCommands:**  fixed where subcmds weren't recognized after mult args ([c19c17a8](https://github.com/kbknapp/clap-rs/commit/c19c17a8850602990e24347aeb4427cf43316223), closes [#405](https://github.com/kbknapp/clap-rs/issues/405))
-* **Usage Parser:**  fixes a bug where literal single quotes weren't allowed in help strings ([0bcc7120](https://github.com/kbknapp/clap-rs/commit/0bcc71206478074769e311479b34a9f74fe80f5c), closes [#406](https://github.com/kbknapp/clap-rs/issues/406))
-
-
-<a name="v2.0.1"></a>
-### v2.0.1 (2016-01-30)
-
-
-#### Bug Fixes
-
-*   fixes cargo features to NOT require nightly with unstable features ([dcbcc60c](https://github.com/kbknapp/clap-rs/commit/dcbcc60c9ba17894be636472ea4b07a82d86a9db), closes [#402](https://github.com/kbknapp/clap-rs/issues/402))
-
-
-<a name="v2.0.0"></a>
-## v2.0.0 (2016-01-28)
-
-
-#### Improvements
-
-* **From Usage:**  vastly improves the usage parser ([fa3a2f86](https://github.com/kbknapp/clap-rs/commit/fa3a2f86bd674c5eb07128c95098fab7d1437247), closes [#350](https://github.com/kbknapp/clap-rs/issues/350))
-
-#### Features
-
-*   adds support for external subcommands ([177fe5cc](https://github.com/kbknapp/clap-rs/commit/177fe5cce745c2164a8e38c23be4c4460d2d7211), closes [#372](https://github.com/kbknapp/clap-rs/issues/372))
-*   adds support values with a leading hyphen ([e4d429b9](https://github.com/kbknapp/clap-rs/commit/e4d429b9d52e95197bd0b572d59efacecf305a59), closes [#385](https://github.com/kbknapp/clap-rs/issues/385))
-*   adds support for turning off the value delimiter ([508db850](https://github.com/kbknapp/clap-rs/commit/508db850a87c2e251cf6b6ddead9ad56b29f9e57), closes [#352](https://github.com/kbknapp/clap-rs/issues/352))
-*   adds support changing the value delimiter ([dafeae8a](https://github.com/kbknapp/clap-rs/commit/dafeae8a526162640f6a68da434370c64d190889), closes [#353](https://github.com/kbknapp/clap-rs/issues/353))
-*   adds support for comma separated values ([e69da6af](https://github.com/kbknapp/clap-rs/commit/e69da6afcd2fe48a3c458ca031db40997f860eda), closes [#348](https://github.com/kbknapp/clap-rs/issues/348))
-*   adds support with options with optional values ([4555736c](https://github.com/kbknapp/clap-rs/commit/4555736cad01441dcde4ea84a285227e0844c16e), closes [#367](https://github.com/kbknapp/clap-rs/issues/367))
-* **UTF-8:**  adds support for invalid utf8 in values ([c5c59dec](https://github.com/kbknapp/clap-rs/commit/c5c59dec0bc33b86b2e99d30741336f17ec84282), closes [#269](https://github.com/kbknapp/clap-rs/issues/269))
-* **v2:**  implementing the base of 2.x ([a3536054](https://github.com/kbknapp/clap-rs/commit/a3536054512ba833533dc56615ce3663d884381c))
-
-#### Bug Fixes
-
-*   fixes nightly build with new lints ([17599195](https://github.com/kbknapp/clap-rs/commit/175991956c37dc83ba9c49396e927a1cb65c5b11))
-*   fixes Windows build for 2x release ([674c9b48](https://github.com/kbknapp/clap-rs/commit/674c9b48c7c92079cb180cc650a9e39f34781c32), closes [#392](https://github.com/kbknapp/clap-rs/issues/392))
-*   fixes yaml build for 2x base ([adceae64](https://github.com/kbknapp/clap-rs/commit/adceae64c8556d00ab715677377b216f9f468ad7))
-
-#### Documentation
-
-*   updates examples for 2x release ([1303b360](https://github.com/kbknapp/clap-rs/commit/1303b3607468f362ab1b452d5614c1a064dc69b4), closes [#394](https://github.com/kbknapp/clap-rs/issues/394))
-*   updates examples for 2x release ([0a011f31](https://github.com/kbknapp/clap-rs/commit/0a011f3142aec338d388a6c8bfe22fa7036021bb), closes [#394](https://github.com/kbknapp/clap-rs/issues/394))
-*   updates documentation for v2 release ([8d51724e](https://github.com/kbknapp/clap-rs/commit/8d51724ef73dfde5bb94fb9466bc5463a1cc1502))
-*   updating docs for 2x release ([576d0e0e](https://github.com/kbknapp/clap-rs/commit/576d0e0e2c7b8f386589179bbf7419b93abacf1c))
-* **README.md:**
-  *  updates readme for v2 release ([acaba01a](https://github.com/kbknapp/clap-rs/commit/acaba01a353c12144b9cd9a3ce447400691849b0), closes [#393](https://github.com/kbknapp/clap-rs/issues/393))
-  *  fix typo and make documentation conspicuous ([07b9f614](https://github.com/kbknapp/clap-rs/commit/07b9f61495d927f69f7abe6c0d85253f0f4e6107))
-
-#### BREAKING CHANGES
-
-* **Fewer liftimes! Yay!**
- * `App<'a, 'b, 'c, 'd, 'e, 'f>` => `App<'a, 'b>`
- * `Arg<'a, 'b, 'c, 'd, 'e, 'f>` => `Arg<'a, 'b>`
- * `ArgMatches<'a, 'b>` => `ArgMatches<'a>`
-* **Simply Renamed**
- * `App::arg_group` => `App::group`
- * `App::arg_groups` => `App::groups`
- * `ArgGroup::add` => `ArgGroup::arg`
- * `ArgGroup::add_all` => `ArgGroup::args`
- * `ClapError` => `Error`
-  * struct field `ClapError::error_type` => `Error::kind`
- * `ClapResult` => `Result`
- * `ClapErrorType` => `ErrorKind`
-* **Removed Deprecated Functions and Methods**
- * `App::subcommands_negate_reqs`
- * `App::subcommand_required`
- * `App::arg_required_else_help`
- * `App::global_version(bool)`
- * `App::versionless_subcommands`
- * `App::unified_help_messages`
- * `App::wait_on_error`
- * `App::subcommand_required_else_help`
- * `SubCommand::new`
- * `App::error_on_no_subcommand`
- * `Arg::new`
- * `Arg::mutually_excludes`
- * `Arg::mutually_excludes_all`
- * `Arg::mutually_overrides_with`
- * `simple_enum!`
-* **Renamed Error Variants**
- * `InvalidUnicode` => `InvalidUtf8`
- * `InvalidArgument` => `UnknownArgument`
-* **Usage Parser**
- * Value names can now be specified inline, i.e. `-o, --option <FILE> <FILE2> 'some option which takes two files'`
- * **There is now a priority of order to determine the name** - This is perhaps the biggest breaking change. See the documentation for full details. Prior to this change, the value name took precedence. **Ensure your args are using the proper names (i.e. typically the long or short and NOT the value name) throughout the code**
-* `ArgMatches::values_of` returns an `Values` now which implements `Iterator` (should not break any code)
-* `crate_version!` returns `&'static str` instead of `String`
-* Using the `clap_app!` macro requires compiling with the `unstable` feature because the syntax could change slightly in the future
-
-
-<a name="v1.5.5"></a>
-### v1.5.5 (2016-01-04)
-
-
-#### Bug Fixes
-
-*   fixes an issue where invalid short args didn't cause an error ([c9bf7e44](https://github.com/kbknapp/clap-rs/commit/c9bf7e4440bd2f9b524ea955311d433c40a7d1e0))
-*   prints the name in version and help instead of binary name ([8f3817f6](https://github.com/kbknapp/clap-rs/commit/8f3817f665c0cab6726bc16c56a53b6a61e44448), closes [#368](https://github.com/kbknapp/clap-rs/issues/368))
-*   fixes an intentional panic issue discovered via clippy ([ea83a3d4](https://github.com/kbknapp/clap-rs/commit/ea83a3d421ea8856d4cac763942834d108b71406))
-
-
-<a name="v1.5.4"></a>
-### v1.5.4 (2015-12-18)
-
-
-#### Examples
-
-* **17_yaml:**  conditinonally compile 17_yaml example ([575de089](https://github.com/kbknapp/clap-rs/commit/575de089a3e240c398cb10e6cf5a5c6b68662c01))
-
-#### Improvements
-
-*   clippy improvements ([99cdebc2](https://github.com/kbknapp/clap-rs/commit/99cdebc23da3a45a165f14b27bebeb2ed828a2ce))
-
-#### Bug Fixes
-
-
-* **errors:**  return correct error type in WrongNumValues error builder ([5ba8ba9d](https://github.com/kbknapp/clap-rs/commit/5ba8ba9dcccdfa74dd1c44260e64b359bbb36be6))
-*   ArgRequiredElseHelp setting now takes precedence over missing required args ([faad83fb](https://github.com/kbknapp/clap-rs/commit/faad83fbef6752f3093b6e98fca09a9449b830f4), closes [#362](https://github.com/kbknapp/clap-rs/issues/362))
-
-
-<a name="v1.5.3"></a>
-### v1.5.3 (2015-11-20)
-
-
-#### Bug Fixes
-
-* **Errors:**  fixes some instances when errors are missing a final newline ([c4d2b171](https://github.com/kbknapp/clap-rs/commit/c4d2b1711994479ad64ee52b6b49d2ceccbf2118))
-
-
-
-
-<a name="v1.5.2"></a>
-### v1.5.2 (2015-11-14)
-
-
-#### Bug Fixes
-
-* **Errors:**  fixes a compiling bug when built on Windows or without the color feature ([a35f7634](https://github.com/kbknapp/clap-rs/commit/a35f76346fe6ecc88dda6a1eb13627186e7ce185))
-
-
-
-<a name="v1.5.1"></a>
-### v1.5.1 (2015-11-13)
-
-
-#### Bug Fixes
-
-* **Required Args:**  fixes a bug where required args are not correctly accounted for ([f03b88a9](https://github.com/kbknapp/clap-rs/commit/f03b88a9766b331a63879bcd747687f2e5a2661b), closes [#343](https://github.com/kbknapp/clap-rs/issues/343))
-
-
-
-<a name="v1.5.0"></a>
-## v1.5.0 (2015-11-13)
-
-
-#### Bug Fixes
-
-*   fixes a bug with required positional args in usage strings ([c6858f78](https://github.com/kbknapp/clap-rs/commit/c6858f78755f8e860204323c828c8355a066dc83))
-
-#### Documentation
-
-* **FAQ:**  updates readme with slight changes to FAQ ([a4ef0fab](https://github.com/kbknapp/clap-rs/commit/a4ef0fab73c8dc68f1b138965d1340459c113398))
-
-#### Improvements
-
-*   massive errors overhaul ([cdc29175](https://github.com/kbknapp/clap-rs/commit/cdc29175bc9c53e5b4aec86cbc04c1743154dae6))
-* **ArgMatcher:**  huge refactor and deduplication of code ([8988853f](https://github.com/kbknapp/clap-rs/commit/8988853fb8825e8f841fde349834cc12cdbad081))
-* **Errors:**  errors have been vastly improved ([e59bc0c1](https://github.com/kbknapp/clap-rs/commit/e59bc0c16046db156a88ba71a037db05028e995c))
-* **Traits:**  refactoring some configuration into traits ([5800cdec](https://github.com/kbknapp/clap-rs/commit/5800cdec6dce3def4242b9f7bd136308afb19685))
-
-#### Performance
-
-* **App:**
-  *  more BTreeMap->Vec, Opts and SubCmds ([bc4495b3](https://github.com/kbknapp/clap-rs/commit/bc4495b32ec752b6c4b29719e831c043ef2a26ce))
-  *  changes flags BTreeMap->Vec ([d357640f](https://github.com/kbknapp/clap-rs/commit/d357640fab55e5964fe83efc3c771e53aa3222fd))
-  *  removed unneeded BTreeMap ([78971fd6](https://github.com/kbknapp/clap-rs/commit/78971fd68d7dc5c8e6811b4520cdc54e4188f733))
-  *  changes BTreeMap to VecMap in some instances ([64b921d0](https://github.com/kbknapp/clap-rs/commit/64b921d087fdd03775c95ba0bcf65d3f5d36f812))
-  *  removed excess clones ([ec0089d4](https://github.com/kbknapp/clap-rs/commit/ec0089d42ed715d293fb668d3a90b0db0aa3ec39))
-
-
-
-<a name="v1.4.7"></a>
-### v1.4.7 (2015-11-03)
-
-
-#### Documentation
-
-*   Clarify behavior of Arg::multiple with options. ([434f497a](https://github.com/kbknapp/clap-rs/commit/434f497ab6d831f8145cf09278c97ca6ee6c6fe7))
-*   Fix typos and improve grammar. ([c1f66b5d](https://github.com/kbknapp/clap-rs/commit/c1f66b5de7b5269fbf8760a005ef8c645edd3229))
-
-#### Bug Fixes
-
-* **Error Status:**  fixes bug where --help and --version return non-zero exit code ([89b51fdf](https://github.com/kbknapp/clap-rs/commit/89b51fdf8b1ab67607567344e2317ff1a757cb12))
-
-
-
-<a name="v1.4.6"></a>
-### v1.4.6 (2015-10-29)
-
-
-#### Features
-
-*   allows parsing without a binary name for daemons and interactive CLIs ([aff89d57](https://github.com/kbknapp/clap-rs/commit/aff89d579b5b85c3dc81b64f16d5865299ec39a2), closes [#318](https://github.com/kbknapp/clap-rs/issues/318))
-
-#### Bug Fixes
-
-* **Errors:**  tones down quoting in some error messages ([34ce59ed](https://github.com/kbknapp/clap-rs/commit/34ce59ede53bfa2eef722c74881cdba7419fd9c7), closes [#309](https://github.com/kbknapp/clap-rs/issues/309))
-* **Help and Version:**  only builds help and version once ([e3be87cf](https://github.com/kbknapp/clap-rs/commit/e3be87cfc095fc41c9811adcdc6d2b079f237d5e))
-* **Option Args:**  fixes bug with args and multiple values ([c9a9548a](https://github.com/kbknapp/clap-rs/commit/c9a9548a8f96cef8a3dd9a980948325fbbc1b91b), closes [#323](https://github.com/kbknapp/clap-rs/issues/323))
-* **POSIX Overrides:**  fixes bug where required args are overridden ([40ed2b50](https://github.com/kbknapp/clap-rs/commit/40ed2b50c3a9fe88bfdbaa43cef9fd6493ecaa8e))
-* **Safe Matches:**  using 'safe' forms of the get_matches family no longer exit the process ([c47025dc](https://github.com/kbknapp/clap-rs/commit/c47025dca2b3305dea0a0acfdd741b09af0c0d05), closes [#256](https://github.com/kbknapp/clap-rs/issues/256))
-* **Versionless SubCommands:**  fixes a bug where the -V flag was needlessly built ([27df8b9d](https://github.com/kbknapp/clap-rs/commit/27df8b9d98d13709dad3929a009f40ebff089a1a), closes [#329](https://github.com/kbknapp/clap-rs/issues/329))
-
-#### Documentation
-
-*   adds comparison in readme ([1a8bf31e](https://github.com/kbknapp/clap-rs/commit/1a8bf31e7a6b87ce48a66af2cde1645b2dd5bc95), closes [#325](https://github.com/kbknapp/clap-rs/issues/325))
-
-
-
-<a name="v1.4.5"></a>
-### v1.4.5 (2015-10-06)
-
-
-#### Bug Fixes
-
-*   fixes crash on invalid arg error ([c78ce128](https://github.com/kbknapp/clap-rs/commit/c78ce128ebbe7b8f730815f8176c29d76f4ade8c))
-
-
-
-<a name="v1.4.4"></a>
-### v1.4.4 (2015-10-06)
-
-
-#### Documentation
-
-*   clean up some formatting ([b7df92d7](https://github.com/kbknapp/clap-rs/commit/b7df92d7ea25835701dd22ddff984b9749f48a00))
-*   move the crate-level docs to top of the lib.rs file ([d7233bf1](https://github.com/kbknapp/clap-rs/commit/d7233bf122dbf80ba8fc79e5641be2df8af10e7a))
-*   changes doc comments to rustdoc comments ([34b601be](https://github.com/kbknapp/clap-rs/commit/34b601be5fdde76c1a0859385b359b96d66b8732))
-*   fixes panic in 14_groups example ([945b00a0](https://github.com/kbknapp/clap-rs/commit/945b00a0c27714b63bdca48d003fe205fcfdc578), closes [#295](https://github.com/kbknapp/clap-rs/issues/295))
-*   avoid suggesting star dependencies. ([d33228f4](https://github.com/kbknapp/clap-rs/commit/d33228f40b5fefb84cf3dd51546bfb340dcd9f5a))
-* **Rustdoc:**  adds portions of the readme to main rustdoc page ([6f9ee181](https://github.com/kbknapp/clap-rs/commit/6f9ee181e69d90bd4206290e59d6f3f1e8f0cbb2), closes [#293](https://github.com/kbknapp/clap-rs/issues/293))
-
-#### Bug Fixes
-
-*   grammar error in some conflicting option errors ([e73b07e1](https://github.com/kbknapp/clap-rs/commit/e73b07e19474323ad2260da66abbf6a6d4ecbd4f))
-* **Unified Help:**  sorts both flags and options as a unified category ([2a223dad](https://github.com/kbknapp/clap-rs/commit/2a223dad82901fa2e74baad3bfc4c7b94509300f))
-* **Usage:**  fixes a bug where required args aren't filtered properly ([72b453dc](https://github.com/kbknapp/clap-rs/commit/72b453dc170af3050bb123d35364f6da77fc06d7), closes [#277](https://github.com/kbknapp/clap-rs/issues/277))
-* **Usage Strings:**  fixes a bug ordering of elements in usage strings ([aaf0d6fe](https://github.com/kbknapp/clap-rs/commit/aaf0d6fe7aa2403e76096c16204d254a9ee61ee2), closes [#298](https://github.com/kbknapp/clap-rs/issues/298))
-
-#### Features
-
-*   supports -aValue style options ([0e3733e4](https://github.com/kbknapp/clap-rs/commit/0e3733e4fec2015c2d566a51432dcd92cb69cad3))
-* **Trailing VarArg:**  adds opt-in setting for final arg being vararg ([27018b18](https://github.com/kbknapp/clap-rs/commit/27018b1821a4bcd5235cfe92abe71b3c99efc24d), closes [#278](https://github.com/kbknapp/clap-rs/issues/278))
-
-
-
-<a name="v1.4.3"></a>
-### v1.4.3 (2015-09-30)
-
-
-#### Features
-
-*   allows accessing arg values by group name ([c92a4b9e](https://github.com/kbknapp/clap-rs/commit/c92a4b9eff2d679957f61c0c41ff404b40d38a91))
-
-#### Documentation
-
-*   use links to examples instead of plain text ([bb4fe237](https://github.com/kbknapp/clap-rs/commit/bb4fe237858535627271465147add537e4556b43))
-
-#### Bug Fixes
-
-* **Help Message:**  required args no longer double list in usage ([1412e639](https://github.com/kbknapp/clap-rs/commit/1412e639e0a79df84936d1101a837f90077d1c83), closes [#277](https://github.com/kbknapp/clap-rs/issues/277))
-* **Possible Values:**  possible value validation is restored ([f121ae74](https://github.com/kbknapp/clap-rs/commit/f121ae749f8f4bfe754ef2e8a6dfc286504b5b75), closes [#287](https://github.com/kbknapp/clap-rs/issues/287))
-
-
-
-<a name="v1.4.2"></a>
-### v1.4.2 (2015-09-23)
-
-
-#### Bug Fixes
-
-* **Conflicts:**  fixes bug with conflicts not removing required args ([e17fcec5](https://github.com/kbknapp/clap-rs/commit/e17fcec53b3216ad047a13dddc6f740473fad1a1), closes [#271](https://github.com/kbknapp/clap-rs/issues/271))
-
-
-
-<a name="v1.4.1"></a>
-### v1.4.1 (2015-09-22)
-
-
-#### Examples
-
-*   add clap_app quick example ([4ba6249c](https://github.com/kbknapp/clap-rs/commit/4ba6249c3cf4d2e083370d1fe4dcc7025282c28a))
-
-#### Features
-
-* **Unicode:**  allows non-panicing on invalid unicode characters ([c5bf7ddc](https://github.com/kbknapp/clap-rs/commit/c5bf7ddc8cfb876ec928a5aaf5591232bbb32e5d))
-
-#### Documentation
-
-*   properly names Examples section for rustdoc ([87ba5445](https://github.com/kbknapp/clap-rs/commit/87ba54451d7ec7b1c9b9ef134f90bbe39e6fac69))
-*   fixes various typos and spelling ([f85640f9](https://github.com/kbknapp/clap-rs/commit/f85640f9f6d8fd3821a40e9b8b7a34fabb789d02))
-* **Arg:**  unhides fields of the Arg struct ([931aea88](https://github.com/kbknapp/clap-rs/commit/931aea88427edf43a3da90d5a500c1ff2b2c3614))
-
-#### Bug Fixes
-
-*   flush the buffer in App::print_version() ([cbc42a37](https://github.com/kbknapp/clap-rs/commit/cbc42a37d212d84d22b1777d08e584ff191934e7))
-*   Macro benchmarks ([13712da1](https://github.com/kbknapp/clap-rs/commit/13712da1d36dc7614eec3a10ad488257ba615751))
-
-
-
-<a name="v1.4.0"></a>
-## v1.4.0 (2015-09-09)
-
-
-#### Features
-
-*   allows printing help message by library consumers ([56b95f32](https://github.com/kbknapp/clap-rs/commit/56b95f320875c62dda82cb91b29059671e120ed1))
-*   allows defining hidden args and subcmds ([2cab4d03](https://github.com/kbknapp/clap-rs/commit/2cab4d0334ea3c2439a1d4bfca5bf9905c7ea9ac), closes [#231](https://github.com/kbknapp/clap-rs/issues/231))
-*   Builder macro to assist with App/Arg/Group/SubCommand building ([443841b0](https://github.com/kbknapp/clap-rs/commit/443841b012a8d795cd5c2bd69ae6e23ef9b16477))
-* **Errors:**  allows consumers to write to stderr and exit on error ([1e6403b6](https://github.com/kbknapp/clap-rs/commit/1e6403b6a863574fa3cb6946b1fb58f034e8664c))
-
-
-
-<a name="v1.3.2"></a>
-### v1.3.2 (2015-09-08)
-
-
-#### Documentation
-
-*   fixed ErrorKind docs ([dd057843](https://github.com/kbknapp/clap-rs/commit/dd05784327fa070eb6ce5ce89a8507e011d8db94))
-* **ErrorKind:**  changed examples content ([b9ca2616](https://github.com/kbknapp/clap-rs/commit/b9ca261634b89613bbf3d98fd74d55cefbb31a8c))
-
-#### Bug Fixes
-
-*   fixes a bug where the help subcommand wasn't overridable ([94003db4](https://github.com/kbknapp/clap-rs/commit/94003db4b5eebe552ca337521c1c001295822745))
-
-#### Features
-
-*   adds abiltiy not consume self when parsing matches and/or exit on help ([94003db4](https://github.com/kbknapp/clap-rs/commit/94003db4b5eebe552ca337521c1c001295822745))
-* **App:**  Added ability for users to handle errors themselves ([934e6fbb](https://github.com/kbknapp/clap-rs/commit/934e6fbb643b2385efc23444fe6fce31494dc288))
-
-
-
-<a name="v1.3.1"></a>
-### v1.3.1 (2015-09-04)
-
-
-#### Examples
-
-* **17_yaml:**  fixed example ([9b848622](https://github.com/kbknapp/clap-rs/commit/9b848622296c8c5c7b9a39b93ddd41f51df790b5))
-
-#### Performance
-
-*   changes ArgGroup HashSets to Vec ([3cb4a48e](https://github.com/kbknapp/clap-rs/commit/3cb4a48ebd15c20692f4f3a2a924284dc7fd5e10))
-*   changes BTreeSet for Vec in some instances ([baab2e3f](https://github.com/kbknapp/clap-rs/commit/baab2e3f4060e811abee14b1654cbcd5cf3b5fea))
-
-
-
-<a name="v1.3.0"></a>
-## v1.3.0 (2015-09-01)
-
-
-#### Features
-
-* **YAML:**  allows building a CLI from YAML files ([86cf4c45](https://github.com/kbknapp/clap-rs/commit/86cf4c45626a36b8115446952f9069f73c1debc3))
-* **ArgGroups:**  adds support for building ArgGroups from yaml ([ecf88665](https://github.com/kbknapp/clap-rs/commit/ecf88665cbff367018b29161a1b75d44a212707d))
-* **Subcommands:**  adds support for subcommands from yaml ([e415cf78](https://github.com/kbknapp/clap-rs/commit/e415cf78ba916052d118a8648deba2b9c16b1530))
-
-#### Documentation
-
-* **YAML:**  adds examples for using YAML to build a CLI ([ab41d7f3](https://github.com/kbknapp/clap-rs/commit/ab41d7f38219544750e6e1426076dc498073191b))
-* **Args from YAML:**  fixes doc examples ([19b348a1](https://github.com/kbknapp/clap-rs/commit/19b348a10050404cd93888dbbbe4f396681b67d0))
-* **Examples:**  adds better usage examples instead of having unused variables ([8cbacd88](https://github.com/kbknapp/clap-rs/commit/8cbacd8883004fe71a8ea036ec4391c7dd8efe94))
-
-#### Examples
-
-*   Add AppSettings example ([12705079](https://github.com/kbknapp/clap-rs/commit/12705079ca96a709b4dd94f7ddd20a833b26838c))
-
-#### Bug Fixes
-
-* **Unified Help Messages:**  fixes a crash from this setting and no opts ([169ffec1](https://github.com/kbknapp/clap-rs/commit/169ffec1003d58d105d7ef2585b3425e57980000), closes [#210](https://github.com/kbknapp/clap-rs/issues/210))
-
-
-
-<a name="v1.2.5"></a>
-### v1.2.5 (2015-08-27)
-
-
-#### Examples
-
-*   add custom validator example ([b9997d1f](https://github.com/kbknapp/clap-rs/commit/b9997d1fca74d4d8f93971f2a01bdf9798f913d5))
-*   fix indentation ([d4f1b740](https://github.com/kbknapp/clap-rs/commit/d4f1b740ede410fd2528b9ecd89592c2fd8b1e20))
-
-#### Features
-
-* **Args:**  allows opts and args to define a name for help and usage msgs ([ad962ec4](https://github.com/kbknapp/clap-rs/commit/ad962ec478da999c7dba0afdb84c266f4d09b1bd))
-
-
-
-<a name="v1.2.4"></a>
-### v1.2.4 (2015-08-26)
-
-
-#### Bug Fixes
-
-* **Possible Values:**  fixes a bug where suggestions arent made when using --long=value format ([3d5e9a6c](https://github.com/kbknapp/clap-rs/commit/3d5e9a6cedb26668839b481c9978e2fbbab8be6f), closes [#192](https://github.com/kbknapp/clap-rs/issues/192))
-
-
-
-<a name="v1.2.3"></a>
-### v1.2.3 (2015-08-24)
-
-
-#### Bug Fixes
-
-* **App, Args:**  fixed subcommand reqs negation ([b41afa8c](https://github.com/kbknapp/clap-rs/commit/b41afa8c3ded3d1be12f7a2f8ea06cc44afc9458), closes [#188](https://github.com/kbknapp/clap-rs/issues/188))
-
-
-
-<a name="v1.2.2"></a>
-### v1.2.2 (2015-08-23)
-
-
-#### Bug Fixes
-
-*   fixed confusing error message, also added test for it ([fc7a31a7](https://github.com/kbknapp/clap-rs/commit/fc7a31a745efbf1768ee2c62cd3bb72bfe30c708))
-* **App:**  fixed requirmets overriding ([9c135eb7](https://github.com/kbknapp/clap-rs/commit/9c135eb790fa16183e5bdb2009ddc3cf9e25f99f))
-
-
-
-<a name="v1.2.1"></a>
-### v1.2.1 (2015-08-20)
-
-
-#### Documentation
-
-* **README.md:**  updates for new features ([16cf9245](https://github.com/kbknapp/clap-rs/commit/16cf9245fb5fc4cf6face898e358368bf9961cbb))
-
-#### Features
-
-*   implements posix compatible conflicts for long args ([8c2d48ac](https://github.com/kbknapp/clap-rs/commit/8c2d48acf5473feebd721a9049a9c9b7051e70f9))
-*   added overrides to support conflicts in POSIX compatible manner ([0b916a00](https://github.com/kbknapp/clap-rs/commit/0b916a00de26f6941538f6bc5f3365fa302083c1))
-* **Args:**  allows defining POSIX compatible argument conflicts ([d715646e](https://github.com/kbknapp/clap-rs/commit/d715646e69759ccd95e01f49b04f489827ecf502))
-
-#### Bug Fixes
-
-*   fixed links in cargo and license buttons ([6d9837ad](https://github.com/kbknapp/clap-rs/commit/6d9837ad9a9e006117cd7372fdc60f9a3889c7e2))
-
-#### Performance
-
-* **Args and Apps:**  changes HashSet->Vec in some instances for increased performance ([d0c3b379](https://github.com/kbknapp/clap-rs/commit/d0c3b379700757e0a9b0c40af709f8af1f5b4949))
-
-
-
-<a name="v1.2.0"></a>
-### v1.2.0 (2015-08-15)
-
-
-#### Bug Fixes
-
-*   fixed misspell and enum name ([7df170d7](https://github.com/kbknapp/clap-rs/commit/7df170d7f4ecff06608317655d1e0c4298f62076))
-*   fixed use for clap crate ([dc3ada73](https://github.com/kbknapp/clap-rs/commit/dc3ada738667d4b689678f79d14251ee82004ece))
-
-#### Documentation
-
-*   updates docs for new features ([03496547](https://github.com/kbknapp/clap-rs/commit/034965471782d872ca495045b58d34b31807c5b1))
-*   fixed docs for previous changes ([ade36778](https://github.com/kbknapp/clap-rs/commit/ade367780c366425de462506d256e0f554ed3b9c))
-
-#### Improvements
-
-* **AppSettings:**  adds ability to add multiple settings at once ([4a00e251](https://github.com/kbknapp/clap-rs/commit/4a00e2510d0ca8d095d5257d51691ba3b61c1374))
-
-#### Features
-
-*   Replace application level settings with enum variants ([618dc4e2](https://github.com/kbknapp/clap-rs/commit/618dc4e2c205bf26bc43146164e65eb1f6b920ed))
-* **Args:**  allows for custom argument value validations to be defined ([84ae2ddb](https://github.com/kbknapp/clap-rs/commit/84ae2ddbceda34b5cbda98a6959edaa52fde2e1a), closes [#170](https://github.com/kbknapp/clap-rs/issues/170))
-
-
-
-<a name="v1.1.6"></a>
-### v1.1.6 (2015-08-01)
-
-
-#### Bug Fixes
-
-*   fixes two bugs in App when printing newlines in help and subcommands required error ([d63c0136](https://github.com/kbknapp/clap-rs/commit/d63c0136310db9dd2b1c7b4745938311601d8938))
-
-
-
-<a name="v1.1.5"></a>
-### v1.1.5 (2015-07-29)
-
-#### Performance
-
-*   removes some unneeded allocations ([93e915df](https://github.com/kbknapp/clap-rs/commit/93e915dfe300f7b7d6209ca93323c6a46f89a8c1))
-
-<a name="v1.1.4"></a>
-### v1.1.4 (2015-07-20)
-
-
-#### Improvements
-
-* **Usage Strings**  displays a [--] when it may be helpful ([86c3be85](https://github.com/kbknapp/clap-rs/commit/86c3be85fb6f77f83b5a6d2df40ae60937486984))
-
-#### Bug Fixes
-
-* **Macros**  fixes a typo in a macro generated error message ([c9195c5f](https://github.com/kbknapp/clap-rs/commit/c9195c5f92abb8cd6a37b4f4fbb2f1fee2a8e368))
-* **Type Errors**  fixes formatting of error output when failed type parsing ([fe5d95c6](https://github.com/kbknapp/clap-rs/commit/fe5d95c64f3296e6eddcbec0cb8b86659800145f))
-
-
-
-<a name="v1.1.3"></a>
-### v1.1.3 (2015-07-18)
-
-
-#### Documentation
-
-*   updates README.md to include lack of color support on Windows ([52f81e17](https://github.com/kbknapp/clap-rs/commit/52f81e17377b18d2bd0f34693b642b7f358998ee))
-
-#### Bug Fixes
-
-*   fixes formatting bug which prevented compiling on windows ([9cb5dceb](https://github.com/kbknapp/clap-rs/commit/9cb5dceb3e5fe5e0e7b24619ff77e5040672b723), closes [#163](https://github.com/kbknapp/clap-rs/issues/163))
-
-
-
-<a name="v1.1.2"></a>
-### v1.1.2 (2015-07-17)
-
-
-#### Bug Fixes
-
-*   fixes a bug when parsing multiple {n} newlines inside help strings ([6d214b54](https://github.com/kbknapp/clap-rs/commit/6d214b549a9b7e189a94e5fa2b7c92cc333ca637))
-
-
-
-<a name="v1.1.1"></a>
-## v1.1.1 (2015-07-17)
-
-
-#### Bug Fixes
-
-*   fixes a logic bug and allows setting Arg::number_of_values() < 2 ([42b6d1fc](https://github.com/kbknapp/clap-rs/commit/42b6d1fc3c519c92dfb3af15276e7d3b635e6cfe), closes [#161](https://github.com/kbknapp/clap-rs/issues/161))
-
-
-
-<a name="v1.1.0"></a>
-## v1.1.0 (2015-07-16)
-
-
-#### Features
-
-*   allows creating unified help messages, a la docopt or getopts ([52bcd892](https://github.com/kbknapp/clap-rs/commit/52bcd892ea51564ce463bc5865acd64f8fe91cb1), closes [#158](https://github.com/kbknapp/clap-rs/issues/158))
-*   allows stating all subcommands should *not* have --version flags ([336c476f](https://github.com/kbknapp/clap-rs/commit/336c476f631d512b54ac56fdca6f29ebdc2c00c5), closes [#156](https://github.com/kbknapp/clap-rs/issues/156))
-*   allows setting version number to auto-propagate through subcommands ([bc66d3c6](https://github.com/kbknapp/clap-rs/commit/bc66d3c6deedeca62463fff95369ab1cfcdd366b), closes [#157](https://github.com/kbknapp/clap-rs/issues/157))
-
-#### Improvements
-
-* **Help Strings**  properly aligns and handles newlines in long help strings ([f9800a29](https://github.com/kbknapp/clap-rs/commit/f9800a29696dd2cc0b0284bf693b3011831e556f), closes [#145](https://github.com/kbknapp/clap-rs/issues/145))
-
-
-#### Performance
-
-* **Help Messages**  big performance improvements when printing help messages ([52bcd892](https://github.com/kbknapp/clap-rs/commit/52bcd892ea51564ce463bc5865acd64f8fe91cb1))
-
-#### Documentation
-
-*   updates readme with new features ([8232f7bb](https://github.com/kbknapp/clap-rs/commit/8232f7bb52e88862bc13c3d4f99ee4f56cfe4bc0))
-*   fix incorrect code example for `App::subcommand_required` ([8889689d](https://github.com/kbknapp/clap-rs/commit/8889689dc6336ccc45b2c9f2cf8e2e483a639e93))
-
-
-<a name="v1.0.3"></a>
-### v1.0.3 (2015-07-11)
-
-
-#### Improvements
-
-* **Errors**  writes errors to stderr ([cc76ab8c](https://github.com/kbknapp/clap-rs/commit/cc76ab8c2b77c67b42f4717ded530df7806142cf), closes [#154](https://github.com/kbknapp/clap-rs/issues/154))
-
-#### Documentation
-
-* **README.md**  updates example help message to new format ([0aca29bd](https://github.com/kbknapp/clap-rs/commit/0aca29bd5d6d1a4e9971bdc88d946ffa58606efa))
-
-
-
-<a name="v1.0.2"></a>
-### v1.0.2 (2015-07-09)
-
-
-#### Improvements
-
-* **Usage**  re-orders optional arguments and required to natural standard ([dc7e1fce](https://github.com/kbknapp/clap-rs/commit/dc7e1fcea5c85d317018fb201d2a9262249131b4), closes [#147](https://github.com/kbknapp/clap-rs/issues/147))
-
-
-
-<a name="v1.0.1"></a>
-### v1.0.1 (2015-07-08)
-
-
-#### Bug Fixes
-
-*   allows empty values when using --long='' syntax ([083f82d3](https://github.com/kbknapp/clap-rs/commit/083f82d333b69720a6ef30074875310921d964d1), closes [#151](https://github.com/kbknapp/clap-rs/issues/151))
-
-
-
-<a name="v1.0.0"></a>
-## v1.0.0 (2015-07-08)
-
-
-#### Documentation
-
-* **README.md**  adds new features to what's new list ([938f7f01](https://github.com/kbknapp/clap-rs/commit/938f7f01340f521969376cf4e2e3d9436bca21f7))
-* **README.md**  use with_name for subcommands ([28b7e316](https://github.com/kbknapp/clap-rs/commit/28b7e3161fb772e5309042648fe8c3a420645bac))
-
-#### Features
-
-*   args can now be parsed from arbitrary locations, not just std::env::args() ([75312528](https://github.com/kbknapp/clap-rs/commit/753125282b1b9bfff875f1557ce27610edcc59e1))
-
-
-
-<a name="v1.0.0"></a>
-## v1.0.0-beta (2015-06-30)
-
-
-#### Features
-
-*   allows waiting for user input on error ([d0da3bdd](https://github.com/kbknapp/clap-rs/commit/d0da3bdd9d1871541907ea9c645322a74d260e07), closes [#140](https://github.com/kbknapp/clap-rs/issues/140))
-* **Help**  allows one to fully override the auto-generated help message ([26d5ae3e](https://github.com/kbknapp/clap-rs/commit/26d5ae3e330d1e150811d5b60b2b01a8f8df854e), closes [#141](https://github.com/kbknapp/clap-rs/issues/141))
-
-#### Documentation
-
-*   adds "whats new" section to readme ([ff149a29](https://github.com/kbknapp/clap-rs/commit/ff149a29dd9e179865e6d577cd7dc87c54f8f95c))
-
-#### Improvements
-
-*   removes deprecated functions in prep for 1.0 ([274484df](https://github.com/kbknapp/clap-rs/commit/274484dfd08fff4859cefd7e9bef3b73d3a9cb5f))
-
-
-
-<a name="v0.11.0"></a>
-## v0.11.0 (2015-06-17) - BREAKING CHANGE
-
-
-#### Documentation
-
-*   updates docs to new version flag defaults ([ebf442eb](https://github.com/kbknapp/clap-rs/commit/ebf442ebebbcd2ec6bfe2c06566c9d362bccb112))
-
-#### Features
-
-* **Help and Version**  default short for version is now `-V` but can be overridden (only breaks manual documentation) (**BREAKING CHANGE** [eb1d9320](https://github.com/kbknapp/clap-rs/commit/eb1d9320c509c1e4e57d7c7959da82bcfe06ada0))
-
-
-
-<a name="v0.10.5"></a>
-### v0.10.5 (2015-06-06)
-
-
-#### Bug Fixes
-
-* **Global Args**  global arguments propogate fully now ([1f377960](https://github.com/kbknapp/clap-rs/commit/1f377960a48c82f54ca5f39eb56bcb393140b046), closes [#137](https://github.com/kbknapp/clap-rs/issues/137))
-
-
-
-<a name="v0.10.4"></a>
-### v0.10.4 (2015-06-06)
-
-
-#### Bug Fixes
-
-* **Global Args**  global arguments propogate fully now ([8f2c0160](https://github.com/kbknapp/clap-rs/commit/8f2c0160c8d844daef375a33dbaec7d89de00a00), closes [#137](https://github.com/kbknapp/clap-rs/issues/137))
-
-
-
-<a name="v0.10.3"></a>
-### v0.10.3 (2015-05-31)
-
-
-#### Bug Fixes
-
-* **Global Args**  fixes a bug where globals only transfer to one subcommand ([a37842ee](https://github.com/kbknapp/clap-rs/commit/a37842eec1ee3162b86fdbda23420b221cdb1e3b), closes [#135](https://github.com/kbknapp/clap-rs/issues/135))
-
-
-
-<a name="v0.10.2"></a>
-### v0.10.2 (2015-05-30)
-
-
-#### Improvements
-
-* **Binary Names**  allows users to override the system determined bin name ([2191fe94](https://github.com/kbknapp/clap-rs/commit/2191fe94bda35771383b52872fb7f5421b178be1), closes [#134](https://github.com/kbknapp/clap-rs/issues/134))
-
-#### Documentation
-
-*   adds contributing guidelines ([6f76bd0a](https://github.com/kbknapp/clap-rs/commit/6f76bd0a07e8b7419b391243ab2d6687cd8a9c5f))
-
-
-
-<a name="v0.10.1"></a>
-### v0.10.1 (2015-05-26)
-
-
-#### Features
-
-*   can now specify that an app or subcommand should display help on no args or subcommands ([29ca7b2f](https://github.com/kbknapp/clap-rs/commit/29ca7b2f74376ca0cdb9d8ee3bfa99f7640cc404), closes [#133](https://github.com/kbknapp/clap-rs/issues/133))
-
-
-
-<a name="v0.10.0"></a>
-## v0.10.0 (2015-05-23)
-
-
-#### Features
-
-* **Global Args**  allows args that propagate down to child commands ([2bcc6137](https://github.com/kbknapp/clap-rs/commit/2bcc6137a83cb07757771a0afea953e68e692f0b), closes [#131](https://github.com/kbknapp/clap-rs/issues/131))
-
-#### Improvements
-
-* **Colors**  implements more structured colored output ([d6c3ed54](https://github.com/kbknapp/clap-rs/commit/d6c3ed54d21cf7b40d9f130d4280ff5448522fc5), closes [#129](https://github.com/kbknapp/clap-rs/issues/129))
-
-#### Deprecations
-
-* **SubCommand/App**  several methods and functions for stable release ([28b73855](https://github.com/kbknapp/clap-rs/commit/28b73855523ad170544afdb20665db98702fbe70))
-
-#### Documentation
-
-*   updates for deprecations and new features ([743eefe8](https://github.com/kbknapp/clap-rs/commit/743eefe8dd40c1260065ce086d572e9e9358bc4c))
-
-
-
-<a name="v0.9.2"></a>
-## v0.9.2 (2015-05-20)
-
-
-#### Bug Fixes
-
-* **help**  allows parent requirements to be ignored with help and version ([52218cc1](https://github.com/kbknapp/clap-rs/commit/52218cc1fdb06a42456c964d98cc2c7ac3432412), closes [#124](https://github.com/kbknapp/clap-rs/issues/124))
-
-
-
-<a name="v0.9.1"></a>
-## v0.9.1 (2015-05-18)
-
-
-#### Bug Fixes
-
-* **help**  fixes a bug where requirements are included as program name in help and version ([08ba3f25](https://github.com/kbknapp/clap-rs/commit/08ba3f25cf38b149229ba8b9cb37a5804fe6b789))
-
-
-
-<a name="v0.9.0"></a>
-## v0.9.0 (2015-05-17)
-
-
-#### Improvements
-
-* **usage**  usage strings now include parent command requirements ([dd8f21c7](https://github.com/kbknapp/clap-rs/commit/dd8f21c7c15cde348fdcf44fa7c205f0e98d2e4a), closes [#125](https://github.com/kbknapp/clap-rs/issues/125))
-* **args**  allows consumer of clap to decide if empty values are allowed or not ([ab4ec609](https://github.com/kbknapp/clap-rs/commit/ab4ec609ccf692b9b72cccef5c9f74f5577e360d), closes [#122](https://github.com/kbknapp/clap-rs/issues/122))
-
-#### Features
-
-* **subcommands**
-  *  allows optionally specifying that no subcommand is an error ([7554f238](https://github.com/kbknapp/clap-rs/commit/7554f238fd3afdd60b7e4dcf00ff4a9eccf842c1), closes [#126](https://github.com/kbknapp/clap-rs/issues/126))
-  *  subcommands can optionally negate parent requirements ([4a4229f5](https://github.com/kbknapp/clap-rs/commit/4a4229f500e21c350e1ef78dd09ef27559653288), closes [#123](https://github.com/kbknapp/clap-rs/issues/123))
-
-
-
-<a name="v0.8.6"></a>
-## v0.8.6 (2015-05-17)
-
-
-#### Bug Fixes
-
-* **args**  `-` can now be parsed as a value for an argument ([bc12e78e](https://github.com/kbknapp/clap-rs/commit/bc12e78eadd7eaf9d008a8469fdd2dfd7990cb5d), closes [#121](https://github.com/kbknapp/clap-rs/issues/121))
-
-
-
-<a name="v0.8.5"></a>
-## v0.8.5 (2015-05-15)
-
-
-#### Bug Fixes
-
-* **macros**  makes macro errors consistent with others ([0c264a8c](https://github.com/kbknapp/clap-rs/commit/0c264a8ca57ec1cfdcb74dae79145d766cdc9b97), closes [#118](https://github.com/kbknapp/clap-rs/issues/118))
-
-#### Features
-
-* **macros**
-  *  arg_enum! and simple_enum! provide a Vec<&str> of variant names ([30fa87ba](https://github.com/kbknapp/clap-rs/commit/30fa87ba4e0f3189351d8f4f78b72e616a30d0bd), closes [#119](https://github.com/kbknapp/clap-rs/issues/119))
-  *  arg_enum! and simple_enum! auto-implement Display ([d1219f0d](https://github.com/kbknapp/clap-rs/commit/d1219f0d1371d872061bd0718057eca4ef47b739), closes [#120](https://github.com/kbknapp/clap-rs/issues/120))
-
-
-
-<a name="v0.8.4"></a>
-## v0.8.4 (2015-05-12)
-
-
-#### Bug Fixes
-
-* **suggestions**  --help and --version now get suggestions ([d2b3b1fa](https://github.com/kbknapp/clap-rs/commit/d2b3b1faa0bdc1c5d2350cc4635aba81e02e9d96), closes [#116](https://github.com/kbknapp/clap-rs/issues/116))
-
-
-
-<a name="v0.8.3"></a>
-## v0.8.3 (2015-05-10)
-
-
-#### Bug Fixes
-
-* **usage**  groups unfold their members in usage strings ([55d15582](https://github.com/kbknapp/clap-rs/commit/55d155827ea4a6b077a83669701e797ce1ad68f4), closes [#114](https://github.com/kbknapp/clap-rs/issues/114))
-
-#### Performance
-
-* **usage**  removes unneeded allocations ([fd53cd18](https://github.com/kbknapp/clap-rs/commit/fd53cd188555f5c3dc8bc341c5d7eb04b761a70f))
-
-
-
-<a name="v0.8.2"></a>
-## v0.8.2 (2015-05-08)
-
-
-#### Bug Fixes
-
-* **usage strings**  positional arguments are presented in index order ([eb0e374e](https://github.com/kbknapp/clap-rs/commit/eb0e374ecf952f1eefbc73113f21e0705936e40b), closes [#112](https://github.com/kbknapp/clap-rs/issues/112))
-
-
-
-<a name="v0.8.1"></a>
-## v0.8.1 (2015-05-06)
-
-
-#### Bug Fixes
-
-* **subcommands**  stops parsing multiple values when subcommands are found ([fc79017e](https://github.com/kbknapp/clap-rs/commit/fc79017eced04fd41cc1801331e5054df41fac17), closes [#109](https://github.com/kbknapp/clap-rs/issues/109))
-
-#### Improvements
-
-* **color**  reduces color in error messages ([aab44cca](https://github.com/kbknapp/clap-rs/commit/aab44cca6352f47e280c296e50c535f5d752dd46), closes [#110](https://github.com/kbknapp/clap-rs/issues/110))
-* **suggestions**  adds suggested arguments to usage strings ([99447414](https://github.com/kbknapp/clap-rs/commit/994474146e9fb8b701af773a52da71553d74d4b7))
-
-
-
-<a name="v0.8.0"></a>
-## v0.8.0 (2015-05-06)
-
-
-#### Bug Fixes
-
-* **did-you-mean**  for review ([0535cfb0](https://github.com/kbknapp/clap-rs/commit/0535cfb0c711331568b4de8080eeef80bd254b68))
-* **Positional**  positionals were ignored if they matched a subcmd, even after '--' ([90e7b081](https://github.com/kbknapp/clap-rs/commit/90e7b0818741668b47cbe3becd029bab588e3553))
-* **help**  fixes bug where space between arg and help is too long ([632fb115](https://github.com/kbknapp/clap-rs/commit/632fb11514c504999ea86bdce47cdd34f8ebf646))
-
-#### Features
-
-* **from_usage**  adds ability to add value names or num of vals in usage string ([3d581976](https://github.com/kbknapp/clap-rs/commit/3d58197674ed7886ca315efb76e411608a327501), closes [#98](https://github.com/kbknapp/clap-rs/issues/98))
-* **did-you-mean**
-  *  gate it behind 'suggestions' ([c0e38351](https://github.com/kbknapp/clap-rs/commit/c0e383515d01bdd5ca459af9c2f7e2cf49e2488b))
-  *  for possible values ([1cc2deb2](https://github.com/kbknapp/clap-rs/commit/1cc2deb29158e0e4e8b434e4ce26b3d819301a7d))
-  *  for long flags (i.e. --long) ([52a0b850](https://github.com/kbknapp/clap-rs/commit/52a0b8505c99354bdf5fd1cd256cf41197ac2d81))
-  *  for subcommands ([06e869b5](https://github.com/kbknapp/clap-rs/commit/06e869b5180258047ed3c60ba099de818dd25fff))
-* **Flags**  adds sugestions functionality ([8745071c](https://github.com/kbknapp/clap-rs/commit/8745071c3257dd327c497013516f12a823df9530))
-* **errors**  colorizes output red on error ([f8b26b13](https://github.com/kbknapp/clap-rs/commit/f8b26b13da82ba3ba9a932d3d1ab4ea45d1ab036))
-
-#### Improvements
-
-* **arg_enum**  allows ascii case insensitivity for enum variants ([b249f965](https://github.com/kbknapp/clap-rs/commit/b249f9657c6921c004764bd80d13ebca81585eec), closes [#104](https://github.com/kbknapp/clap-rs/issues/104))
-* **clap-test**  simplified `make test` invocation ([d17dcb29](https://github.com/kbknapp/clap-rs/commit/d17dcb2920637a1f58c61c596b7bd362fd53047c))
-
-#### Documentation
-
-* **README**  adds details about optional and new features ([960389de](https://github.com/kbknapp/clap-rs/commit/960389de02c9872aaee9adabe86987f71f986e39))
-* **clap**  fix typos caught by codespell ([8891d929](https://github.com/kbknapp/clap-rs/commit/8891d92917aa1a069cca67272be41b99e548356e))
-* **from_usage**  explains new usage strings with multiple values ([05476fc6](https://github.com/kbknapp/clap-rs/commit/05476fc61cd1e5f4a4e750d258c878732a3a9c64))
-
-
-
-<a name="v0.7.6"></a>
-## v0.7.6 (2015-05-05)
-
-
-#### Improvements
-
-* **Options**  adds number of values to options in help/usage ([c1c993c4](https://github.com/kbknapp/clap-rs/commit/c1c993c419d18e35c443785053d8de9a2ef88073))
-
-#### Features
-
-* **from_usage**  adds ability to add value names or num of vals in usage string ([ad55748c](https://github.com/kbknapp/clap-rs/commit/ad55748c265cf27935c7b210307d2040b6a09125), closes [#98](https://github.com/kbknapp/clap-rs/issues/98))
-
-#### Bug Fixes
-
-* **MultipleValues**  properly distinguishes between multiple values and multiple occurrences ([dd2a7564](https://github.com/kbknapp/clap-rs/commit/dd2a75640ca68a91b973faad15f04df891356cef), closes [#99](https://github.com/kbknapp/clap-rs/issues/99))
-* **help**  fixes tab alignment with multiple values ([847001ff](https://github.com/kbknapp/clap-rs/commit/847001ff6d8f4d9518e810fefb8edf746dd0f31e))
-
-#### Documentation
-
-* **from_usage**  explains new usage strings with multiple values ([5a3a42df](https://github.com/kbknapp/clap-rs/commit/5a3a42dfa3a783537f88dedc0fd5f0edcb8ea372))
-
-
-
-<a name="v0.7.5"></a>
-## v0.7.5 (2015-05-04)
-
-
-#### Bug Fixes
-
-* **Options**  fixes bug where options with no value don't error out ([a1fb94be](https://github.com/kbknapp/clap-rs/commit/a1fb94be53141572ffd97aad037295d4ffec82d0))
-
-
-
-<a name="v0.7.4"></a>
-## v0.7.4 (2015-05-03)
-
-
-#### Bug Fixes
-
-* **Options**  fixes a bug where option arguments in succession get their values skipped ([f66334d0](https://github.com/kbknapp/clap-rs/commit/f66334d0ce984e2b56e5c19abb1dd536fae9342a))
-
-
-
-<a name="v0.7.3"></a>
-## v0.7.3 (2015-05-03)
-
-
-#### Bug Fixes
-
-* **RequiredValues**  fixes a bug where missing values are parsed as missing arguments ([93c4a723](https://github.com/kbknapp/clap-rs/commit/93c4a7231ba1a08152648598f7aa4503ea82e4de))
-
-#### Improvements
-
-* **ErrorMessages**  improves error messages and corrections ([a29c3983](https://github.com/kbknapp/clap-rs/commit/a29c3983c4229906655a29146ec15a0e46dd942d))
-* **ArgGroups**  improves requirement and confliction support for groups ([c236dc5f](https://github.com/kbknapp/clap-rs/commit/c236dc5ff475110d2a1b80e62903f80296163ad3))
-
-
-
-<a name="v0.7.2"></a>
-## v0.7.2 (2015-05-03)
-
-
-#### Bug Fixes
-
-* **RequiredArgs**  fixes bug where required-by-default arguments are not listed in usage ([12aea961](https://github.com/kbknapp/clap-rs/commit/12aea9612d290845ba86515c240aeeb0a21198db), closes [#96](https://github.com/kbknapp/clap-rs/issues/96))
-
-
-
-<a name="v0.7.1"></a>
-## v0.7.1 (2015-05-01)
-
-
-#### Bug Fixes
-
-* **MultipleValues**  stops evaluating values if the max or exact number of values was reached ([86d92c9f](https://github.com/kbknapp/clap-rs/commit/86d92c9fdbf9f422442e9562977bbaf268dbbae1))
-
-
-
-<a name="v0.7.0"></a>
-## v0.7.0 (2015-04-30) - BREAKING CHANGE
-
-
-#### Bug Fixes
-
-* **from_usage**  removes bug where usage strings have no help text ([ad4e5451](https://github.com/kbknapp/clap-rs/commit/ad4e54510739aeabf75f0da3278fb0952db531b3), closes [#83](https://github.com/kbknapp/clap-rs/issues/83))
-
-#### Features
-
-* **MultipleValues**
-  *  add support for minimum and maximum number of values ([53f6b8c9](https://github.com/kbknapp/clap-rs/commit/53f6b8c9d8dc408b4fa9f833fc3a63683873c42f))
-  *  adds support limited number and named values ([ae09f05e](https://github.com/kbknapp/clap-rs/commit/ae09f05e92251c1b39a83d372736fcc7b504e432))
-  *  implement shorthand for options with multiple values ([6669f0a9](https://github.com/kbknapp/clap-rs/commit/6669f0a9687d4f668523145d7bd5c007d1eb59a8))
-* **arg**  allow other types besides Vec for multiple value settings (**BREAKING CHANGE** [0cc2f698](https://github.com/kbknapp/clap-rs/commit/0cc2f69839b9b1db5d06330771b494783049a88e), closes [#87](https://github.com/kbknapp/clap-rs/issues/87))
-* **usage**  implement smart usage strings on errors ([d77048ef](https://github.com/kbknapp/clap-rs/commit/d77048efb1e595ffe831f1a2bea2f2700db53b9f), closes [#88](https://github.com/kbknapp/clap-rs/issues/88))
-
-
-
-<a name="v0.6.9"></a>
-## v0.6.9 (2015-04-29)
-
-
-#### Bug Fixes
-
-* **from_usage**  removes bug where usage strings have no help text ([ad4e5451](https://github.com/kbknapp/clap-rs/commit/ad4e54510739aeabf75f0da3278fb0952db531b3), closes [#83](https://github.com/kbknapp/clap-rs/issues/83))
-
-
-
-<a name="0.6.8"></a>
-## 0.6.8 (2015-04-27)
-
-
-#### Bug Fixes
-
-* **help**  change long help --long=long -> --long <long> ([1e25abfc](https://github.com/kbknapp/clap-rs/commit/1e25abfc36679ab89eae71bf98ced4de81992d00))
-* **RequiredArgs**  required by default args should no longer be required when their exclusions are present ([4bb4c3cc](https://github.com/kbknapp/clap-rs/commit/4bb4c3cc076b49e86720e882bf8c489877199f2d))
-
-#### Features
-
-* **ArgGroups**  add ability to create arg groups ([09eb4d98](https://github.com/kbknapp/clap-rs/commit/09eb4d9893af40c347e50e2b717e1adef552357d))
-
-
-
-<a name="v0.6.7"></a>
-## v0.6.7 (2015-04-22)
-
-
-#### Bug Fixes
-
-* **from_usage**  fix bug causing args to not be required ([b76129e9](https://github.com/kbknapp/clap-rs/commit/b76129e9b71a63365d5c77a7f57b58dbd1e94d49))
-
-#### Features
-
-* **apps**  add ability to display additional help info after auto-gen'ed help msg ([65cc259e](https://github.com/kbknapp/clap-rs/commit/65cc259e4559cbe3653c865ec0c4b1e42a389b07))
-
-
-
-<a name="v0.6.6"></a>
-## v0.6.6 (2015-04-19)
-
-
-#### Bug Fixes
-
-* **from_usage**  tabs and spaces should be treated equally ([4fd44181](https://github.com/kbknapp/clap-rs/commit/4fd44181d55d8eb88caab1e625231cfa3129e347))
-
-#### Features
-
-* **macros.rs**  add macro to get version from Cargo.toml ([c630969a](https://github.com/kbknapp/clap-rs/commit/c630969aa3bbd386379219cae27ba1305b117f3e))
-
-
-
-<a name="v0.6.5"></a>
-## v0.6.5 (2015-04-19)
-
-
-#### Bug Fixes
-
-* **macros.rs**  fix use statements for trait impls ([86e4075e](https://github.com/kbknapp/clap-rs/commit/86e4075eb111937c8a7bdb344e866e350429f042))
-
-
-
-<a name="v0.6.4"></a>
-## v0.6.4 (2015-04-17)
-
-
-#### Features
-
-* **macros**  add ability to create enums pub or priv with derives ([2c499f80](https://github.com/kbknapp/clap-rs/commit/2c499f8015a199827cdf1fa3ec4f6f171722f8c7))
-
-
-
-<a name="v0.6.3"></a>
-## v0.6.3 (2015-04-16)
-
-
-#### Features
-
-* **macros**  add macro to create custom enums to use as types ([fb672aff](https://github.com/kbknapp/clap-rs/commit/fb672aff561c29db2e343d6c607138f141aca8b6))
-
-
-
-<a name="v0.6.2"></a>
-## v0.6.2 (2015-04-14)
-
-
-#### Features
-
-* **macros**
-  *  add ability to get multiple typed values or exit ([0b87251f](https://github.com/kbknapp/clap-rs/commit/0b87251fc088234bee51c323c2b652d7254f7a59))
-  *  add ability to get a typed multiple values ([e243fe38](https://github.com/kbknapp/clap-rs/commit/e243fe38ddbbf845a46c0b9baebaac3778c80927))
-  *  add convenience macro to get a typed value or exit ([4b7cd3ea](https://github.com/kbknapp/clap-rs/commit/4b7cd3ea4947780d9daa39f3e1ddab53ad4c7fef))
-  *  add convenience macro to get a typed value ([8752700f](https://github.com/kbknapp/clap-rs/commit/8752700fbb30e89ee68adbce24489ae9a24d33a9))
-
-
-
-<a name="v0.6.1"></a>
-## v0.6.1 (2015-04-13)
-
-
-#### Bug Fixes
-
-* **from_usage**  trim all whitespace before parsing ([91d29045](https://github.com/kbknapp/clap-rs/commit/91d2904599bd602deef2e515dfc65dc2863bdea0))
-
-
-
-<a name="v0.6.0"></a>
-## v0.6.0 (2015-04-13)
-
-
-#### Bug Fixes
-
-* **tests**  fix failing doc tests ([3710cd69](https://github.com/kbknapp/clap-rs/commit/3710cd69162f87221a62464f63437c1ce843ad3c))
-
-#### Features
-
-* **app**  add support for building args from usage strings ([d5d48bcf](https://github.com/kbknapp/clap-rs/commit/d5d48bcf463a4e494ef758836bd69a4c220bbbb5))
-* **args**  add ability to create basic arguments from a usage string ([ab409a8f](https://github.com/kbknapp/clap-rs/commit/ab409a8f1db9e37cc70200f6f4a84a162692e618))
-
-
-
-<a name="v0.5.14"></a>
-## v0.5.14 (2015-04-10)
-
-
-#### Bug Fixes
-
-* **usage**
-  *  remove unneeded space ([51372789](https://github.com/kbknapp/clap-rs/commit/5137278942121bc2593ce6e5dc224ec2682549e6))
-  *  remove warning about unused variables ([ba817b9d](https://github.com/kbknapp/clap-rs/commit/ba817b9d815e37320650973f1bea0e7af3030fd7))
-
-#### Features
-
-* **usage**  add ability to get usage string for subcommands too ([3636afc4](https://github.com/kbknapp/clap-rs/commit/3636afc401c2caa966efb5b1869ef4f1ed3384aa))
-
-
-
-<a name="v0.5.13"></a>
-## v0.5.13 (2015-04-09)
-
-
-#### Features
-
-* **SubCommands**  add method to get name and subcommand matches together ([64e53928](https://github.com/kbknapp/clap-rs/commit/64e539280e23e567cf5de393b346eb0ca20e7eb5))
-* **ArgMatches**  add method to get default usage string ([02462150](https://github.com/kbknapp/clap-rs/commit/02462150ca750bdc7012627d7e8d96379d494d7f))
-
-
-
-<a name="v0.5.12"></a>
-## v0.5.12 (2015-04-08)
-
-
-#### Features
-
-* **help**  sort arguments by name so as to not display a random order ([f4b2bf57](https://github.com/kbknapp/clap-rs/commit/f4b2bf5767386013069fb74862e6e938dacf44d2))
-
-
-
-<a name="v0.5.11"></a>
-## v0.5.11 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **flags**  fix bug not allowing users to specify -v or -h ([90e72cff](https://github.com/kbknapp/clap-rs/commit/90e72cffdee321b79eea7a2207119533540062b4))
-
-
-
-<a name="v0.5.10"></a>
-## v0.5.10 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **help**  fix spacing when option argument has not long version ([ca17fa49](https://github.com/kbknapp/clap-rs/commit/ca17fa494b68e92da83ee364bf64b0687006824b))
-
-
-
-<a name="v0.5.9"></a>
-## v0.5.9 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **positional args**  all previous positional args become required when a latter one is required ([c14c3f31](https://github.com/kbknapp/clap-rs/commit/c14c3f31fd557c165570b60911d8ee483d89d6eb), closes [#50](https://github.com/kbknapp/clap-rs/issues/50))
-* **clap**  remove unstable features for Rust 1.0 ([9abdb438](https://github.com/kbknapp/clap-rs/commit/9abdb438e36e364d41550e7f5d44ebcaa8ee6b10))
-* **args**  improve error messages for arguments with mutual exclusions ([18dbcf37](https://github.com/kbknapp/clap-rs/commit/18dbcf37024daf2b76ca099a6f118b53827aa339), closes [#51](https://github.com/kbknapp/clap-rs/issues/51))
-
-
-
-<a name="v0.5.8"></a>
-## v0.5.8 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **option args**  fix bug in getting the wrong number of occurrences for options ([82ad6ad7](https://github.com/kbknapp/clap-rs/commit/82ad6ad77539cf9f9a03b78db466f575ebd972cc))
-* **help**  fix formatting for option arguments with no long ([e8691004](https://github.com/kbknapp/clap-rs/commit/e869100423d93fa3acff03c4620cbcc0d0e790a1))
-* **flags**  add assertion to catch flags with specific value sets ([a0a2a40f](https://github.com/kbknapp/clap-rs/commit/a0a2a40fed57f7c5ad9d68970d090e9856306c7d), closes [#52](https://github.com/kbknapp/clap-rs/issues/52))
-* **args**  improve error messages for arguments with mutual exclusions ([bff945fc](https://github.com/kbknapp/clap-rs/commit/bff945fc5d03bba4266533340adcffb002508d1b), closes [#51](https://github.com/kbknapp/clap-rs/issues/51))
-* **tests**  add missing .takes_value(true) to option2 ([bdb0e88f](https://github.com/kbknapp/clap-rs/commit/bdb0e88f696c8595c3def3bfb0e52d538c7be085))
-* **positional args**  all previous positional args become required when a latter one is required ([343d47dc](https://github.com/kbknapp/clap-rs/commit/343d47dcbf83786a45c0d0f01b27fd9dd76725de), closes [#50](https://github.com/kbknapp/clap-rs/issues/50))
-
-
-
-<a name="v0.5.7"></a>
-## v0.5.7 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **args**  fix bug in arguments who are required and mutually exclusive ([6ceb88a5](https://github.com/kbknapp/clap-rs/commit/6ceb88a594caae825605abc1cdad95204996bf29))
-
-
-
-<a name="v0.5.6"></a>
-## v0.5.6 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **help**  fix formatting of help and usage ([28691b52](https://github.com/kbknapp/clap-rs/commit/28691b52f67e65c599e10e4ea2a0f6f9765a06b8))
-
-
-
-<a name="v0.5.5"></a>
-## v0.5.5 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **help**  fix formatting of help for flags and options ([6ec10115](https://github.com/kbknapp/clap-rs/commit/6ec1011563a746f0578a93b76d45e63878e0f9a8))
-
-
-
-<a name="v0.5.4"></a>
-## v0.5.4 (2015-04-08)
-
-
-#### Features
-
-* **help**  add '...' to indicate multiple values supported ([297ddba7](https://github.com/kbknapp/clap-rs/commit/297ddba77000e2228762ab0eca50b480f7467386))
-
-
-
-<a name="v0.5.3"></a>
-## v0.5.3 (2015-04-08)
-
-
-#### Features
-
-* **positionals**
-  *  add assertions for positional args with multiple vals ([b7fa72d4](https://github.com/kbknapp/clap-rs/commit/b7fa72d40f18806ec2042dd67a518401c2cf5681))
-  *  add support for multiple values ([80784009](https://github.com/kbknapp/clap-rs/commit/807840094109fbf90b348039ae22669ef27889ba))
-
-
-
-<a name="v0.5.2"></a>
-## v0.5.2 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **apps**  allow use of hyphens in application and subcommand names ([da549dcb](https://github.com/kbknapp/clap-rs/commit/da549dcb6c7e0d773044ab17829744483a8b0f7f))
-
-
-
-<a name="v0.5.1"></a>
-## v0.5.1 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **args**  determine if the only arguments allowed are also required ([0a09eb36](https://github.com/kbknapp/clap-rs/commit/0a09eb365ced9a03faf8ed24f083ef730acc90e8))
-
-
-
-<a name="v0.5.0"></a>
-## v0.5.0 (2015-04-08)
-
-
-#### Features
-
-* **args**  add support for a specific set of allowed values on options or positional arguments ([270eb889](https://github.com/kbknapp/clap-rs/commit/270eb88925b6dc2881bff1f31ee344f085d31809))
-
-
-
-<a name="v0.4.18"></a>
-## v0.4.18 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **usage**  display required args in usage, even if only required by others ([1b7316d4](https://github.com/kbknapp/clap-rs/commit/1b7316d4a8df70b0aa584ccbfd33f68966ad2a54))
-
-#### Features
-
-* **subcommands**  properly list subcommands in help and usage ([4ee02344](https://github.com/kbknapp/clap-rs/commit/4ee023442abc3dba54b68138006a52b714adf331))
-
-
-
-<a name="v0.4.17"></a>
-## v0.4.17 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **tests**  remove cargo test from claptests makefile ([1cf73817](https://github.com/kbknapp/clap-rs/commit/1cf73817d6fb1dccb5b6a23b46c2efa8b567ad62))
-
-
-
-<a name="v0.4.16"></a>
-## v0.4.16 (2015-04-08)
-
-
-#### Bug Fixes
-
-* **option**  fix bug with option occurrence values ([9af52e93](https://github.com/kbknapp/clap-rs/commit/9af52e93cef9e17ac9974963f132013d0b97b946))
-* **tests**  fix testing script bug and formatting ([d8f03a55](https://github.com/kbknapp/clap-rs/commit/d8f03a55c4f74d126710ee06aad5a667246a8001))
-
-#### Features
-
-* **arg**  allow lifetimes other than 'static in arguments ([9e8c1fb9](https://github.com/kbknapp/clap-rs/commit/9e8c1fb9406f8448873ca58bab07fe905f1551e5))
diff --git a/third_party/rust/clap/v2/crate/CONTRIBUTORS.md b/third_party/rust/clap/v2/crate/CONTRIBUTORS.md
deleted file mode 100644
index f0fd777..0000000
--- a/third_party/rust/clap/v2/crate/CONTRIBUTORS.md
+++ /dev/null
@@ -1,91 +0,0 @@
-the following is a list of contributors:
-
-
-[<img alt="kbknapp" src="https://avatars1.githubusercontent.com/u/6942134?v=4&s=117" width="117">](https://github.com/kbknapp) |[<img alt="homu" src="https://avatars1.githubusercontent.com/u/10212162?v=4&s=117" width="117">](https://github.com/homu) |[<img alt="Vinatorul" src="https://avatars1.githubusercontent.com/u/6770624?v=4&s=117" width="117">](https://github.com/Vinatorul) |[<img alt="tormol" src="https://avatars3.githubusercontent.com/u/10460821?v=4&s=117" width="117">](https://github.com/tormol) |[<img alt="willmurphyscode" src="https://avatars3.githubusercontent.com/u/12529630?v=4&s=117" width="117">](https://github.com/willmurphyscode) |[<img alt="little-dude" src="https://avatars2.githubusercontent.com/u/6646324?v=4&s=117" width="117">](https://github.com/little-dude) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[kbknapp](https://github.com/kbknapp) |[homu](https://github.com/homu) |[Vinatorul](https://github.com/Vinatorul) |[tormol](https://github.com/tormol) |[willmurphyscode](https://github.com/willmurphyscode) |[little-dude](https://github.com/little-dude) |
-
-[<img alt="sru" src="https://avatars3.githubusercontent.com/u/2485892?v=4&s=117" width="117">](https://github.com/sru) |[<img alt="mgeisler" src="https://avatars0.githubusercontent.com/u/89623?v=4&s=117" width="117">](https://github.com/mgeisler) |[<img alt="nabijaczleweli" src="https://avatars3.githubusercontent.com/u/6709544?v=4&s=117" width="117">](https://github.com/nabijaczleweli) |[<img alt="Byron" src="https://avatars2.githubusercontent.com/u/63622?v=4&s=117" width="117">](https://github.com/Byron) |[<img alt="hgrecco" src="https://avatars0.githubusercontent.com/u/278566?v=4&s=117" width="117">](https://github.com/hgrecco) |[<img alt="bluejekyll" src="https://avatars3.githubusercontent.com/u/986845?v=4&s=117" width="117">](https://github.com/bluejekyll) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[sru](https://github.com/sru) |[mgeisler](https://github.com/mgeisler) |[nabijaczleweli](https://github.com/nabijaczleweli) |[Byron](https://github.com/Byron) |[hgrecco](https://github.com/hgrecco) |[bluejekyll](https://github.com/bluejekyll) |
-
-[<img alt="segevfiner" src="https://avatars0.githubusercontent.com/u/24731903?v=4&s=117" width="117">](https://github.com/segevfiner) |[<img alt="ignatenkobrain" src="https://avatars1.githubusercontent.com/u/2866862?v=4&s=117" width="117">](https://github.com/ignatenkobrain) |[<img alt="james-darkfox" src="https://avatars3.githubusercontent.com/u/637155?v=4&s=117" width="117">](https://github.com/james-darkfox) |[<img alt="H2CO3" src="https://avatars2.githubusercontent.com/u/742370?v=4&s=117" width="117">](https://github.com/H2CO3) |[<img alt="nateozem" src="https://avatars2.githubusercontent.com/u/22719441?v=4&s=117" width="117">](https://github.com/nateozem) |[<img alt="glowing-chemist" src="https://avatars0.githubusercontent.com/u/17074682?v=4&s=117" width="117">](https://github.com/glowing-chemist) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[segevfiner](https://github.com/segevfiner) |[ignatenkobrain](https://github.com/ignatenkobrain) |[james-darkfox](https://github.com/james-darkfox) |[H2CO3](https://github.com/H2CO3) |[nateozem](https://github.com/nateozem) |[glowing-chemist](https://github.com/glowing-chemist) |
-
-[<img alt="discosultan" src="https://avatars1.githubusercontent.com/u/2970736?v=4&s=117" width="117">](https://github.com/discosultan) |[<img alt="rtaycher" src="https://avatars0.githubusercontent.com/u/324733?v=4&s=117" width="117">](https://github.com/rtaycher) |[<img alt="Arnavion" src="https://avatars2.githubusercontent.com/u/1096010?v=4&s=117" width="117">](https://github.com/Arnavion) |[<img alt="japaric" src="https://avatars3.githubusercontent.com/u/5018213?v=4&s=117" width="117">](https://github.com/japaric) |[<img alt="untitaker" src="https://avatars0.githubusercontent.com/u/837573?v=4&s=117" width="117">](https://github.com/untitaker) |[<img alt="afiune" src="https://avatars0.githubusercontent.com/u/5712253?v=4&s=117" width="117">](https://github.com/afiune) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[discosultan](https://github.com/discosultan) |[rtaycher](https://github.com/rtaycher) |[Arnavion](https://github.com/Arnavion) |[japaric](https://github.com/japaric) |[untitaker](https://github.com/untitaker) |[afiune](https://github.com/afiune) |
-
-[<img alt="crazymerlyn" src="https://avatars1.githubusercontent.com/u/6919679?v=4&s=117" width="117">](https://github.com/crazymerlyn) |[<img alt="SuperFluffy" src="https://avatars0.githubusercontent.com/u/701177?v=4&s=117" width="117">](https://github.com/SuperFluffy) |[<img alt="matthiasbeyer" src="https://avatars0.githubusercontent.com/u/427866?v=4&s=117" width="117">](https://github.com/matthiasbeyer) |[<img alt="malbarbo" src="https://avatars3.githubusercontent.com/u/1678126?v=4&s=117" width="117">](https://github.com/malbarbo) |[<img alt="tshepang" src="https://avatars0.githubusercontent.com/u/588486?v=4&s=117" width="117">](https://github.com/tshepang) |[<img alt="golem131" src="https://avatars3.githubusercontent.com/u/2429587?v=4&s=117" width="117">](https://github.com/golem131) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[crazymerlyn](https://github.com/crazymerlyn) |[SuperFluffy](https://github.com/SuperFluffy) |[matthiasbeyer](https://github.com/matthiasbeyer) |[malbarbo](https://github.com/malbarbo) |[tshepang](https://github.com/tshepang) |[golem131](https://github.com/golem131) |
-
-[<img alt="jimmycuadra" src="https://avatars2.githubusercontent.com/u/122457?v=4&s=117" width="117">](https://github.com/jimmycuadra) |[<img alt="Nemo157" src="https://avatars1.githubusercontent.com/u/81079?v=4&s=117" width="117">](https://github.com/Nemo157) |[<img alt="severen" src="https://avatars1.githubusercontent.com/u/4061736?v=4&s=117" width="117">](https://github.com/severen) |[<img alt="Eijebong" src="https://avatars2.githubusercontent.com/u/3650385?v=4&s=117" width="117">](https://github.com/Eijebong) |[<img alt="cstorey" src="https://avatars3.githubusercontent.com/u/743059?v=4&s=117" width="117">](https://github.com/cstorey) |[<img alt="wdv4758h" src="https://avatars1.githubusercontent.com/u/2716047?v=4&s=117" width="117">](https://github.com/wdv4758h) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[jimmycuadra](https://github.com/jimmycuadra) |[Nemo157](https://github.com/Nemo157) |[severen](https://github.com/severen) |[Eijebong](https://github.com/Eijebong) |[cstorey](https://github.com/cstorey) |[wdv4758h](https://github.com/wdv4758h) |
-
-[<img alt="frewsxcv" src="https://avatars2.githubusercontent.com/u/416575?v=4&s=117" width="117">](https://github.com/frewsxcv) |[<img alt="hoodie" src="https://avatars1.githubusercontent.com/u/260370?v=4&s=117" width="117">](https://github.com/hoodie) |[<img alt="huonw" src="https://avatars1.githubusercontent.com/u/1203825?v=4&s=117" width="117">](https://github.com/huonw) |[<img alt="GrappigPanda" src="https://avatars0.githubusercontent.com/u/2055372?v=4&s=117" width="117">](https://github.com/GrappigPanda) |[<img alt="shepmaster" src="https://avatars0.githubusercontent.com/u/174509?v=4&s=117" width="117">](https://github.com/shepmaster) |[<img alt="starkat99" src="https://avatars1.githubusercontent.com/u/8295111?v=4&s=117" width="117">](https://github.com/starkat99) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[frewsxcv](https://github.com/frewsxcv) |[hoodie](https://github.com/hoodie) |[huonw](https://github.com/huonw) |[GrappigPanda](https://github.com/GrappigPanda) |[shepmaster](https://github.com/shepmaster) |[starkat99](https://github.com/starkat99) |
-
-[<img alt="porglezomp" src="https://avatars1.githubusercontent.com/u/1690225?v=4&s=117" width="117">](https://github.com/porglezomp) |[<img alt="kraai" src="https://avatars1.githubusercontent.com/u/552646?v=4&s=117" width="117">](https://github.com/kraai) |[<img alt="musoke" src="https://avatars0.githubusercontent.com/u/16665084?v=4&s=117" width="117">](https://github.com/musoke) |[<img alt="nelsonjchen" src="https://avatars1.githubusercontent.com/u/5363?v=4&s=117" width="117">](https://github.com/nelsonjchen) |[<img alt="pkgw" src="https://avatars0.githubusercontent.com/u/59598?v=4&s=117" width="117">](https://github.com/pkgw) |[<img alt="Deedasmi" src="https://avatars0.githubusercontent.com/u/5093293?v=4&s=117" width="117">](https://github.com/Deedasmi) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[porglezomp](https://github.com/porglezomp) |[kraai](https://github.com/kraai) |[musoke](https://github.com/musoke) |[nelsonjchen](https://github.com/nelsonjchen) |[pkgw](https://github.com/pkgw) |[Deedasmi](https://github.com/Deedasmi) |
-
-[<img alt="vmchale" src="https://avatars1.githubusercontent.com/u/13259982?v=4&s=117" width="117">](https://github.com/vmchale) |[<img alt="etopiei" src="https://avatars3.githubusercontent.com/u/17671663?v=4&s=117" width="117">](https://github.com/etopiei) |[<img alt="messense" src="https://avatars0.githubusercontent.com/u/1556054?v=4&s=117" width="117">](https://github.com/messense) |[<img alt="Keats" src="https://avatars2.githubusercontent.com/u/680355?v=4&s=117" width="117">](https://github.com/Keats) |[<img alt="kieraneglin" src="https://avatars0.githubusercontent.com/u/569917?v=4&s=117" width="117">](https://github.com/kieraneglin) |[<img alt="durka" src="https://avatars3.githubusercontent.com/u/47007?v=4&s=117" width="117">](https://github.com/durka) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[vmchale](https://github.com/vmchale) |[etopiei](https://github.com/etopiei) |[messense](https://github.com/messense) |[Keats](https://github.com/Keats) |[kieraneglin](https://github.com/kieraneglin) |[durka](https://github.com/durka) |
-
-[<img alt="alex-gulyas" src="https://avatars0.githubusercontent.com/u/8698329?v=4&s=117" width="117">](https://github.com/alex-gulyas) |[<img alt="cite-reader" src="https://avatars1.githubusercontent.com/u/4196987?v=4&s=117" width="117">](https://github.com/cite-reader) |[<img alt="alexbool" src="https://avatars3.githubusercontent.com/u/1283792?v=4&s=117" width="117">](https://github.com/alexbool) |[<img alt="AluisioASG" src="https://avatars2.githubusercontent.com/u/1904165?v=4&s=117" width="117">](https://github.com/AluisioASG) |[<img alt="BurntSushi" src="https://avatars3.githubusercontent.com/u/456674?v=4&s=117" width="117">](https://github.com/BurntSushi) |[<img alt="AndrewGaspar" src="https://avatars1.githubusercontent.com/u/2292643?v=4&s=117" width="117">](https://github.com/AndrewGaspar) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[alex-gulyas](https://github.com/alex-gulyas) |[cite-reader](https://github.com/cite-reader) |[alexbool](https://github.com/alexbool) |[AluisioASG](https://github.com/AluisioASG) |[BurntSushi](https://github.com/BurntSushi) |[AndrewGaspar](https://github.com/AndrewGaspar) |
-
-[<img alt="nox" src="https://avatars0.githubusercontent.com/u/123095?v=4&s=117" width="117">](https://github.com/nox) |[<img alt="mitsuhiko" src="https://avatars1.githubusercontent.com/u/7396?v=4&s=117" width="117">](https://github.com/mitsuhiko) |[<img alt="pixelistik" src="https://avatars1.githubusercontent.com/u/170929?v=4&s=117" width="117">](https://github.com/pixelistik) |[<img alt="ogham" src="https://avatars3.githubusercontent.com/u/503760?v=4&s=117" width="117">](https://github.com/ogham) |[<img alt="Bilalh" src="https://avatars0.githubusercontent.com/u/171602?v=4&s=117" width="117">](https://github.com/Bilalh) |[<img alt="dotdash" src="https://avatars1.githubusercontent.com/u/230962?v=4&s=117" width="117">](https://github.com/dotdash) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[nox](https://github.com/nox) |[mitsuhiko](https://github.com/mitsuhiko) |[pixelistik](https://github.com/pixelistik) |[ogham](https://github.com/ogham) |[Bilalh](https://github.com/Bilalh) |[dotdash](https://github.com/dotdash) |
-
-[<img alt="bradurani" src="https://avatars0.githubusercontent.com/u/4195952?v=4&s=117" width="117">](https://github.com/bradurani) |[<img alt="Seeker14491" src="https://avatars2.githubusercontent.com/u/6490497?v=4&s=117" width="117">](https://github.com/Seeker14491) |[<img alt="brianp" src="https://avatars1.githubusercontent.com/u/179134?v=4&s=117" width="117">](https://github.com/brianp) |[<img alt="cldershem" src="https://avatars3.githubusercontent.com/u/201608?v=4&s=117" width="117">](https://github.com/cldershem) |[<img alt="casey" src="https://avatars2.githubusercontent.com/u/1945?v=4&s=117" width="117">](https://github.com/casey) |[<img alt="volks73" src="https://avatars1.githubusercontent.com/u/1915469?v=4&s=117" width="117">](https://github.com/volks73) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[bradurani](https://github.com/bradurani) |[Seeker14491](https://github.com/Seeker14491) |[brianp](https://github.com/brianp) |[cldershem](https://github.com/cldershem) |[casey](https://github.com/casey) |[volks73](https://github.com/volks73) |
-
-[<img alt="daboross" src="https://avatars1.githubusercontent.com/u/1152146?v=4&s=117" width="117">](https://github.com/daboross) |[<img alt="da-x" src="https://avatars1.githubusercontent.com/u/321273?v=4&s=117" width="117">](https://github.com/da-x) |[<img alt="mernen" src="https://avatars0.githubusercontent.com/u/6412?v=4&s=117" width="117">](https://github.com/mernen) |[<img alt="dguo" src="https://avatars0.githubusercontent.com/u/2763135?v=4&s=117" width="117">](https://github.com/dguo) |[<img alt="davidszotten" src="https://avatars3.githubusercontent.com/u/412005?v=4&s=117" width="117">](https://github.com/davidszotten) |[<img alt="drusellers" src="https://avatars1.githubusercontent.com/u/63355?v=4&s=117" width="117">](https://github.com/drusellers) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[daboross](https://github.com/daboross) |[da-x](https://github.com/da-x) |[mernen](https://github.com/mernen) |[dguo](https://github.com/dguo) |[davidszotten](https://github.com/davidszotten) |[drusellers](https://github.com/drusellers) |
-
-[<img alt="eddyb" src="https://avatars2.githubusercontent.com/u/77424?v=4&s=117" width="117">](https://github.com/eddyb) |[<img alt="Enet4" src="https://avatars0.githubusercontent.com/u/4738426?v=4&s=117" width="117">](https://github.com/Enet4) |[<img alt="Fraser999" src="https://avatars3.githubusercontent.com/u/190532?v=4&s=117" width="117">](https://github.com/Fraser999) |[<img alt="birkenfeld" src="https://avatars0.githubusercontent.com/u/144359?v=4&s=117" width="117">](https://github.com/birkenfeld) |[<img alt="guanqun" src="https://avatars0.githubusercontent.com/u/53862?v=4&s=117" width="117">](https://github.com/guanqun) |[<img alt="tanakh" src="https://avatars2.githubusercontent.com/u/109069?v=4&s=117" width="117">](https://github.com/tanakh) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[eddyb](https://github.com/eddyb) |[Enet4](https://github.com/Enet4) |[Fraser999](https://github.com/Fraser999) |[birkenfeld](https://github.com/birkenfeld) |[guanqun](https://github.com/guanqun) |[tanakh](https://github.com/tanakh) |
-
-[<img alt="SirVer" src="https://avatars0.githubusercontent.com/u/140115?v=4&s=117" width="117">](https://github.com/SirVer) |[<img alt="idmit" src="https://avatars1.githubusercontent.com/u/2546728?v=4&s=117" width="117">](https://github.com/idmit) |[<img alt="archer884" src="https://avatars1.githubusercontent.com/u/679494?v=4&s=117" width="117">](https://github.com/archer884) |[<img alt="jacobmischka" src="https://avatars1.githubusercontent.com/u/3939997?v=4&s=117" width="117">](https://github.com/jacobmischka) |[<img alt="jespino" src="https://avatars0.githubusercontent.com/u/290303?v=4&s=117" width="117">](https://github.com/jespino) |[<img alt="jfrankenau" src="https://avatars3.githubusercontent.com/u/2736480?v=4&s=117" width="117">](https://github.com/jfrankenau) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[SirVer](https://github.com/SirVer) |[idmit](https://github.com/idmit) |[archer884](https://github.com/archer884) |[jacobmischka](https://github.com/jacobmischka) |[jespino](https://github.com/jespino) |[jfrankenau](https://github.com/jfrankenau) |
-
-[<img alt="jtdowney" src="https://avatars1.githubusercontent.com/u/44654?v=4&s=117" width="117">](https://github.com/jtdowney) |[<img alt="andete" src="https://avatars2.githubusercontent.com/u/689017?v=4&s=117" width="117">](https://github.com/andete) |[<img alt="joshtriplett" src="https://avatars2.githubusercontent.com/u/162737?v=4&s=117" width="117">](https://github.com/joshtriplett) |[<img alt="Kalwyn" src="https://avatars3.githubusercontent.com/u/22778640?v=4&s=117" width="117">](https://github.com/Kalwyn) |[<img alt="manuel-rhdt" src="https://avatars1.githubusercontent.com/u/3199013?v=4&s=117" width="117">](https://github.com/manuel-rhdt) |[<img alt="Marwes" src="https://avatars3.githubusercontent.com/u/957312?v=4&s=117" width="117">](https://github.com/Marwes) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[jtdowney](https://github.com/jtdowney) |[andete](https://github.com/andete) |[joshtriplett](https://github.com/joshtriplett) |[Kalwyn](https://github.com/Kalwyn) |[manuel-rhdt](https://github.com/manuel-rhdt) |[Marwes](https://github.com/Marwes) |
-
-[<img alt="mdaffin" src="https://avatars1.githubusercontent.com/u/171232?v=4&s=117" width="117">](https://github.com/mdaffin) |[<img alt="iliekturtles" src="https://avatars3.githubusercontent.com/u/5081378?v=4&s=117" width="117">](https://github.com/iliekturtles) |[<img alt="nicompte" src="https://avatars2.githubusercontent.com/u/439369?v=4&s=117" width="117">](https://github.com/nicompte) |[<img alt="NickeZ" src="https://avatars2.githubusercontent.com/u/492753?v=4&s=117" width="117">](https://github.com/NickeZ) |[<img alt="nvzqz" src="https://avatars0.githubusercontent.com/u/10367662?v=4&s=117" width="117">](https://github.com/nvzqz) |[<img alt="nuew" src="https://avatars2.githubusercontent.com/u/26099511?v=4&s=117" width="117">](https://github.com/nuew) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[mdaffin](https://github.com/mdaffin) |[iliekturtles](https://github.com/iliekturtles) |[nicompte](https://github.com/nicompte) |[NickeZ](https://github.com/NickeZ) |[nvzqz](https://github.com/nvzqz) |[nuew](https://github.com/nuew) |
-
-[<img alt="Geogi" src="https://avatars1.githubusercontent.com/u/1818316?v=4&s=117" width="117">](https://github.com/Geogi) |[<img alt="focusaurus" src="https://avatars1.githubusercontent.com/u/482377?v=4&s=117" width="117">](https://github.com/focusaurus) |[<img alt="flying-sheep" src="https://avatars0.githubusercontent.com/u/291575?v=4&s=117" width="117">](https://github.com/flying-sheep) |[<img alt="Phlosioneer" src="https://avatars2.githubusercontent.com/u/4657718?v=4&s=117" width="117">](https://github.com/Phlosioneer) |[<img alt="peppsac" src="https://avatars3.githubusercontent.com/u/2198295?v=4&s=117" width="117">](https://github.com/peppsac) |[<img alt="golddranks" src="https://avatars1.githubusercontent.com/u/2675542?v=4&s=117" width="117">](https://github.com/golddranks) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[Geogi](https://github.com/Geogi) |[focusaurus](https://github.com/focusaurus) |[flying-sheep](https://github.com/flying-sheep) |[Phlosioneer](https://github.com/Phlosioneer) |[peppsac](https://github.com/peppsac) |[golddranks](https://github.com/golddranks) |
-
-[<img alt="hexjelly" src="https://avatars0.githubusercontent.com/u/435283?v=4&s=117" width="117">](https://github.com/hexjelly) |[<img alt="rom1v" src="https://avatars1.githubusercontent.com/u/543275?v=4&s=117" width="117">](https://github.com/rom1v) |[<img alt="rnelson" src="https://avatars3.githubusercontent.com/u/118361?v=4&s=117" width="117">](https://github.com/rnelson) |[<img alt="swatteau" src="https://avatars3.githubusercontent.com/u/5521255?v=4&s=117" width="117">](https://github.com/swatteau) |[<img alt="tchajed" src="https://avatars3.githubusercontent.com/u/1255037?v=4&s=117" width="117">](https://github.com/tchajed) |[<img alt="tspiteri" src="https://avatars0.githubusercontent.com/u/18604588?v=4&s=117" width="117">](https://github.com/tspiteri) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[hexjelly](https://github.com/hexjelly) |[rom1v](https://github.com/rom1v) |[rnelson](https://github.com/rnelson) |[swatteau](https://github.com/swatteau) |[tchajed](https://github.com/tchajed) |[tspiteri](https://github.com/tspiteri) |
-
-[<img alt="siiptuo" src="https://avatars0.githubusercontent.com/u/10729330?v=4&s=117" width="117">](https://github.com/siiptuo) |[<img alt="vks" src="https://avatars2.githubusercontent.com/u/33460?v=4&s=117" width="117">](https://github.com/vks) |[<img alt="vsupalov" src="https://avatars2.githubusercontent.com/u/2801030?v=4&s=117" width="117">](https://github.com/vsupalov) |[<img alt="mineo" src="https://avatars1.githubusercontent.com/u/78236?v=4&s=117" width="117">](https://github.com/mineo) |[<img alt="wabain" src="https://avatars3.githubusercontent.com/u/7651435?v=4&s=117" width="117">](https://github.com/wabain) |[<img alt="grossws" src="https://avatars2.githubusercontent.com/u/171284?v=4&s=117" width="117">](https://github.com/grossws) |
-:---: |:---: |:---: |:---: |:---: |:---: |
-[siiptuo](https://github.com/siiptuo) |[vks](https://github.com/vks) |[vsupalov](https://github.com/vsupalov) |[mineo](https://github.com/mineo) |[wabain](https://github.com/wabain) |[grossws](https://github.com/grossws) |
-
-[<img alt="kennytm" src="https://avatars1.githubusercontent.com/u/103023?v=4&s=117" width="117">](https://github.com/kennytm) |[<img alt="king6cong" src="https://avatars3.githubusercontent.com/u/302560?v=4&s=117" width="117">](https://github.com/king6cong) |[<img alt="mvaude" src="https://avatars1.githubusercontent.com/u/9532611?v=4&s=117" width="117">](https://github.com/mvaude) |[<img alt="panicbit" src="https://avatars2.githubusercontent.com/u/628445?v=4&s=117" width="117">](https://github.com/panicbit) |[<img alt="brennie" src="https://avatars3.githubusercontent.com/u/156585?v=4&s=117" width="117">](https://github.com/brennie) |
-:---: |:---: |:---: |:---: |:---: |
-[kennytm](https://github.com/kennytm) |[king6cong](https://github.com/king6cong) |[mvaude](https://github.com/mvaude) |[panicbit](https://github.com/panicbit) |[brennie](https://github.com/brennie) |
-
-
-
-
-This list was generated by [mgechev/github-contributors-list](https://github.com/mgechev/github-contributors-list)
diff --git a/third_party/rust/clap/v2/crate/Cargo.toml b/third_party/rust/clap/v2/crate/Cargo.toml
deleted file mode 100644
index 683a0408..0000000
--- a/third_party/rust/clap/v2/crate/Cargo.toml
+++ /dev/null
@@ -1,132 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-name = "clap"
-version = "2.33.3"
-authors = ["Kevin K. <kbknapp@gmail.com>"]
-exclude = ["examples/*", "clap-test/*", "tests/*", "benches/*", "*.png", "clap-perf/*", "*.dot"]
-description = "A simple to use, efficient, and full-featured Command Line Argument Parser\n"
-homepage = "https://clap.rs/"
-documentation = "https://docs.rs/clap/"
-readme = "README.md"
-keywords = ["argument", "cli", "arg", "parser", "parse"]
-categories = ["command-line-interface"]
-license = "MIT"
-repository = "https://github.com/clap-rs/clap"
-[package.metadata.docs.rs]
-features = ["doc"]
-[profile.bench]
-opt-level = 3
-lto = true
-codegen-units = 1
-debug = false
-debug-assertions = false
-rpath = false
-
-[profile.dev]
-opt-level = 0
-lto = false
-codegen-units = 4
-debug = true
-debug-assertions = true
-rpath = false
-
-[profile.release]
-opt-level = 3
-lto = true
-codegen-units = 1
-debug = false
-debug-assertions = false
-rpath = false
-
-[profile.test]
-opt-level = 1
-lto = false
-codegen-units = 4
-debug = true
-debug-assertions = true
-rpath = false
-[dependencies.atty]
-version = "0.2.2"
-optional = true
-
-[dependencies.bitflags]
-version = "1.0"
-
-[dependencies.clippy]
-version = "~0.0.166"
-optional = true
-
-[dependencies.strsim]
-version = "0.8"
-optional = true
-
-[dependencies.term_size]
-version = "0.3.0"
-optional = true
-
-[dependencies.textwrap]
-version = "0.11.0"
-
-[dependencies.unicode-width]
-version = "0.1.4"
-
-[dependencies.vec_map]
-version = "0.8"
-optional = true
-
-[dependencies.yaml-rust]
-version = "0.3.5"
-optional = true
-[dev-dependencies.lazy_static]
-version = "1.3"
-
-[dev-dependencies.regex]
-version = "1"
-
-[dev-dependencies.version-sync]
-version = "0.8"
-
-[features]
-color = ["ansi_term", "atty"]
-debug = []
-default = ["suggestions", "color", "vec_map"]
-doc = ["yaml"]
-lints = ["clippy"]
-nightly = []
-no_cargo = []
-suggestions = ["strsim"]
-unstable = []
-wrap_help = ["term_size", "textwrap/term_size"]
-yaml = ["yaml-rust"]
-[target."cfg(not(windows))".dependencies.ansi_term]
-version = "0.11"
-optional = true
-[badges.appveyor]
-repository = "clap-rs/clap"
-
-[badges.coveralls]
-branch = "master"
-repository = "clap-rs/clap"
-
-[badges.is-it-maintained-issue-resolution]
-repository = "clap-rs/clap"
-
-[badges.is-it-maintained-open-issues]
-repository = "clap-rs/clap"
-
-[badges.maintenance]
-status = "actively-developed"
-
-[badges.travis-ci]
-repository = "clap-rs/clap"
diff --git a/third_party/rust/clap/v2/crate/LICENSE-MIT b/third_party/rust/clap/v2/crate/LICENSE-MIT
deleted file mode 100644
index 5acedf0..0000000
--- a/third_party/rust/clap/v2/crate/LICENSE-MIT
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015-2016 Kevin B. Knapp
-
-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/rust/clap/v2/crate/README.md b/third_party/rust/clap/v2/crate/README.md
deleted file mode 100644
index e3a9142..0000000
--- a/third_party/rust/clap/v2/crate/README.md
+++ /dev/null
@@ -1,542 +0,0 @@
-clap
-====
-
-[![Crates.io](https://img.shields.io/crates/v/clap.svg)](https://crates.io/crates/clap) [![Crates.io](https://img.shields.io/crates/d/clap.svg)](https://crates.io/crates/clap) [![license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/clap-rs/clap/blob/master/LICENSE-MIT) [![Coverage Status](https://coveralls.io/repos/kbknapp/clap-rs/badge.svg?branch=master&service=github)](https://coveralls.io/github/kbknapp/clap-rs?branch=master) [![Join the chat at https://gitter.im/kbknapp/clap-rs](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/kbknapp/clap-rs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-Linux: [![Build Status](https://travis-ci.org/clap-rs/clap.svg?branch=master)](https://travis-ci.org/clap-rs/clap)
-Windows: [![Build status](https://ci.appveyor.com/api/projects/status/ejg8c33dn31nhv36/branch/master?svg=true)](https://ci.appveyor.com/project/kbknapp/clap-rs/branch/master)
-
-Command Line Argument Parser for Rust
-
-It is a simple-to-use, efficient, and full-featured library for parsing command line arguments and subcommands when writing console/terminal applications.
-
-* [documentation](https://docs.rs/clap/)
-* [website](https://clap.rs/)
-* [video tutorials](https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U)
-
-Table of Contents
-=================
-
-* [About](#about)
-* [FAQ](#faq)
-* [Features](#features)
-* [Quick Example](#quick-example)
-* [Try it!](#try-it)
-  * [Pre-Built Test](#pre-built-test)
-  * [BYOB (Build Your Own Binary)](#byob-build-your-own-binary)
-* [Usage](#usage)
-  * [Optional Dependencies / Features](#optional-dependencies--features)
-  * [Dependencies Tree](#dependencies-tree)
-  * [More Information](#more-information)
-    * [Video Tutorials](#video-tutorials)
-* [How to Contribute](#how-to-contribute)
-  * [Compatibility Policy](#compatibility-policy)
-    * [Minimum Version of Rust](#minimum-version-of-rust)
-* [Related Crates](#related-crates)
-* [License](#license)
-* [Recent Breaking Changes](#recent-breaking-changes)
-  * [Deprecations](#deprecations)
-
-Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc)
-
-## About
-
-`clap` is used to parse *and validate* the string of command line arguments provided by a user at runtime. You provide the list of valid possibilities, and `clap` handles the rest. This means you focus on your *applications* functionality, and less on the parsing and validating of arguments.
-
-`clap` provides many things 'for free' (with no configuration) including the traditional version and help switches (or flags) along with associated messages. If you are using subcommands, `clap` will also auto-generate a `help` subcommand and separate associated help messages.
-
-Once `clap` parses the user provided string of arguments, it returns the matches along with any applicable values. If the user made an error or typo, `clap` informs them with a friendly message and exits gracefully (or returns a `Result` type and allows you to perform any clean up prior to exit). Because of this, you can make reasonable assumptions in your code about the validity of the arguments prior to your applications main execution.
-
-## FAQ
-
-For a full FAQ and more in depth details, see [the wiki page](https://github.com/clap-rs/clap/wiki/FAQ)
-
-### Comparisons
-
-First, let me say that these comparisons are highly subjective, and not meant in a critical or harsh manner. All the argument parsing libraries out there (to include `clap`) have their own strengths and weaknesses. Sometimes it just comes down to personal taste when all other factors are equal. When in doubt, try them all and pick one that you enjoy :) There's plenty of room in the Rust community for multiple implementations!
-
-#### How does `clap` compare to [getopts](https://github.com/rust-lang-nursery/getopts)?
-
-`getopts` is a very basic, fairly minimalist argument parsing library. This isn't a bad thing, sometimes you don't need tons of features, you just want to parse some simple arguments, and have some help text generated for you based on valid arguments you specify. The downside to this approach is that you must manually implement most of the common features (such as checking to display help messages, usage strings, etc.). If you want a highly custom argument parser, and don't mind writing the majority of the functionality yourself, `getopts` is an excellent base.
-
-`getopts` also doesn't allocate much, or at all. This gives it a very small performance boost. Although, as you start implementing additional features, that boost quickly disappears.
-
-Personally, I find many, many uses of `getopts` are manually implementing features that `clap` provides by default. Using `clap` simplifies your codebase allowing you to focus on your application, and not argument parsing.
-
-#### How does `clap` compare to [docopt.rs](https://github.com/docopt/docopt.rs)?
-
-I first want to say I'm a big a fan of BurntSushi's work, the creator of `Docopt.rs`. I aspire to produce the quality of libraries that this man does! When it comes to comparing these two libraries they are very different. `docopt` tasks you with writing a help message, and then it parsers that message for you to determine all valid arguments and their use. Some people LOVE this approach, others do not. If you're willing to write a detailed help message, it's nice that you can stick that in your program and have `docopt` do the rest. On the downside, it's far less flexible.
-
-`docopt` is also excellent at translating arguments into Rust types automatically. There is even a syntax extension which will do all this for you, if you're willing to use a nightly compiler (use of a stable compiler requires you to somewhat manually translate from arguments to Rust types). To use BurntSushi's words, `docopt` is also a sort of black box. You get what you get, and it's hard to tweak implementation or customize the experience for your use case.
-
-Because `docopt` is doing a ton of work to parse your help messages and determine what you were trying to communicate as valid arguments, it's also one of the more heavy weight parsers performance-wise. For most applications this isn't a concern and this isn't to say `docopt` is slow, in fact far from it. This is just something to keep in mind while comparing.
-
-#### All else being equal, what are some reasons to use `clap`? (The Pitch)
-
-`clap` is as fast, and as lightweight as possible while still giving all the features you'd expect from a modern argument parser. In fact, for the amount and type of features `clap` offers it remains about as fast as `getopts`. If you use `clap` when just need some simple arguments parsed, you'll find it's a walk in the park. `clap` also makes it possible to represent extremely complex, and advanced requirements, without too much thought. `clap` aims to be intuitive, easy to use, and fully capable for wide variety use cases and needs.
-
-#### All else being equal, what are some reasons *not* to use `clap`? (The Anti Pitch)
-
-Depending on the style in which you choose to define the valid arguments, `clap` can be very verbose. `clap` also offers so many fine-tuning knobs and dials, that learning everything can seem overwhelming. I strive to keep the simple cases simple, but when turning all those custom dials it can get complex. `clap` is also opinionated about parsing. Even though so much can be tweaked and tuned with `clap` (and I'm adding more all the time), there are still certain features which `clap` implements in specific ways which may be contrary to some users use-cases. Finally, `clap` is "stringly typed" when referring to arguments which can cause typos in code. This particular paper-cut is being actively worked on, and should be gone in v3.x.
-
-## Features
-
-Below are a few of the features which `clap` supports, full descriptions and usage can be found in the [documentation](https://docs.rs/clap/) and [examples/](examples) directory
-
-* **Auto-generated Help, Version, and Usage information**
-  - Can optionally be fully, or partially overridden if you want a custom help, version, or usage statements
-* **Auto-generated completion scripts at compile time (Bash, Zsh, Fish, and PowerShell)**
-  - Even works through many multiple levels of subcommands
-  - Works with options which only accept certain values
-  - Works with subcommand aliases
-* **Flags / Switches** (i.e. bool fields)
-  - Both short and long versions supported (i.e. `-f` and `--flag` respectively)
-  - Supports combining short versions (i.e. `-fBgoZ` is the same as `-f -B -g -o -Z`)
-  - Supports multiple occurrences (i.e. `-vvv` or `-v -v -v`)
-* **Positional Arguments** (i.e. those which are based off an index from the program name)
-  - Supports multiple values (i.e. `myprog <file>...` such as `myprog file1.txt file2.txt` being two values for the same "file" argument)
-  - Supports Specific Value Sets (See below)
-  - Can set value parameters (such as the minimum number of values, the maximum number of values, or the exact number of values)
-  - Can set custom validations on values to extend the argument parsing capability to truly custom domains
-* **Option Arguments** (i.e. those that take values)
-  - Both short and long versions supported (i.e. `-o value`, `-ovalue`, `-o=value` and `--option value` or `--option=value` respectively)
-  - Supports multiple values (i.e. `-o <val1> -o <val2>` or `-o <val1> <val2>`)
-  - Supports delimited values (i.e. `-o=val1,val2,val3`, can also change the delimiter)
-  - Supports Specific Value Sets (See below)
-  - Supports named values so that the usage/help info appears as `-o <FILE> <INTERFACE>` etc. for when you require specific multiple values
-  - Can set value parameters (such as the minimum number of values, the maximum number of values, or the exact number of values)
-  - Can set custom validations on values to extend the argument parsing capability to truly custom domains
-* **Sub-Commands** (i.e. `git add <file>` where `add` is a sub-command of `git`)
-  - Support their own sub-arguments, and sub-sub-commands independent of the parent
-  - Get their own auto-generated Help, Version, and Usage independent of parent
-* **Support for building CLIs from YAML** - This keeps your Rust source nice and tidy and makes supporting localized translation very simple!
-* **Requirement Rules**: Arguments can define the following types of requirement rules
-  - Can be required by default
-  - Can be required only if certain arguments are present
-  - Can require other arguments to be present
-  - Can be required only if certain values of other arguments are used
-* **Confliction Rules**: Arguments can optionally define the following types of exclusion rules
-  - Can be disallowed when certain arguments are present
-  - Can disallow use of other arguments when present
-* **Groups**: Arguments can be made part of a group
-  - Fully compatible with other relational rules (requirements, conflicts, and overrides) which allows things like requiring the use of any arg in a group, or denying the use of an entire group conditionally
-* **Specific Value Sets**: Positional or Option Arguments can define a specific set of allowed values (i.e. imagine a `--mode` option which may *only* have one of two values `fast` or `slow` such as `--mode fast` or `--mode slow`)
-* **Default Values**
-  - Also supports conditional default values (i.e. a default which only applies if specific arguments are used, or specific values of those arguments)
-* **Automatic Version from Cargo.toml**: `clap` is fully compatible with Rust's `env!()` macro for automatically setting the version of your application to the version in your Cargo.toml. See [09_auto_version example](examples/09_auto_version.rs) for how to do this (Thanks to [jhelwig](https://github.com/jhelwig) for pointing this out)
-* **Typed Values**: You can use several convenience macros provided by `clap` to get typed values (i.e. `i32`, `u8`, etc.) from positional or option arguments so long as the type you request implements `std::str::FromStr` See the [12_typed_values example](examples/12_typed_values.rs). You can also use `clap`s `arg_enum!` macro to create an enum with variants that automatically implement `std::str::FromStr`. See [13a_enum_values_automatic example](examples/13a_enum_values_automatic.rs) for details
-* **Suggestions**: Suggests corrections when the user enters a typo. For example, if you defined a `--myoption` argument, and the user mistakenly typed `--moyption` (notice `y` and `o` transposed), they would receive a `Did you mean '--myoption'?` error and exit gracefully. This also works for subcommands and flags. (Thanks to [Byron](https://github.com/Byron) for the implementation) (This feature can optionally be disabled, see 'Optional Dependencies / Features')
-* **Colorized Errors (Non Windows OS only)**: Error message are printed in in colored text (this feature can optionally be disabled, see 'Optional Dependencies / Features').
-* **Global Arguments**: Arguments can optionally be defined once, and be available to all child subcommands. There values will also be propagated up/down throughout all subcommands.
-* **Custom Validations**: You can define a function to use as a validator of argument values. Imagine defining a function to validate IP addresses, or fail parsing upon error. This means your application logic can be solely focused on *using* values.
-* **POSIX Compatible Conflicts/Overrides** - In POSIX args can be conflicting, but not fail parsing because whichever arg comes *last* "wins" so to speak. This allows things such as aliases (i.e. `alias ls='ls -l'` but then using `ls -C` in your terminal which ends up passing `ls -l -C` as the final arguments. Since `-l` and `-C` aren't compatible, this effectively runs `ls -C` in `clap` if you choose...`clap` also supports hard conflicts that fail parsing). (Thanks to [Vinatorul](https://github.com/Vinatorul)!)
-* Supports the Unix `--` meaning, only positional arguments follow
-
-## Quick Example
-
-The following examples show a quick example of some of the very basic functionality of `clap`. For more advanced usage, such as requirements, conflicts, groups, multiple values and occurrences see the [documentation](https://docs.rs/clap/), [examples/](examples) directory of this repository or the [video tutorials](https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U).
-
- **NOTE:** All of these examples are functionally the same, but show different styles in which to use `clap`. These different styles are purely a matter of personal preference.
-
-The first example shows a method using the 'Builder Pattern' which allows more advanced configuration options (not shown in this small example), or even dynamically generating arguments when desired.
-
-```rust
-// (Full example with detailed comments in examples/01b_quick_example.rs)
-//
-// This example demonstrates clap's full 'builder pattern' style of creating arguments which is
-// more verbose, but allows easier editing, and at times more advanced options, or the possibility
-// to generate arguments dynamically.
-extern crate clap;
-use clap::{Arg, App, SubCommand};
-
-fn main() {
-    let matches = App::new("My Super Program")
-                          .version("1.0")
-                          .author("Kevin K. <kbknapp@gmail.com>")
-                          .about("Does awesome things")
-                          .arg(Arg::with_name("config")
-                               .short("c")
-                               .long("config")
-                               .value_name("FILE")
-                               .help("Sets a custom config file")
-                               .takes_value(true))
-                          .arg(Arg::with_name("INPUT")
-                               .help("Sets the input file to use")
-                               .required(true)
-                               .index(1))
-                          .arg(Arg::with_name("v")
-                               .short("v")
-                               .multiple(true)
-                               .help("Sets the level of verbosity"))
-                          .subcommand(SubCommand::with_name("test")
-                                      .about("controls testing features")
-                                      .version("1.3")
-                                      .author("Someone E. <someone_else@other.com>")
-                                      .arg(Arg::with_name("debug")
-                                          .short("d")
-                                          .help("print debug information verbosely")))
-                          .get_matches();
-
-    // Gets a value for config if supplied by user, or defaults to "default.conf"
-    let config = matches.value_of("config").unwrap_or("default.conf");
-    println!("Value for config: {}", config);
-
-    // Calling .unwrap() is safe here because "INPUT" is required (if "INPUT" wasn't
-    // required we could have used an 'if let' to conditionally get the value)
-    println!("Using input file: {}", matches.value_of("INPUT").unwrap());
-
-    // Vary the output based on how many times the user used the "verbose" flag
-    // (i.e. 'myprog -v -v -v' or 'myprog -vvv' vs 'myprog -v'
-    match matches.occurrences_of("v") {
-        0 => println!("No verbose info"),
-        1 => println!("Some verbose info"),
-        2 => println!("Tons of verbose info"),
-        3 | _ => println!("Don't be crazy"),
-    }
-
-    // You can handle information about subcommands by requesting their matches by name
-    // (as below), requesting just the name used, or both at the same time
-    if let Some(matches) = matches.subcommand_matches("test") {
-        if matches.is_present("debug") {
-            println!("Printing debug info...");
-        } else {
-            println!("Printing normally...");
-        }
-    }
-
-    // more program logic goes here...
-}
-```
-
-One could also optionally declare their CLI in YAML format and keep your Rust source tidy
-or support multiple localized translations by having different YAML files for each localization.
-
-First, create the `cli.yml` file to hold your CLI options, but it could be called anything we like:
-
-```yaml
-name: myapp
-version: "1.0"
-author: Kevin K. <kbknapp@gmail.com>
-about: Does awesome things
-args:
-    - config:
-        short: c
-        long: config
-        value_name: FILE
-        help: Sets a custom config file
-        takes_value: true
-    - INPUT:
-        help: Sets the input file to use
-        required: true
-        index: 1
-    - verbose:
-        short: v
-        multiple: true
-        help: Sets the level of verbosity
-subcommands:
-    - test:
-        about: controls testing features
-        version: "1.3"
-        author: Someone E. <someone_else@other.com>
-        args:
-            - debug:
-                short: d
-                help: print debug information
-```
-
-Since this feature requires additional dependencies that not everyone may want, it is *not* compiled in by default and we need to enable a feature flag in Cargo.toml:
-
-Simply change your `clap = "2.33"` to `clap = {version = "2.33", features = ["yaml"]}`.
-
-Finally we create our `main.rs` file just like we would have with the previous two examples:
-
-```rust
-// (Full example with detailed comments in examples/17_yaml.rs)
-//
-// This example demonstrates clap's building from YAML style of creating arguments which is far
-// more clean, but takes a very small performance hit compared to the other two methods.
-#[macro_use]
-extern crate clap;
-use clap::App;
-
-fn main() {
-    // The YAML file is found relative to the current file, similar to how modules are found
-    let yaml = load_yaml!("cli.yml");
-    let matches = App::from_yaml(yaml).get_matches();
-
-    // Same as previous examples...
-}
-```
-
-If you were to compile any of the above programs and run them with the flag `--help` or `-h` (or `help` subcommand, since we defined `test` as a subcommand) the following would be output
-
-```sh
-$ myprog --help
-My Super Program 1.0
-Kevin K. <kbknapp@gmail.com>
-Does awesome things
-
-USAGE:
-    MyApp [FLAGS] [OPTIONS] <INPUT> [SUBCOMMAND]
-
-FLAGS:
-    -h, --help       Prints help information
-    -v               Sets the level of verbosity
-    -V, --version    Prints version information
-
-OPTIONS:
-    -c, --config <FILE>    Sets a custom config file
-
-ARGS:
-    INPUT    The input file to use
-
-SUBCOMMANDS:
-    help    Prints this message or the help of the given subcommand(s)
-    test    Controls testing features
-```
-
-**NOTE:** You could also run `myapp test --help` or `myapp help test` to see the help message for the `test` subcommand.
-
-There are also two other methods to create CLIs. Which style you choose is largely a matter of personal preference. The two other methods are:
-
-* Using [usage strings (examples/01a_quick_example.rs)](examples/01a_quick_example.rs) similar to (but not exact) docopt style usage statements. This is far less verbose than the above methods, but incurs a slight runtime penalty.
-* Using [a macro (examples/01c_quick_example.rs)](examples/01c_quick_example.rs) which is like a hybrid of the builder and usage string style. It's less verbose, but doesn't incur the runtime penalty of the usage string style. The downside is that it's harder to debug, and more opaque.
-
-Examples of each method can be found in the [examples/](examples) directory of this repository.
-
-## Try it!
-
-### Pre-Built Test
-
-To try out the pre-built examples, use the following steps:
-
-* Clone the repository `$ git clone https://github.com/clap-rs/clap && cd clap-rs/`
-* Compile the example `$ cargo build --example <EXAMPLE>`
-* Run the help info `$ ./target/debug/examples/<EXAMPLE> --help`
-* Play with the arguments!
-* You can also do a onetime run via `$ cargo run --example <EXAMPLE> -- [args to example]`
-
-### BYOB (Build Your Own Binary)
-
-To test out `clap`'s default auto-generated help/version follow these steps:
-* Create a new cargo project `$ cargo new fake --bin && cd fake`
-* Add `clap` to your `Cargo.toml`
-
-```toml
-[dependencies]
-clap = "2"
-```
-
-* Add the following to your `src/main.rs`
-
-```rust
-extern crate clap;
-use clap::App;
-
-fn main() {
-  App::new("fake").version("v1.0-beta").get_matches();
-}
-```
-
-* Build your program `$ cargo build --release`
-* Run with help or version `$ ./target/release/fake --help` or `$ ./target/release/fake --version`
-
-## Usage
-
-For full usage, add `clap` as a dependency in your `Cargo.toml` () to use from crates.io:
-
-```toml
-[dependencies]
-clap = "~2.33"
-```
-
-(**note**: If you are concerned with supporting a minimum version of Rust that is *older* than the current stable Rust minus 2 stable releases, it's recommended to use the `~major.minor.patch` style versions in your `Cargo.toml` which will only update the patch version automatically. For more information see the [Compatibility Policy](#compatibility-policy))
-
-Then add `extern crate clap;` to your crate root.
-
-Define a list of valid arguments for your program (see the [documentation](https://docs.rs/clap/) or [examples/](examples) directory of this repo)
-
-Then run `cargo build` or `cargo update && cargo build` for your project.
-
-### Optional Dependencies / Features
-
-#### Features enabled by default
-
-* **"suggestions"**: Turns on the `Did you mean '--myoption'?` feature for when users make typos. (builds dependency `strsim`)
-* **"color"**: Turns on colored error messages. This feature only works on non-Windows OSs. (builds dependency `ansi-term` only on non-Windows targets)
-* **"vec_map"**: Use [`VecMap`](https://crates.io/crates/vec_map) internally instead of a [`BTreeMap`](https://doc.rust-lang.org/stable/std/collections/struct.BTreeMap.html). This feature provides a _slight_ performance improvement. (builds dependency `vec_map`)
-
-To disable these, add this to your `Cargo.toml`:
-
-```toml
-[dependencies.clap]
-version = "2.33"
-default-features = false
-```
-
-You can also selectively enable only the features you'd like to include, by adding:
-
-```toml
-[dependencies.clap]
-version = "2.33"
-default-features = false
-
-# Cherry-pick the features you'd like to use
-features = [ "suggestions", "color" ]
-```
-
-#### Opt-in features
-
-* **"yaml"**: Enables building CLIs from YAML documents. (builds dependency `yaml-rust`)
-* **"unstable"**: Enables unstable `clap` features that may change from release to release
-* **"wrap_help"**: Turns on the help text wrapping feature, based on the terminal size. (builds dependency `term-size`)
-
-### Dependencies Tree
-
-The following graphic depicts `clap`s dependency graph (generated using [cargo-graph](https://github.com/kbknapp/cargo-graph)).
-
- * **Dashed** Line: Optional dependency
- * **Red** Color: **NOT** included by default (must use cargo `features` to enable)
- * **Blue** Color: Dev dependency, only used while developing.
-
-![clap dependencies](clap_dep_graph.png)
-
-### More Information
-
-You can find complete documentation on the [docs.rs](https://docs.rs/clap/) for this project.
-
-You can also find usage examples in the [examples/](examples) directory of this repo.
-
-#### Video Tutorials
-
-There's also the video tutorial series [Argument Parsing with Rust v2](https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U).
-
-These videos slowly trickle out as I finish them and currently a work in progress.
-
-## How to Contribute
-
-Details on how to contribute can be found in the [CONTRIBUTING.md](.github/CONTRIBUTING.md) file.
-
-### Compatibility Policy
-
-Because `clap` takes SemVer and compatibility seriously, this is the official policy regarding breaking changes and minimum required versions of Rust.
-
-`clap` will pin the minimum required version of Rust to the CI builds. Bumping the minimum version of Rust is considered a minor breaking change, meaning *at a minimum* the minor version of `clap` will be bumped.
-
-In order to keep from being surprised of breaking changes, it is **highly** recommended to use the `~major.minor.patch` style in your `Cargo.toml` only if you wish to target a version of Rust that is *older* than current stable minus two releases:
-
-```toml
-[dependencies]
-clap = "~2.33"
-```
-
-This will cause *only* the patch version to be updated upon a `cargo update` call, and therefore cannot break due to new features, or bumped minimum versions of Rust.
-
-#### Warning about '~' Dependencies
-
-Using `~` can cause issues in certain circumstances.
-
-From @alexcrichton:
-
-Right now Cargo's version resolution is pretty naive, it's just a brute-force search of the solution space, returning the first resolvable graph. This also means that it currently won't terminate until it proves there is not possible resolvable graph. This leads to situations where workspaces with multiple binaries, for example, have two different dependencies such as:
-
-```toml,no_sync
-
-# In one Cargo.toml
-[dependencies]
-clap = "~2.33.0"
-
-# In another Cargo.toml
-[dependencies]
-clap = "2.33.0"
-```
-
-This is inherently an unresolvable crate graph in Cargo right now. Cargo requires there's only one major version of a crate, and being in the same workspace these two crates must share a version. This is impossible in this location, though, as these version constraints cannot be met.
-
-#### Minimum Version of Rust
-
-`clap` will officially support current stable Rust, minus two releases, but may work with prior releases as well. For example, current stable Rust at the time of this writing is 1.41.0, meaning `clap` is guaranteed to compile with 1.39.0 and beyond.
-
-At the 1.42.0 stable release, `clap` will be guaranteed to compile with 1.40.0 and beyond, etc.
-
-Upon bumping the minimum version of Rust (assuming it's within the stable-2 range), it *must* be clearly annotated in the `CHANGELOG.md`
-
-#### Breaking Changes
-
-`clap` takes a similar policy to Rust and will bump the major version number upon breaking changes with only the following exceptions:
-
- * The breaking change is to fix a security concern
- * The breaking change is to be fixing a bug (i.e. relying on a bug as a feature)
- * The breaking change is a feature isn't used in the wild, or all users of said feature have given approval *prior* to the change
-
-#### Compatibility with Wasm
-
-A best effort is made to ensure that `clap` will work on projects targeting `wasm32-unknown-unknown`. However there is no dedicated CI build
-covering this specific target.
-
-## License
-
-`clap` is licensed under the MIT license. Please read the [LICENSE-MIT](LICENSE-MIT) file in this repository for more information.
-
-## Related Crates
-
-There are several excellent crates which can be used with `clap`, I recommend checking them all out! If you've got a crate that would be a good fit to be used with `clap` open an issue and let me know, I'd love to add it!
-
-* [`structopt`](https://github.com/TeXitoi/structopt) - This crate allows you to define a struct, and build a CLI from it! No more "stringly typed" and it uses `clap` behind the scenes! (*Note*: There is work underway to pull this crate into mainline `clap`).
-* [`assert_cli`](https://github.com/assert-rs/assert_cli) - This crate allows you test your CLIs in a very intuitive and functional way!
-
-## Recent Breaking Changes
-
-`clap` follows semantic versioning, so breaking changes should only happen upon major version bumps. The only exception to this rule is breaking changes that happen due to implementation that was deemed to be a bug, security concerns, or it can be reasonably proved to affect no code. For the full details, see [CHANGELOG.md](./CHANGELOG.md).
-
-As of 2.27.0:
-
-* Argument values now take precedence over subcommand names. This only arises by using unrestrained multiple values and subcommands together where the subcommand name can coincide with one of the multiple values. Such as `$ prog <files>... <subcommand>`. The fix is to place restraints on number of values, or disallow the use of `$ prog <prog-args> <subcommand>` structure.
-
-As of 2.0.0 (From 1.x)
-
-* **Fewer lifetimes! Yay!**
- * `App<'a, 'b, 'c, 'd, 'e, 'f>` => `App<'a, 'b>`
- * `Arg<'a, 'b, 'c, 'd, 'e, 'f>` => `Arg<'a, 'b>`
- * `ArgMatches<'a, 'b>` => `ArgMatches<'a>`
-* **Simply Renamed**
- * `App::arg_group` => `App::group`
- * `App::arg_groups` => `App::groups`
- * `ArgGroup::add` => `ArgGroup::arg`
- * `ArgGroup::add_all` => `ArgGroup::args`
- * `ClapError` => `Error`
-  * struct field `ClapError::error_type` => `Error::kind`
- * `ClapResult` => `Result`
- * `ClapErrorType` => `ErrorKind`
-* **Removed Deprecated Functions and Methods**
- * `App::subcommands_negate_reqs`
- * `App::subcommand_required`
- * `App::arg_required_else_help`
- * `App::global_version(bool)`
- * `App::versionless_subcommands`
- * `App::unified_help_messages`
- * `App::wait_on_error`
- * `App::subcommand_required_else_help`
- * `SubCommand::new`
- * `App::error_on_no_subcommand`
- * `Arg::new`
- * `Arg::mutually_excludes`
- * `Arg::mutually_excludes_all`
- * `Arg::mutually_overrides_with`
- * `simple_enum!`
-* **Renamed Error Variants**
- * `InvalidUnicode` => `InvalidUtf8`
- * `InvalidArgument` => `UnknownArgument`
-* **Usage Parser**
- * Value names can now be specified inline, i.e. `-o, --option <FILE> <FILE2> 'some option which takes two files'`
- * **There is now a priority of order to determine the name** - This is perhaps the biggest breaking change. See the documentation for full details. Prior to this change, the value name took precedence. **Ensure your args are using the proper names (i.e. typically the long or short and NOT the value name) throughout the code**
-* `ArgMatches::values_of` returns an `Values` now which implements `Iterator` (should not break any code)
-* `crate_version!` returns `&'static str` instead of `String`
-
-### Deprecations
-
-Old method names will be left around for several minor version bumps, or one major version bump.
-
-As of 2.27.0:
-
-* **AppSettings::PropagateGlobalValuesDown:**  this setting deprecated and is no longer required to propagate values down or up
diff --git a/third_party/rust/clap/v2/crate/SPONSORS.md b/third_party/rust/clap/v2/crate/SPONSORS.md
deleted file mode 100644
index 67f5544..0000000
--- a/third_party/rust/clap/v2/crate/SPONSORS.md
+++ /dev/null
@@ -1,17 +0,0 @@
-Below is a list of sponsors for the clap-rs project
-
-If you are interested in becoming a sponsor for this project please our [sponsorship page](https://clap.rs/sponsorship/).
-
-## Recurring Sponsors:
-
-| [<img alt="Noelia Seva-Gonzalez" src="https://clap.rs/wp-content/uploads/2017/10/noelia_sm-1.png" width="117">](https://noeliasg.com/about/)  | [<img alt="messense" src="https://clap.rs/wp-content/uploads/2018/01/messense-400x400.png" width="117">](https://github.com/messense)  | [<img alt="Josh" src="https://clap.rs/wp-content/uploads/2018/11/josh_t.jpg" width="117">](https://joshtriplett.org)  | <img alt="Stephen Oats" src="https://clap.rs/wp-content/uploads/2019/03/stephenoats.png" width="117"> |
-|:-:|:-:|:-:|:-:|
-|Noelia Seva-Gonzalez | Messense | Josh Triplett | Stephen Oats |
-
-
-## Single-Donation and Former Sponsors:
-
-| [<img alt="Rob Tsuk" src="https://clap.rs/wp-content/uploads/2017/10/robtsuk_sm.png" width="117">](https://github.com/rtsuk)| | |
-|:-:|:-:|:-:|
-|Rob Tsuk| | |
-
diff --git a/third_party/rust/clap/v2/crate/clap-test.rs b/third_party/rust/clap/v2/crate/clap-test.rs
deleted file mode 100644
index 7d57ac4..0000000
--- a/third_party/rust/clap/v2/crate/clap-test.rs
+++ /dev/null
@@ -1,86 +0,0 @@
-#[allow(unused_imports, dead_code)]
-mod test {
-    use std::str;
-    use std::io::{Cursor, Write};
-
-    use regex::Regex;
-
-    use clap::{App, Arg, SubCommand, ArgGroup};
-
-    fn compare<S, S2>(l: S, r: S2) -> bool
-        where S: AsRef<str>,
-              S2: AsRef<str>
-    {
-        let re = Regex::new("\x1b[^m]*m").unwrap();
-        // Strip out any mismatching \r character on windows that might sneak in on either side
-        let ls = l.as_ref().trim().replace("\r", "");
-        let rs = r.as_ref().trim().replace("\r", "");
-        let left = re.replace_all(&*ls, "");
-        let right = re.replace_all(&*rs, "");
-        let b = left == right;
-        if !b {
-            println!();
-            println!("--> left");
-            println!("{}", left);
-            println!("--> right");
-            println!("{}", right);
-            println!("--")
-        }
-        b
-    }
-
-    pub fn compare_output(l: App, args: &str, right: &str, stderr: bool) -> bool {
-        let mut buf = Cursor::new(Vec::with_capacity(50));
-        let res = l.get_matches_from_safe(args.split(' ').collect::<Vec<_>>());
-        let err = res.unwrap_err();
-        err.write_to(&mut buf).unwrap();
-        let content = buf.into_inner();
-        let left = String::from_utf8(content).unwrap();
-        assert_eq!(stderr, err.use_stderr());
-        compare(left, right)
-    }
-    pub fn compare_output2(l: App, args: &str, right1: &str, right2: &str, stderr: bool) -> bool {
-        let mut buf = Cursor::new(Vec::with_capacity(50));
-        let res = l.get_matches_from_safe(args.split(' ').collect::<Vec<_>>());
-        let err = res.unwrap_err();
-        err.write_to(&mut buf).unwrap();
-        let content = buf.into_inner();
-        let left = String::from_utf8(content).unwrap();
-        assert_eq!(stderr, err.use_stderr());
-        compare(&*left, right1) || compare(&*left, right2)
-    }
-
-    // Legacy tests from the Python script days
-
-    pub fn complex_app() -> App<'static, 'static> {
-        let args = "-o --option=[opt]... 'tests options'
-                    [positional] 'tests positionals'";
-        let opt3_vals = ["fast", "slow"];
-        let pos3_vals = ["vi", "emacs"];
-        App::new("clap-test")
-            .version("v1.4.8")
-            .about("tests clap library")
-            .author("Kevin K. <kbknapp@gmail.com>")
-            .args_from_usage(args)
-            .arg(Arg::from_usage("-f --flag... 'tests flags'")
-                .global(true))
-            .args(&[
-                Arg::from_usage("[flag2] -F 'tests flags with exclusions'").conflicts_with("flag").requires("long-option-2"),
-                Arg::from_usage("--long-option-2 [option2] 'tests long options with exclusions'").conflicts_with("option").requires("positional2"),
-                Arg::from_usage("[positional2] 'tests positionals with exclusions'"),
-                Arg::from_usage("-O --Option [option3] 'specific vals'").possible_values(&opt3_vals),
-                Arg::from_usage("[positional3]... 'tests specific values'").possible_values(&pos3_vals),
-                Arg::from_usage("--multvals [one] [two] 'Tests multiple values, not mult occs'"),
-                Arg::from_usage("--multvalsmo... [one] [two] 'Tests multiple values, and mult occs'"),
-                Arg::from_usage("--minvals2 [minvals]... 'Tests 2 min vals'").min_values(2),
-                Arg::from_usage("--maxvals3 [maxvals]... 'Tests 3 max vals'").max_values(3)
-            ])
-            .subcommand(SubCommand::with_name("subcmd")
-                                    .about("tests subcommands")
-                                    .version("0.1")
-                                    .author("Kevin K. <kbknapp@gmail.com>")
-                                    .arg_from_usage("-o --option [scoption]... 'tests options'")
-                                    .arg_from_usage("-s --subcmdarg [subcmdarg] 'tests other args'")
-                                    .arg_from_usage("[scpositional] 'tests positionals'"))
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/justfile b/third_party/rust/clap/v2/crate/justfile
deleted file mode 100644
index 0768764..0000000
--- a/third_party/rust/clap/v2/crate/justfile
+++ /dev/null
@@ -1,39 +0,0 @@
-@update-contributors:
-	echo 'Removing old CONTRIBUTORS.md'
-	mv CONTRIBUTORS.md CONTRIBUTORS.md.bak
-	echo 'Downloading a list of new contributors'
-	echo "the following is a list of contributors:" > CONTRIBUTORS.md
-	echo "" >> CONTRIBUTORS.md
-	echo "" >> CONTRIBUTORS.md
-	githubcontrib --owner clap-rs --repo clap --sha master --cols 6 --format md --showlogin true --sortBy contributions --sortOrder desc >> CONTRIBUTORS.md
-	echo "" >> CONTRIBUTORS.md
-	echo "" >> CONTRIBUTORS.md
-	echo "This list was generated by [mgechev/github-contributors-list](https://github.com/mgechev/github-contributors-list)" >> CONTRIBUTORS.md
-	rm CONTRIBUTORS.md.bak
-
-run-test TEST:
-	cargo test --test {{TEST}}
-
-debug TEST:
-	cargo test --test {{TEST}} --features debug
-
-run-tests:
-	cargo test --features "yaml unstable"
-
-@bench: nightly
-	cargo bench && just remove-nightly
-
-nightly:
-	rustup override add nightly
-
-remove-nightly:
-	rustup override remove
-
-@lint: nightly
-	cargo build --features lints && just remove-nightly
-
-clean:
-	cargo clean
-	find . -type f -name "*.orig" -exec rm {} \;
-	find . -type f -name "*.bk" -exec rm {} \;
-	find . -type f -name ".*~" -exec rm {} \;
diff --git a/third_party/rust/clap/v2/crate/src/app/help.rs b/third_party/rust/clap/v2/crate/src/app/help.rs
deleted file mode 100644
index 4751fe7..0000000
--- a/third_party/rust/clap/v2/crate/src/app/help.rs
+++ /dev/null
@@ -1,1031 +0,0 @@
-// Std
-use std::borrow::Cow;
-use std::cmp;
-use std::collections::BTreeMap;
-use std::fmt::Display;
-use std::io::{self, Cursor, Read, Write};
-use std::usize;
-
-// Internal
-use app::parser::Parser;
-use app::usage;
-use app::{App, AppSettings};
-use args::{AnyArg, ArgSettings, DispOrder};
-use errors::{Error, Result as ClapResult};
-use fmt::{Colorizer, ColorizerOption, Format};
-use map::VecMap;
-use INTERNAL_ERROR_MSG;
-
-// Third Party
-#[cfg(feature = "wrap_help")]
-use term_size;
-use textwrap;
-use unicode_width::UnicodeWidthStr;
-
-#[cfg(not(feature = "wrap_help"))]
-mod term_size {
-    pub fn dimensions() -> Option<(usize, usize)> {
-        None
-    }
-}
-
-fn str_width(s: &str) -> usize {
-    UnicodeWidthStr::width(s)
-}
-
-const TAB: &'static str = "    ";
-
-// These are just convenient traits to make the code easier to read.
-trait ArgWithDisplay<'b, 'c>: AnyArg<'b, 'c> + Display {}
-impl<'b, 'c, T> ArgWithDisplay<'b, 'c> for T where T: AnyArg<'b, 'c> + Display {}
-
-trait ArgWithOrder<'b, 'c>: ArgWithDisplay<'b, 'c> + DispOrder {
-    fn as_base(&self) -> &ArgWithDisplay<'b, 'c>;
-}
-impl<'b, 'c, T> ArgWithOrder<'b, 'c> for T
-where
-    T: ArgWithDisplay<'b, 'c> + DispOrder,
-{
-    fn as_base(&self) -> &ArgWithDisplay<'b, 'c> {
-        self
-    }
-}
-
-fn as_arg_trait<'a, 'b, T: ArgWithOrder<'a, 'b>>(x: &T) -> &ArgWithOrder<'a, 'b> {
-    x
-}
-
-impl<'b, 'c> DispOrder for App<'b, 'c> {
-    fn disp_ord(&self) -> usize {
-        999
-    }
-}
-
-macro_rules! color {
-    ($_self:ident, $s:expr, $c:ident) => {
-        if $_self.color {
-            write!($_self.writer, "{}", $_self.cizer.$c($s))
-        } else {
-            write!($_self.writer, "{}", $s)
-        }
-    };
-    ($_self:ident, $fmt_s:expr, $v:expr, $c:ident) => {
-        if $_self.color {
-            write!($_self.writer, "{}", $_self.cizer.$c(format!($fmt_s, $v)))
-        } else {
-            write!($_self.writer, $fmt_s, $v)
-        }
-    };
-}
-
-/// `clap` Help Writer.
-///
-/// Wraps a writer stream providing different methods to generate help for `clap` objects.
-pub struct Help<'a> {
-    writer: &'a mut Write,
-    next_line_help: bool,
-    hide_pv: bool,
-    term_w: usize,
-    color: bool,
-    cizer: Colorizer,
-    longest: usize,
-    force_next_line: bool,
-    use_long: bool,
-}
-
-// Public Functions
-impl<'a> Help<'a> {
-    /// Create a new `Help` instance.
-    #[cfg_attr(feature = "cargo-clippy", allow(too_many_arguments))]
-    pub fn new(
-        w: &'a mut Write,
-        next_line_help: bool,
-        hide_pv: bool,
-        color: bool,
-        cizer: Colorizer,
-        term_w: Option<usize>,
-        max_w: Option<usize>,
-        use_long: bool,
-    ) -> Self {
-        debugln!("Help::new;");
-        Help {
-            writer: w,
-            next_line_help: next_line_help,
-            hide_pv: hide_pv,
-            term_w: match term_w {
-                Some(width) => {
-                    if width == 0 {
-                        usize::MAX
-                    } else {
-                        width
-                    }
-                }
-                None => cmp::min(
-                    term_size::dimensions().map_or(120, |(w, _)| w),
-                    match max_w {
-                        None | Some(0) => usize::MAX,
-                        Some(mw) => mw,
-                    },
-                ),
-            },
-            color: color,
-            cizer: cizer,
-            longest: 0,
-            force_next_line: false,
-            use_long: use_long,
-        }
-    }
-
-    /// Reads help settings from an App
-    /// and write its help to the wrapped stream.
-    pub fn write_app_help(w: &'a mut Write, app: &App, use_long: bool) -> ClapResult<()> {
-        debugln!("Help::write_app_help;");
-        Self::write_parser_help(w, &app.p, use_long)
-    }
-
-    /// Reads help settings from a Parser
-    /// and write its help to the wrapped stream.
-    pub fn write_parser_help(w: &'a mut Write, parser: &Parser, use_long: bool) -> ClapResult<()> {
-        debugln!("Help::write_parser_help;");
-        Self::_write_parser_help(w, parser, false, use_long)
-    }
-
-    /// Reads help settings from a Parser
-    /// and write its help to the wrapped stream which will be stderr. This method prevents
-    /// formatting when required.
-    pub fn write_parser_help_to_stderr(w: &'a mut Write, parser: &Parser) -> ClapResult<()> {
-        debugln!("Help::write_parser_help;");
-        Self::_write_parser_help(w, parser, true, false)
-    }
-
-    #[doc(hidden)]
-    pub fn _write_parser_help(
-        w: &'a mut Write,
-        parser: &Parser,
-        stderr: bool,
-        use_long: bool,
-    ) -> ClapResult<()> {
-        debugln!("Help::write_parser_help;");
-        let nlh = parser.is_set(AppSettings::NextLineHelp);
-        let hide_v = parser.is_set(AppSettings::HidePossibleValuesInHelp);
-        let color = parser.is_set(AppSettings::ColoredHelp);
-        let cizer = Colorizer::new(ColorizerOption {
-            use_stderr: stderr,
-            when: parser.color(),
-        });
-        Self::new(
-            w,
-            nlh,
-            hide_v,
-            color,
-            cizer,
-            parser.meta.term_w,
-            parser.meta.max_w,
-            use_long,
-        )
-        .write_help(parser)
-    }
-
-    /// Writes the parser help to the wrapped stream.
-    pub fn write_help(&mut self, parser: &Parser) -> ClapResult<()> {
-        debugln!("Help::write_help;");
-        if let Some(h) = parser.meta.help_str {
-            write!(self.writer, "{}", h).map_err(Error::from)?;
-        } else if let Some(tmpl) = parser.meta.template {
-            self.write_templated_help(parser, tmpl)?;
-        } else {
-            self.write_default_help(parser)?;
-        }
-        Ok(())
-    }
-}
-
-// Methods to write AnyArg help.
-impl<'a> Help<'a> {
-    /// Writes help for each argument in the order they were declared to the wrapped stream.
-    fn write_args_unsorted<'b: 'd, 'c: 'd, 'd, I: 'd>(&mut self, args: I) -> io::Result<()>
-    where
-        I: Iterator<Item = &'d ArgWithOrder<'b, 'c>>,
-    {
-        debugln!("Help::write_args_unsorted;");
-        // The shortest an arg can legally be is 2 (i.e. '-x')
-        self.longest = 2;
-        let mut arg_v = Vec::with_capacity(10);
-        let use_long = self.use_long;
-        for arg in args.filter(|arg| should_show_arg(use_long, *arg)) {
-            if arg.longest_filter() {
-                self.longest = cmp::max(self.longest, str_width(arg.to_string().as_str()));
-            }
-            arg_v.push(arg)
-        }
-        let mut first = true;
-        for arg in arg_v {
-            if first {
-                first = false;
-            } else {
-                self.writer.write_all(b"\n")?;
-            }
-            self.write_arg(arg.as_base())?;
-        }
-        Ok(())
-    }
-
-    /// Sorts arguments by length and display order and write their help to the wrapped stream.
-    fn write_args<'b: 'd, 'c: 'd, 'd, I: 'd>(&mut self, args: I) -> io::Result<()>
-    where
-        I: Iterator<Item = &'d ArgWithOrder<'b, 'c>>,
-    {
-        debugln!("Help::write_args;");
-        // The shortest an arg can legally be is 2 (i.e. '-x')
-        self.longest = 2;
-        let mut ord_m = VecMap::new();
-        let use_long = self.use_long;
-        // Determine the longest
-        for arg in args.filter(|arg| {
-            // If it's NextLineHelp, but we don't care to compute how long because it may be
-            // NextLineHelp on purpose *because* it's so long and would throw off all other
-            // args alignment
-            should_show_arg(use_long, *arg)
-        }) {
-            if arg.longest_filter() {
-                debugln!("Help::write_args: Current Longest...{}", self.longest);
-                self.longest = cmp::max(self.longest, str_width(arg.to_string().as_str()));
-                debugln!("Help::write_args: New Longest...{}", self.longest);
-            }
-            let btm = ord_m.entry(arg.disp_ord()).or_insert(BTreeMap::new());
-            btm.insert(arg.name(), arg);
-        }
-        let mut first = true;
-        for btm in ord_m.values() {
-            for arg in btm.values() {
-                if first {
-                    first = false;
-                } else {
-                    self.writer.write_all(b"\n")?;
-                }
-                self.write_arg(arg.as_base())?;
-            }
-        }
-        Ok(())
-    }
-
-    /// Writes help for an argument to the wrapped stream.
-    fn write_arg<'b, 'c>(&mut self, arg: &ArgWithDisplay<'b, 'c>) -> io::Result<()> {
-        debugln!("Help::write_arg;");
-        self.short(arg)?;
-        self.long(arg)?;
-        let spec_vals = self.val(arg)?;
-        self.help(arg, &*spec_vals)?;
-        Ok(())
-    }
-
-    /// Writes argument's short command to the wrapped stream.
-    fn short<'b, 'c>(&mut self, arg: &ArgWithDisplay<'b, 'c>) -> io::Result<()> {
-        debugln!("Help::short;");
-        write!(self.writer, "{}", TAB)?;
-        if let Some(s) = arg.short() {
-            color!(self, "-{}", s, good)
-        } else if arg.has_switch() {
-            write!(self.writer, "{}", TAB)
-        } else {
-            Ok(())
-        }
-    }
-
-    /// Writes argument's long command to the wrapped stream.
-    fn long<'b, 'c>(&mut self, arg: &ArgWithDisplay<'b, 'c>) -> io::Result<()> {
-        debugln!("Help::long;");
-        if !arg.has_switch() {
-            return Ok(());
-        }
-        if arg.takes_value() {
-            if let Some(l) = arg.long() {
-                if arg.short().is_some() {
-                    write!(self.writer, ", ")?;
-                }
-                color!(self, "--{}", l, good)?
-            }
-
-            let sep = if arg.is_set(ArgSettings::RequireEquals) {
-                "="
-            } else {
-                " "
-            };
-            write!(self.writer, "{}", sep)?;
-        } else if let Some(l) = arg.long() {
-            if arg.short().is_some() {
-                write!(self.writer, ", ")?;
-            }
-            color!(self, "--{}", l, good)?;
-        }
-        Ok(())
-    }
-
-    /// Writes argument's possible values to the wrapped stream.
-    fn val<'b, 'c>(&mut self, arg: &ArgWithDisplay<'b, 'c>) -> Result<String, io::Error> {
-        debugln!("Help::val: arg={}", arg);
-        if arg.takes_value() {
-            let delim = if arg.is_set(ArgSettings::RequireDelimiter) {
-                arg.val_delim().expect(INTERNAL_ERROR_MSG)
-            } else {
-                ' '
-            };
-            if let Some(vec) = arg.val_names() {
-                let mut it = vec.iter().peekable();
-                while let Some((_, val)) = it.next() {
-                    color!(self, "<{}>", val, good)?;
-                    if it.peek().is_some() {
-                        write!(self.writer, "{}", delim)?;
-                    }
-                }
-                let num = vec.len();
-                if arg.is_set(ArgSettings::Multiple) && num == 1 {
-                    color!(self, "...", good)?;
-                }
-            } else if let Some(num) = arg.num_vals() {
-                let mut it = (0..num).peekable();
-                while let Some(_) = it.next() {
-                    color!(self, "<{}>", arg.name(), good)?;
-                    if it.peek().is_some() {
-                        write!(self.writer, "{}", delim)?;
-                    }
-                }
-                if arg.is_set(ArgSettings::Multiple) && num == 1 {
-                    color!(self, "...", good)?;
-                }
-            } else if arg.has_switch() {
-                color!(self, "<{}>", arg.name(), good)?;
-                if arg.is_set(ArgSettings::Multiple) {
-                    color!(self, "...", good)?;
-                }
-            } else {
-                color!(self, "{}", arg, good)?;
-            }
-        }
-
-        let spec_vals = self.spec_vals(arg);
-        let h = arg.help().unwrap_or("");
-        let h_w = str_width(h) + str_width(&*spec_vals);
-        let nlh = self.next_line_help || arg.is_set(ArgSettings::NextLineHelp);
-        let taken = self.longest + 12;
-        self.force_next_line = !nlh
-            && self.term_w >= taken
-            && (taken as f32 / self.term_w as f32) > 0.40
-            && h_w > (self.term_w - taken);
-
-        debug!("Help::val: Has switch...");
-        if arg.has_switch() {
-            sdebugln!("Yes");
-            debugln!("Help::val: force_next_line...{:?}", self.force_next_line);
-            debugln!("Help::val: nlh...{:?}", nlh);
-            debugln!("Help::val: taken...{}", taken);
-            debugln!(
-                "Help::val: help_width > (width - taken)...{} > ({} - {})",
-                h_w,
-                self.term_w,
-                taken
-            );
-            debugln!("Help::val: longest...{}", self.longest);
-            debug!("Help::val: next_line...");
-            if !(nlh || self.force_next_line) {
-                sdebugln!("No");
-                let self_len = str_width(arg.to_string().as_str());
-                // subtract ourself
-                let mut spcs = self.longest - self_len;
-                // Since we're writing spaces from the tab point we first need to know if we
-                // had a long and short, or just short
-                if arg.long().is_some() {
-                    // Only account 4 after the val
-                    spcs += 4;
-                } else {
-                    // Only account for ', --' + 4 after the val
-                    spcs += 8;
-                }
-
-                write_nspaces!(self.writer, spcs);
-            } else {
-                sdebugln!("Yes");
-            }
-        } else if !(nlh || self.force_next_line) {
-            sdebugln!("No, and not next_line");
-            write_nspaces!(
-                self.writer,
-                self.longest + 4 - (str_width(arg.to_string().as_str()))
-            );
-        } else {
-            sdebugln!("No");
-        }
-        Ok(spec_vals)
-    }
-
-    fn write_before_after_help(&mut self, h: &str) -> io::Result<()> {
-        debugln!("Help::write_before_after_help;");
-        let mut help = String::from(h);
-        // determine if our help fits or needs to wrap
-        debugln!(
-            "Help::write_before_after_help: Term width...{}",
-            self.term_w
-        );
-        let too_long = str_width(h) >= self.term_w;
-
-        debug!("Help::write_before_after_help: Too long...");
-        if too_long || h.contains("{n}") {
-            sdebugln!("Yes");
-            debugln!("Help::write_before_after_help: help: {}", help);
-            debugln!(
-                "Help::write_before_after_help: help width: {}",
-                str_width(&*help)
-            );
-            // Determine how many newlines we need to insert
-            debugln!(
-                "Help::write_before_after_help: Usable space: {}",
-                self.term_w
-            );
-            help = wrap_help(&help.replace("{n}", "\n"), self.term_w);
-        } else {
-            sdebugln!("No");
-        }
-        write!(self.writer, "{}", help)?;
-        Ok(())
-    }
-
-    /// Writes argument's help to the wrapped stream.
-    fn help<'b, 'c>(&mut self, arg: &ArgWithDisplay<'b, 'c>, spec_vals: &str) -> io::Result<()> {
-        debugln!("Help::help;");
-        let h = if self.use_long && arg.name() != "" {
-            arg.long_help().unwrap_or_else(|| arg.help().unwrap_or(""))
-        } else {
-            arg.help().unwrap_or_else(|| arg.long_help().unwrap_or(""))
-        };
-        let mut help = String::from(h) + spec_vals;
-        let nlh = self.next_line_help
-            || arg.is_set(ArgSettings::NextLineHelp)
-            || (self.use_long && arg.name() != "");
-        debugln!("Help::help: Next Line...{:?}", nlh);
-
-        let spcs = if nlh || self.force_next_line {
-            12 // "tab" * 3
-        } else {
-            self.longest + 12
-        };
-
-        let too_long = spcs + str_width(h) + str_width(&*spec_vals) >= self.term_w;
-
-        // Is help on next line, if so then indent
-        if nlh || self.force_next_line {
-            write!(self.writer, "\n{}{}{}", TAB, TAB, TAB)?;
-        }
-
-        debug!("Help::help: Too long...");
-        if too_long && spcs <= self.term_w || h.contains("{n}") {
-            sdebugln!("Yes");
-            debugln!("Help::help: help...{}", help);
-            debugln!("Help::help: help width...{}", str_width(&*help));
-            // Determine how many newlines we need to insert
-            let avail_chars = self.term_w - spcs;
-            debugln!("Help::help: Usable space...{}", avail_chars);
-            help = wrap_help(&help.replace("{n}", "\n"), avail_chars);
-        } else {
-            sdebugln!("No");
-        }
-        if let Some(part) = help.lines().next() {
-            write!(self.writer, "{}", part)?;
-        }
-        for part in help.lines().skip(1) {
-            write!(self.writer, "\n")?;
-            if nlh || self.force_next_line {
-                write!(self.writer, "{}{}{}", TAB, TAB, TAB)?;
-            } else if arg.has_switch() {
-                write_nspaces!(self.writer, self.longest + 12);
-            } else {
-                write_nspaces!(self.writer, self.longest + 8);
-            }
-            write!(self.writer, "{}", part)?;
-        }
-        if !help.contains('\n') && (nlh || self.force_next_line) {
-            write!(self.writer, "\n")?;
-        }
-        Ok(())
-    }
-
-    fn spec_vals(&self, a: &ArgWithDisplay) -> String {
-        debugln!("Help::spec_vals: a={}", a);
-        let mut spec_vals = vec![];
-        if let Some(ref env) = a.env() {
-            debugln!(
-                "Help::spec_vals: Found environment variable...[{:?}:{:?}]",
-                env.0,
-                env.1
-            );
-            let env_val = if !a.is_set(ArgSettings::HideEnvValues) {
-                format!(
-                    "={}",
-                    env.1.map_or(Cow::Borrowed(""), |val| val.to_string_lossy())
-                )
-            } else {
-                String::new()
-            };
-            let env_info = format!(" [env: {}{}]", env.0.to_string_lossy(), env_val);
-            spec_vals.push(env_info);
-        }
-        if !a.is_set(ArgSettings::HideDefaultValue) {
-            if let Some(pv) = a.default_val() {
-                debugln!("Help::spec_vals: Found default value...[{:?}]", pv);
-                spec_vals.push(format!(
-                    " [default: {}]",
-                    if self.color {
-                        self.cizer.good(pv.to_string_lossy())
-                    } else {
-                        Format::None(pv.to_string_lossy())
-                    }
-                ));
-            }
-        }
-        if let Some(ref aliases) = a.aliases() {
-            debugln!("Help::spec_vals: Found aliases...{:?}", aliases);
-            spec_vals.push(format!(
-                " [aliases: {}]",
-                if self.color {
-                    aliases
-                        .iter()
-                        .map(|v| format!("{}", self.cizer.good(v)))
-                        .collect::<Vec<_>>()
-                        .join(", ")
-                } else {
-                    aliases.join(", ")
-                }
-            ));
-        }
-        if !self.hide_pv && !a.is_set(ArgSettings::HidePossibleValues) {
-            if let Some(pv) = a.possible_vals() {
-                debugln!("Help::spec_vals: Found possible vals...{:?}", pv);
-                spec_vals.push(if self.color {
-                    format!(
-                        " [possible values: {}]",
-                        pv.iter()
-                            .map(|v| format!("{}", self.cizer.good(v)))
-                            .collect::<Vec<_>>()
-                            .join(", ")
-                    )
-                } else {
-                    format!(" [possible values: {}]", pv.join(", "))
-                });
-            }
-        }
-        spec_vals.join(" ")
-    }
-}
-
-fn should_show_arg(use_long: bool, arg: &ArgWithOrder) -> bool {
-    if arg.is_set(ArgSettings::Hidden) {
-        return false;
-    }
-
-    (!arg.is_set(ArgSettings::HiddenLongHelp) && use_long)
-        || (!arg.is_set(ArgSettings::HiddenShortHelp) && !use_long)
-        || arg.is_set(ArgSettings::NextLineHelp)
-}
-
-// Methods to write Parser help.
-impl<'a> Help<'a> {
-    /// Writes help for all arguments (options, flags, args, subcommands)
-    /// including titles of a Parser Object to the wrapped stream.
-    #[cfg_attr(feature = "lints", allow(useless_let_if_seq))]
-    #[cfg_attr(feature = "cargo-clippy", allow(useless_let_if_seq))]
-    pub fn write_all_args(&mut self, parser: &Parser) -> ClapResult<()> {
-        debugln!("Help::write_all_args;");
-        let flags = parser.has_flags();
-        let pos = parser
-            .positionals()
-            .filter(|arg| !arg.is_set(ArgSettings::Hidden))
-            .count()
-            > 0;
-        let opts = parser.has_opts();
-        let subcmds = parser.has_visible_subcommands();
-
-        let unified_help = parser.is_set(AppSettings::UnifiedHelpMessage);
-
-        let mut first = true;
-
-        if unified_help && (flags || opts) {
-            let opts_flags = parser
-                .flags()
-                .map(as_arg_trait)
-                .chain(parser.opts().map(as_arg_trait));
-            color!(self, "OPTIONS:\n", warning)?;
-            self.write_args(opts_flags)?;
-            first = false;
-        } else {
-            if flags {
-                color!(self, "FLAGS:\n", warning)?;
-                self.write_args(parser.flags().map(as_arg_trait))?;
-                first = false;
-            }
-            if opts {
-                if !first {
-                    self.writer.write_all(b"\n\n")?;
-                }
-                color!(self, "OPTIONS:\n", warning)?;
-                self.write_args(parser.opts().map(as_arg_trait))?;
-                first = false;
-            }
-        }
-
-        if pos {
-            if !first {
-                self.writer.write_all(b"\n\n")?;
-            }
-            color!(self, "ARGS:\n", warning)?;
-            self.write_args_unsorted(parser.positionals().map(as_arg_trait))?;
-            first = false;
-        }
-
-        if subcmds {
-            if !first {
-                self.writer.write_all(b"\n\n")?;
-            }
-            color!(self, "SUBCOMMANDS:\n", warning)?;
-            self.write_subcommands(parser)?;
-        }
-
-        Ok(())
-    }
-
-    /// Writes help for subcommands of a Parser Object to the wrapped stream.
-    fn write_subcommands(&mut self, parser: &Parser) -> io::Result<()> {
-        debugln!("Help::write_subcommands;");
-        // The shortest an arg can legally be is 2 (i.e. '-x')
-        self.longest = 2;
-        let mut ord_m = VecMap::new();
-        for sc in parser
-            .subcommands
-            .iter()
-            .filter(|s| !s.p.is_set(AppSettings::Hidden))
-        {
-            let btm = ord_m.entry(sc.p.meta.disp_ord).or_insert(BTreeMap::new());
-            self.longest = cmp::max(self.longest, str_width(sc.p.meta.name.as_str()));
-            //self.longest = cmp::max(self.longest, sc.p.meta.name.len());
-            btm.insert(sc.p.meta.name.clone(), sc.clone());
-        }
-
-        let mut first = true;
-        for btm in ord_m.values() {
-            for sc in btm.values() {
-                if first {
-                    first = false;
-                } else {
-                    self.writer.write_all(b"\n")?;
-                }
-                self.write_arg(sc)?;
-            }
-        }
-        Ok(())
-    }
-
-    /// Writes version of a Parser Object to the wrapped stream.
-    fn write_version(&mut self, parser: &Parser) -> io::Result<()> {
-        debugln!("Help::write_version;");
-        write!(self.writer, "{}", parser.meta.version.unwrap_or(""))?;
-        Ok(())
-    }
-
-    /// Writes binary name of a Parser Object to the wrapped stream.
-    fn write_bin_name(&mut self, parser: &Parser) -> io::Result<()> {
-        debugln!("Help::write_bin_name;");
-        macro_rules! write_name {
-            () => {{
-                let mut name = parser.meta.name.clone();
-                name = name.replace("{n}", "\n");
-                color!(self, wrap_help(&name, self.term_w), good)?;
-            }};
-        }
-        if let Some(bn) = parser.meta.bin_name.as_ref() {
-            if bn.contains(' ') {
-                // Incase we're dealing with subcommands i.e. git mv is translated to git-mv
-                color!(self, bn.replace(" ", "-"), good)?
-            } else {
-                write_name!();
-            }
-        } else {
-            write_name!();
-        }
-        Ok(())
-    }
-
-    /// Writes default help for a Parser Object to the wrapped stream.
-    pub fn write_default_help(&mut self, parser: &Parser) -> ClapResult<()> {
-        debugln!("Help::write_default_help;");
-        if let Some(h) = parser.meta.pre_help {
-            self.write_before_after_help(h)?;
-            self.writer.write_all(b"\n\n")?;
-        }
-
-        macro_rules! write_thing {
-            ($thing:expr) => {{
-                let mut owned_thing = $thing.to_owned();
-                owned_thing = owned_thing.replace("{n}", "\n");
-                write!(self.writer, "{}\n", wrap_help(&owned_thing, self.term_w))?
-            }};
-        }
-        // Print the version
-        self.write_bin_name(parser)?;
-        self.writer.write_all(b" ")?;
-        self.write_version(parser)?;
-        self.writer.write_all(b"\n")?;
-        if let Some(author) = parser.meta.author {
-            write_thing!(author)
-        }
-        // if self.use_long {
-        //     if let Some(about) = parser.meta.long_about {
-        //         debugln!("Help::write_default_help: writing long about");
-        //         write_thing!(about)
-        //     } else if let Some(about) = parser.meta.about {
-        //         debugln!("Help::write_default_help: writing about");
-        //         write_thing!(about)
-        //     }
-        // } else
-        if let Some(about) = parser.meta.long_about {
-            debugln!("Help::write_default_help: writing long about");
-            write_thing!(about)
-        } else if let Some(about) = parser.meta.about {
-            debugln!("Help::write_default_help: writing about");
-            write_thing!(about)
-        }
-
-        color!(self, "\nUSAGE:", warning)?;
-        write!(
-            self.writer,
-            "\n{}{}\n\n",
-            TAB,
-            usage::create_usage_no_title(parser, &[])
-        )?;
-
-        let flags = parser.has_flags();
-        let pos = parser.has_positionals();
-        let opts = parser.has_opts();
-        let subcmds = parser.has_subcommands();
-
-        if flags || opts || pos || subcmds {
-            self.write_all_args(parser)?;
-        }
-
-        if let Some(h) = parser.meta.more_help {
-            if flags || opts || pos || subcmds {
-                self.writer.write_all(b"\n\n")?;
-            }
-            self.write_before_after_help(h)?;
-        }
-
-        self.writer.flush().map_err(Error::from)
-    }
-}
-
-/// Possible results for a copying function that stops when a given
-/// byte was found.
-enum CopyUntilResult {
-    DelimiterFound(usize),
-    DelimiterNotFound(usize),
-    ReaderEmpty,
-    ReadError(io::Error),
-    WriteError(io::Error),
-}
-
-/// Copies the contents of a reader into a writer until a delimiter byte is found.
-/// On success, the total number of bytes that were
-/// copied from reader to writer is returned.
-fn copy_until<R: Read, W: Write>(r: &mut R, w: &mut W, delimiter_byte: u8) -> CopyUntilResult {
-    debugln!("copy_until;");
-
-    let mut count = 0;
-    for wb in r.bytes() {
-        match wb {
-            Ok(b) => {
-                if b == delimiter_byte {
-                    return CopyUntilResult::DelimiterFound(count);
-                }
-                match w.write(&[b]) {
-                    Ok(c) => count += c,
-                    Err(e) => return CopyUntilResult::WriteError(e),
-                }
-            }
-            Err(e) => return CopyUntilResult::ReadError(e),
-        }
-    }
-    if count > 0 {
-        CopyUntilResult::DelimiterNotFound(count)
-    } else {
-        CopyUntilResult::ReaderEmpty
-    }
-}
-
-/// Copies the contents of a reader into a writer until a {tag} is found,
-/// copying the tag content to a buffer and returning its size.
-/// In addition to errors, there are three possible outputs:
-///   - `None`: The reader was consumed.
-///   - `Some(Ok(0))`: No tag was captured but the reader still contains data.
-///   - `Some(Ok(length>0))`: a tag with `length` was captured to the `tag_buffer`.
-fn copy_and_capture<R: Read, W: Write>(
-    r: &mut R,
-    w: &mut W,
-    tag_buffer: &mut Cursor<Vec<u8>>,
-) -> Option<io::Result<usize>> {
-    use self::CopyUntilResult::*;
-    debugln!("copy_and_capture;");
-
-    // Find the opening byte.
-    match copy_until(r, w, b'{') {
-        // The end of the reader was reached without finding the opening tag.
-        // (either with or without having copied data to the writer)
-        // Return None indicating that we are done.
-        ReaderEmpty | DelimiterNotFound(_) => None,
-
-        // Something went wrong.
-        ReadError(e) | WriteError(e) => Some(Err(e)),
-
-        // The opening byte was found.
-        // (either with or without having copied data to the writer)
-        DelimiterFound(_) => {
-            // Lets reset the buffer first and find out how long it is.
-            tag_buffer.set_position(0);
-            let buffer_size = tag_buffer.get_ref().len();
-
-            // Find the closing byte,limiting the reader to the length of the buffer.
-            let mut rb = r.take(buffer_size as u64);
-            match copy_until(&mut rb, tag_buffer, b'}') {
-                // We were already at the end of the reader.
-                // Return None indicating that we are done.
-                ReaderEmpty => None,
-
-                // The closing tag was found.
-                // Return the tag_length.
-                DelimiterFound(tag_length) => Some(Ok(tag_length)),
-
-                // The end of the reader was found without finding the closing tag.
-                // Write the opening byte and captured text to the writer.
-                // Return 0 indicating that nothing was captured but the reader still contains data.
-                DelimiterNotFound(not_tag_length) => match w.write(b"{") {
-                    Err(e) => Some(Err(e)),
-                    _ => match w.write(&tag_buffer.get_ref()[0..not_tag_length]) {
-                        Err(e) => Some(Err(e)),
-                        _ => Some(Ok(0)),
-                    },
-                },
-
-                ReadError(e) | WriteError(e) => Some(Err(e)),
-            }
-        }
-    }
-}
-
-// Methods to write Parser help using templates.
-impl<'a> Help<'a> {
-    /// Write help to stream for the parser in the format defined by the template.
-    ///
-    /// Tags arg given inside curly brackets:
-    /// Valid tags are:
-    ///     * `{bin}`         - Binary name.
-    ///     * `{version}`     - Version number.
-    ///     * `{author}`      - Author information.
-    ///     * `{usage}`       - Automatically generated or given usage string.
-    ///     * `{all-args}`    - Help for all arguments (options, flags, positionals arguments,
-    ///                         and subcommands) including titles.
-    ///     * `{unified}`     - Unified help for options and flags.
-    ///     * `{flags}`       - Help for flags.
-    ///     * `{options}`     - Help for options.
-    ///     * `{positionals}` - Help for positionals arguments.
-    ///     * `{subcommands}` - Help for subcommands.
-    ///     * `{after-help}`  - Info to be displayed after the help message.
-    ///     * `{before-help}` - Info to be displayed before the help message.
-    ///
-    /// The template system is, on purpose, very simple. Therefore the tags have to written
-    /// in the lowercase and without spacing.
-    fn write_templated_help(&mut self, parser: &Parser, template: &str) -> ClapResult<()> {
-        debugln!("Help::write_templated_help;");
-        let mut tmplr = Cursor::new(&template);
-        let mut tag_buf = Cursor::new(vec![0u8; 15]);
-
-        // The strategy is to copy the template from the reader to wrapped stream
-        // until a tag is found. Depending on its value, the appropriate content is copied
-        // to the wrapped stream.
-        // The copy from template is then resumed, repeating this sequence until reading
-        // the complete template.
-
-        loop {
-            let tag_length = match copy_and_capture(&mut tmplr, &mut self.writer, &mut tag_buf) {
-                None => return Ok(()),
-                Some(Err(e)) => return Err(Error::from(e)),
-                Some(Ok(val)) if val > 0 => val,
-                _ => continue,
-            };
-
-            debugln!("Help::write_template_help:iter: tag_buf={};", unsafe {
-                String::from_utf8_unchecked(
-                    tag_buf.get_ref()[0..tag_length]
-                        .iter()
-                        .map(|&i| i)
-                        .collect::<Vec<_>>(),
-                )
-            });
-            match &tag_buf.get_ref()[0..tag_length] {
-                b"?" => {
-                    self.writer.write_all(b"Could not decode tag name")?;
-                }
-                b"bin" => {
-                    self.write_bin_name(parser)?;
-                }
-                b"version" => {
-                    write!(
-                        self.writer,
-                        "{}",
-                        parser.meta.version.unwrap_or("unknown version")
-                    )?;
-                }
-                b"author" => {
-                    write!(
-                        self.writer,
-                        "{}",
-                        parser.meta.author.unwrap_or("unknown author")
-                    )?;
-                }
-                b"about" => {
-                    write!(
-                        self.writer,
-                        "{}",
-                        parser.meta.about.unwrap_or("unknown about")
-                    )?;
-                }
-                b"long-about" => {
-                    write!(
-                        self.writer,
-                        "{}",
-                        parser.meta.long_about.unwrap_or("unknown about")
-                    )?;
-                }
-                b"usage" => {
-                    write!(self.writer, "{}", usage::create_usage_no_title(parser, &[]))?;
-                }
-                b"all-args" => {
-                    self.write_all_args(parser)?;
-                }
-                b"unified" => {
-                    let opts_flags = parser
-                        .flags()
-                        .map(as_arg_trait)
-                        .chain(parser.opts().map(as_arg_trait));
-                    self.write_args(opts_flags)?;
-                }
-                b"flags" => {
-                    self.write_args(parser.flags().map(as_arg_trait))?;
-                }
-                b"options" => {
-                    self.write_args(parser.opts().map(as_arg_trait))?;
-                }
-                b"positionals" => {
-                    self.write_args(parser.positionals().map(as_arg_trait))?;
-                }
-                b"subcommands" => {
-                    self.write_subcommands(parser)?;
-                }
-                b"after-help" => {
-                    write!(
-                        self.writer,
-                        "{}",
-                        parser.meta.more_help.unwrap_or("unknown after-help")
-                    )?;
-                }
-                b"before-help" => {
-                    write!(
-                        self.writer,
-                        "{}",
-                        parser.meta.pre_help.unwrap_or("unknown before-help")
-                    )?;
-                }
-                // Unknown tag, write it back.
-                r => {
-                    self.writer.write_all(b"{")?;
-                    self.writer.write_all(r)?;
-                    self.writer.write_all(b"}")?;
-                }
-            }
-        }
-    }
-}
-
-fn wrap_help(help: &str, avail_chars: usize) -> String {
-    let wrapper = textwrap::Wrapper::new(avail_chars).break_words(false);
-    help.lines()
-        .map(|line| wrapper.fill(line))
-        .collect::<Vec<String>>()
-        .join("\n")
-}
-
-#[cfg(test)]
-mod test {
-    use super::wrap_help;
-
-    #[test]
-    fn wrap_help_last_word() {
-        let help = String::from("foo bar baz");
-        assert_eq!(wrap_help(&help, 5), "foo\nbar\nbaz");
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/app/meta.rs b/third_party/rust/clap/v2/crate/src/app/meta.rs
deleted file mode 100644
index 89161010..0000000
--- a/third_party/rust/clap/v2/crate/src/app/meta.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-#[doc(hidden)]
-#[allow(missing_debug_implementations)]
-#[derive(Default, Clone)]
-pub struct AppMeta<'b> {
-    pub name: String,
-    pub bin_name: Option<String>,
-    pub author: Option<&'b str>,
-    pub version: Option<&'b str>,
-    pub long_version: Option<&'b str>,
-    pub about: Option<&'b str>,
-    pub long_about: Option<&'b str>,
-    pub more_help: Option<&'b str>,
-    pub pre_help: Option<&'b str>,
-    pub aliases: Option<Vec<(&'b str, bool)>>, // (name, visible)
-    pub usage_str: Option<&'b str>,
-    pub usage: Option<String>,
-    pub help_str: Option<&'b str>,
-    pub disp_ord: usize,
-    pub term_w: Option<usize>,
-    pub max_w: Option<usize>,
-    pub template: Option<&'b str>,
-}
-
-impl<'b> AppMeta<'b> {
-    pub fn new() -> Self {
-        Default::default()
-    }
-    pub fn with_name(s: String) -> Self {
-        AppMeta {
-            name: s,
-            disp_ord: 999,
-            ..Default::default()
-        }
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/app/mod.rs b/third_party/rust/clap/v2/crate/src/app/mod.rs
deleted file mode 100644
index 3fff846..0000000
--- a/third_party/rust/clap/v2/crate/src/app/mod.rs
+++ /dev/null
@@ -1,1904 +0,0 @@
-mod help;
-mod meta;
-pub mod parser;
-mod settings;
-mod usage;
-mod validator;
-
-// Std
-use std::env;
-use std::ffi::{OsStr, OsString};
-use std::fmt;
-use std::io::{self, BufRead, BufWriter, Write};
-use std::path::Path;
-use std::process;
-use std::rc::Rc;
-use std::result::Result as StdResult;
-
-// Third Party
-#[cfg(feature = "yaml")]
-use yaml_rust::Yaml;
-
-// Internal
-pub use self::settings::AppSettings;
-use app::help::Help;
-use app::parser::Parser;
-use args::{AnyArg, Arg, ArgGroup, ArgMatcher, ArgMatches, ArgSettings};
-use completions::Shell;
-use errors::Result as ClapResult;
-use map::{self, VecMap};
-
-/// Used to create a representation of a command line program and all possible command line
-/// arguments. Application settings are set using the "builder pattern" with the
-/// [`App::get_matches`] family of methods being the terminal methods that starts the
-/// runtime-parsing process. These methods then return information about the user supplied
-/// arguments (or lack there of).
-///
-/// **NOTE:** There aren't any mandatory "options" that one must set. The "options" may
-/// also appear in any order (so long as one of the [`App::get_matches`] methods is the last method
-/// called).
-///
-/// # Examples
-///
-/// ```no_run
-/// # use clap::{App, Arg};
-/// let m = App::new("My Program")
-///     .author("Me, me@mail.com")
-///     .version("1.0.2")
-///     .about("Explains in brief what the program does")
-///     .arg(
-///         Arg::with_name("in_file").index(1)
-///     )
-///     .after_help("Longer explanation to appear after the options when \
-///                  displaying the help information from --help or -h")
-///     .get_matches();
-///
-/// // Your program logic starts here...
-/// ```
-/// [`App::get_matches`]: ./struct.App.html#method.get_matches
-#[allow(missing_debug_implementations)]
-pub struct App<'a, 'b>
-where
-    'a: 'b,
-{
-    #[doc(hidden)]
-    pub p: Parser<'a, 'b>,
-}
-
-impl<'a, 'b> App<'a, 'b> {
-    /// Creates a new instance of an application requiring a name. The name may be, but doesn't
-    /// have to be same as the binary. The name will be displayed to the user when they request to
-    /// print version or help and usage information.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let prog = App::new("My Program")
-    /// # ;
-    /// ```
-    pub fn new<S: Into<String>>(n: S) -> Self {
-        App {
-            p: Parser::with_name(n.into()),
-        }
-    }
-
-    /// Get the name of the app
-    pub fn get_name(&self) -> &str {
-        &self.p.meta.name
-    }
-
-    /// Get the name of the binary
-    pub fn get_bin_name(&self) -> Option<&str> {
-        self.p.meta.bin_name.as_ref().map(|s| s.as_str())
-    }
-
-    /// Creates a new instance of an application requiring a name, but uses the [`crate_authors!`]
-    /// and [`crate_version!`] macros to fill in the [`App::author`] and [`App::version`] fields.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let prog = App::with_defaults("My Program")
-    /// # ;
-    /// ```
-    /// [`crate_authors!`]: ./macro.crate_authors!.html
-    /// [`crate_version!`]: ./macro.crate_version!.html
-    /// [`App::author`]: ./struct.App.html#method.author
-    /// [`App::version`]: ./struct.App.html#method.author
-    #[deprecated(
-        since = "2.14.1",
-        note = "Can never work; use explicit App::author() and App::version() calls instead"
-    )]
-    pub fn with_defaults<S: Into<String>>(n: S) -> Self {
-        let mut a = App {
-            p: Parser::with_name(n.into()),
-        };
-        a.p.meta.author = Some("Kevin K. <kbknapp@gmail.com>");
-        a.p.meta.version = Some("2.19.2");
-        a
-    }
-
-    /// Creates a new instance of [`App`] from a .yml (YAML) file. A full example of supported YAML
-    /// objects can be found in [`examples/17_yaml.rs`] and [`examples/17_yaml.yml`]. One great use
-    /// for using YAML is when supporting multiple languages and dialects, as each language could
-    /// be a distinct YAML file and determined at compiletime via `cargo` "features" in your
-    /// `Cargo.toml`
-    ///
-    /// In order to use this function you must compile `clap` with the `features = ["yaml"]` in
-    /// your settings for the `[dependencies.clap]` table of your `Cargo.toml`
-    ///
-    /// **NOTE:** Due to how the YAML objects are built there is a convenience macro for loading
-    /// the YAML file at compile time (relative to the current file, like modules work). That YAML
-    /// object can then be passed to this function.
-    ///
-    /// # Panics
-    ///
-    /// The YAML file must be properly formatted or this function will [`panic!`]. A good way to
-    /// ensure this doesn't happen is to run your program with the `--help` switch. If this passes
-    /// without error, you needn't worry because the YAML is properly formatted.
-    ///
-    /// # Examples
-    ///
-    /// The following example shows how to load a properly formatted YAML file to build an instance
-    /// of an [`App`] struct.
-    ///
-    /// ```ignore
-    /// # #[macro_use]
-    /// # extern crate clap;
-    /// # use clap::App;
-    /// # fn main() {
-    /// let yml = load_yaml!("app.yml");
-    /// let app = App::from_yaml(yml);
-    ///
-    /// // continued logic goes here, such as `app.get_matches()` etc.
-    /// # }
-    /// ```
-    /// [`App`]: ./struct.App.html
-    /// [`examples/17_yaml.rs`]: https://github.com/clap-rs/clap/blob/v2.33.1/examples/17_yaml.rs
-    /// [`examples/17_yaml.yml`]: https://github.com/clap-rs/clap/blob/v2.33.1/examples/17_yaml.yml
-    /// [`panic!`]: https://doc.rust-lang.org/std/macro.panic!.html
-    #[cfg(feature = "yaml")]
-    pub fn from_yaml(yaml: &'a Yaml) -> App<'a, 'a> {
-        App::from(yaml)
-    }
-
-    /// Sets a string of author(s) that will be displayed to the user when they
-    /// request the help information with `--help` or `-h`.
-    ///
-    /// **Pro-tip:** Use `clap`s convenience macro [`crate_authors!`] to automatically set your
-    /// application's author(s) to the same thing as your crate at compile time. See the [`examples/`]
-    /// directory for more information
-    ///
-    /// See the [`examples/`]
-    /// directory for more information
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///      .author("Me, me@mymain.com")
-    /// # ;
-    /// ```
-    /// [`crate_authors!`]: ./macro.crate_authors!.html
-    /// [`examples/`]: https://github.com/clap-rs/clap/tree/v2.33.1/examples
-    pub fn author<S: Into<&'b str>>(mut self, author: S) -> Self {
-        self.p.meta.author = Some(author.into());
-        self
-    }
-
-    /// Overrides the system-determined binary name. This should only be used when absolutely
-    /// necessary, such as when the binary name for your application is misleading, or perhaps
-    /// *not* how the user should invoke your program.
-    ///
-    /// **Pro-tip:** When building things such as third party `cargo` subcommands, this setting
-    /// **should** be used!
-    ///
-    /// **NOTE:** This command **should not** be used for [`SubCommand`]s.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("My Program")
-    ///      .bin_name("my_binary")
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    pub fn bin_name<S: Into<String>>(mut self, name: S) -> Self {
-        self.p.meta.bin_name = Some(name.into());
-        self
-    }
-
-    /// Sets a string describing what the program does. This will be displayed when displaying help
-    /// information with `-h`.
-    ///
-    /// **NOTE:** If only `about` is provided, and not [`App::long_about`] but the user requests
-    /// `--help` clap will still display the contents of `about` appropriately
-    ///
-    /// **NOTE:** Only [`App::about`] is used in completion script generation in order to be
-    /// concise
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .about("Does really amazing things to great people")
-    /// # ;
-    /// ```
-    /// [`App::long_about`]: ./struct.App.html#method.long_about
-    pub fn about<S: Into<&'b str>>(mut self, about: S) -> Self {
-        self.p.meta.about = Some(about.into());
-        self
-    }
-
-    /// Sets a string describing what the program does. This will be displayed when displaying help
-    /// information.
-    ///
-    /// **NOTE:** If only `long_about` is provided, and not [`App::about`] but the user requests
-    /// `-h` clap will still display the contents of `long_about` appropriately
-    ///
-    /// **NOTE:** Only [`App::about`] is used in completion script generation in order to be
-    /// concise
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .long_about(
-    /// "Does really amazing things to great people. Now let's talk a little
-    ///  more in depth about how this subcommand really works. It may take about
-    ///  a few lines of text, but that's ok!")
-    /// # ;
-    /// ```
-    /// [`App::about`]: ./struct.App.html#method.about
-    pub fn long_about<S: Into<&'b str>>(mut self, about: S) -> Self {
-        self.p.meta.long_about = Some(about.into());
-        self
-    }
-
-    /// Sets the program's name. This will be displayed when displaying help information.
-    ///
-    /// **Pro-top:** This function is particularly useful when configuring a program via
-    /// [`App::from_yaml`] in conjunction with the [`crate_name!`] macro to derive the program's
-    /// name from its `Cargo.toml`.
-    ///
-    /// # Examples
-    /// ```ignore
-    /// # #[macro_use]
-    /// # extern crate clap;
-    /// # use clap::App;
-    /// # fn main() {
-    /// let yml = load_yaml!("app.yml");
-    /// let app = App::from_yaml(yml)
-    ///     .name(crate_name!());
-    ///
-    /// // continued logic goes here, such as `app.get_matches()` etc.
-    /// # }
-    /// ```
-    ///
-    /// [`App::from_yaml`]: ./struct.App.html#method.from_yaml
-    /// [`crate_name!`]: ./macro.crate_name.html
-    pub fn name<S: Into<String>>(mut self, name: S) -> Self {
-        self.p.meta.name = name.into();
-        self
-    }
-
-    /// Adds additional help information to be displayed in addition to auto-generated help. This
-    /// information is displayed **after** the auto-generated help information. This is often used
-    /// to describe how to use the arguments, or caveats to be noted.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::App;
-    /// App::new("myprog")
-    ///     .after_help("Does really amazing things to great people...but be careful with -R")
-    /// # ;
-    /// ```
-    pub fn after_help<S: Into<&'b str>>(mut self, help: S) -> Self {
-        self.p.meta.more_help = Some(help.into());
-        self
-    }
-
-    /// Adds additional help information to be displayed in addition to auto-generated help. This
-    /// information is displayed **before** the auto-generated help information. This is often used
-    /// for header information.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::App;
-    /// App::new("myprog")
-    ///     .before_help("Some info I'd like to appear before the help info")
-    /// # ;
-    /// ```
-    pub fn before_help<S: Into<&'b str>>(mut self, help: S) -> Self {
-        self.p.meta.pre_help = Some(help.into());
-        self
-    }
-
-    /// Sets a string of the version number to be displayed when displaying version or help
-    /// information with `-V`.
-    ///
-    /// **NOTE:** If only `version` is provided, and not [`App::long_version`] but the user
-    /// requests `--version` clap will still display the contents of `version` appropriately
-    ///
-    /// **Pro-tip:** Use `clap`s convenience macro [`crate_version!`] to automatically set your
-    /// application's version to the same thing as your crate at compile time. See the [`examples/`]
-    /// directory for more information
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .version("v0.1.24")
-    /// # ;
-    /// ```
-    /// [`crate_version!`]: ./macro.crate_version!.html
-    /// [`examples/`]: https://github.com/clap-rs/clap/tree/v2.33.1/examples
-    /// [`App::long_version`]: ./struct.App.html#method.long_version
-    pub fn version<S: Into<&'b str>>(mut self, ver: S) -> Self {
-        self.p.meta.version = Some(ver.into());
-        self
-    }
-
-    /// Sets a string of the version number to be displayed when displaying version or help
-    /// information with `--version`.
-    ///
-    /// **NOTE:** If only `long_version` is provided, and not [`App::version`] but the user
-    /// requests `-V` clap will still display the contents of `long_version` appropriately
-    ///
-    /// **Pro-tip:** Use `clap`s convenience macro [`crate_version!`] to automatically set your
-    /// application's version to the same thing as your crate at compile time. See the [`examples/`]
-    /// directory for more information
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .long_version(
-    /// "v0.1.24
-    ///  commit: abcdef89726d
-    ///  revision: 123
-    ///  release: 2
-    ///  binary: myprog")
-    /// # ;
-    /// ```
-    /// [`crate_version!`]: ./macro.crate_version!.html
-    /// [`examples/`]: https://github.com/clap-rs/clap/tree/v2.33.1/examples
-    /// [`App::version`]: ./struct.App.html#method.version
-    pub fn long_version<S: Into<&'b str>>(mut self, ver: S) -> Self {
-        self.p.meta.long_version = Some(ver.into());
-        self
-    }
-
-    /// Sets a custom usage string to override the auto-generated usage string.
-    ///
-    /// This will be displayed to the user when errors are found in argument parsing, or when you
-    /// call [`ArgMatches::usage`]
-    ///
-    /// **CAUTION:** Using this setting disables `clap`s "context-aware" usage strings. After this
-    /// setting is set, this will be the only usage string displayed to the user!
-    ///
-    /// **NOTE:** You do not need to specify the "USAGE: \n\t" portion, as that will
-    /// still be applied by `clap`, you only need to specify the portion starting
-    /// with the binary name.
-    ///
-    /// **NOTE:** This will not replace the entire help message, *only* the portion
-    /// showing the usage.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .usage("myapp [-clDas] <some_file>")
-    /// # ;
-    /// ```
-    /// [`ArgMatches::usage`]: ./struct.ArgMatches.html#method.usage
-    pub fn usage<S: Into<&'b str>>(mut self, usage: S) -> Self {
-        self.p.meta.usage_str = Some(usage.into());
-        self
-    }
-
-    /// Sets a custom help message and overrides the auto-generated one. This should only be used
-    /// when the auto-generated message does not suffice.
-    ///
-    /// This will be displayed to the user when they use `--help` or `-h`
-    ///
-    /// **NOTE:** This replaces the **entire** help message, so nothing will be auto-generated.
-    ///
-    /// **NOTE:** This **only** replaces the help message for the current command, meaning if you
-    /// are using subcommands, those help messages will still be auto-generated unless you
-    /// specify a [`Arg::help`] for them as well.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myapp")
-    ///     .help("myapp v1.0\n\
-    ///            Does awesome things\n\
-    ///            (C) me@mail.com\n\n\
-    ///
-    ///            USAGE: myapp <opts> <command>\n\n\
-    ///
-    ///            Options:\n\
-    ///            -h, --help       Display this message\n\
-    ///            -V, --version    Display version info\n\
-    ///            -s <stuff>       Do something with stuff\n\
-    ///            -v               Be verbose\n\n\
-    ///
-    ///            Commmands:\n\
-    ///            help             Prints this message\n\
-    ///            work             Do some work")
-    /// # ;
-    /// ```
-    /// [`Arg::help`]: ./struct.Arg.html#method.help
-    pub fn help<S: Into<&'b str>>(mut self, help: S) -> Self {
-        self.p.meta.help_str = Some(help.into());
-        self
-    }
-
-    /// Sets the [`short`] for the auto-generated `help` argument.
-    ///
-    /// By default `clap` automatically assigns `h`, but this can be overridden if you have a
-    /// different argument which you'd prefer to use the `-h` short with. This can be done by
-    /// defining your own argument with a lowercase `h` as the [`short`].
-    ///
-    /// `clap` lazily generates these `help` arguments **after** you've defined any arguments of
-    /// your own.
-    ///
-    /// **NOTE:** Any leading `-` characters will be stripped, and only the first
-    /// non `-` character will be used as the [`short`] version
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .help_short("H") // Using an uppercase `H` instead of the default lowercase `h`
-    /// # ;
-    /// ```
-    /// [`short`]: ./struct.Arg.html#method.short
-    pub fn help_short<S: AsRef<str> + 'b>(mut self, s: S) -> Self {
-        self.p.help_short(s.as_ref());
-        self
-    }
-
-    /// Sets the [`short`] for the auto-generated `version` argument.
-    ///
-    /// By default `clap` automatically assigns `V`, but this can be overridden if you have a
-    /// different argument which you'd prefer to use the `-V` short with. This can be done by
-    /// defining your own argument with an uppercase `V` as the [`short`].
-    ///
-    /// `clap` lazily generates these `version` arguments **after** you've defined any arguments of
-    /// your own.
-    ///
-    /// **NOTE:** Any leading `-` characters will be stripped, and only the first
-    /// non `-` character will be used as the `short` version
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .version_short("v") // Using a lowercase `v` instead of the default capital `V`
-    /// # ;
-    /// ```
-    /// [`short`]: ./struct.Arg.html#method.short
-    pub fn version_short<S: AsRef<str>>(mut self, s: S) -> Self {
-        self.p.version_short(s.as_ref());
-        self
-    }
-
-    /// Sets the help text for the auto-generated `help` argument.
-    ///
-    /// By default `clap` sets this to `"Prints help information"`, but if you're using a
-    /// different convention for your help messages and would prefer a different phrasing you can
-    /// override it.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .help_message("Print help information") // Perhaps you want imperative help messages
-    ///
-    /// # ;
-    /// ```
-    pub fn help_message<S: Into<&'a str>>(mut self, s: S) -> Self {
-        self.p.help_message = Some(s.into());
-        self
-    }
-
-    /// Sets the help text for the auto-generated `version` argument.
-    ///
-    /// By default `clap` sets this to `"Prints version information"`, but if you're using a
-    /// different convention for your help messages and would prefer a different phrasing then you
-    /// can change it.
-    ///
-    /// # Examples
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .version_message("Print version information") // Perhaps you want imperative help messages
-    /// # ;
-    /// ```
-    pub fn version_message<S: Into<&'a str>>(mut self, s: S) -> Self {
-        self.p.version_message = Some(s.into());
-        self
-    }
-
-    /// Sets the help template to be used, overriding the default format.
-    ///
-    /// Tags arg given inside curly brackets.
-    ///
-    /// Valid tags are:
-    ///
-    ///   * `{bin}`         - Binary name.
-    ///   * `{version}`     - Version number.
-    ///   * `{author}`      - Author information.
-    ///   * `{about}`       - General description (from [`App::about`])
-    ///   * `{usage}`       - Automatically generated or given usage string.
-    ///   * `{all-args}`    - Help for all arguments (options, flags, positionals arguments,
-    ///                       and subcommands) including titles.
-    ///   * `{unified}`     - Unified help for options and flags. Note, you must *also* set
-    ///                       [`AppSettings::UnifiedHelpMessage`] to fully merge both options and
-    ///                       flags, otherwise the ordering is "best effort"
-    ///   * `{flags}`       - Help for flags.
-    ///   * `{options}`     - Help for options.
-    ///   * `{positionals}` - Help for positionals arguments.
-    ///   * `{subcommands}` - Help for subcommands.
-    ///   * `{after-help}`  - Help from [`App::after_help`]
-    ///   * `{before-help}`  - Help from [`App::before_help`]
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .version("1.0")
-    ///     .template("{bin} ({version}) - {usage}")
-    /// # ;
-    /// ```
-    /// **NOTE:** The template system is, on purpose, very simple. Therefore the tags have to be
-    /// written in lowercase and without spacing.
-    ///
-    /// [`App::about`]: ./struct.App.html#method.about
-    /// [`App::after_help`]: ./struct.App.html#method.after_help
-    /// [`App::before_help`]: ./struct.App.html#method.before_help
-    /// [`AppSettings::UnifiedHelpMessage`]: ./enum.AppSettings.html#variant.UnifiedHelpMessage
-    pub fn template<S: Into<&'b str>>(mut self, s: S) -> Self {
-        self.p.meta.template = Some(s.into());
-        self
-    }
-
-    /// Enables a single command, or [`SubCommand`], level settings.
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::SubcommandRequired)
-    ///     .setting(AppSettings::WaitOnError)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn setting(mut self, setting: AppSettings) -> Self {
-        self.p.set(setting);
-        self
-    }
-
-    /// Enables multiple command, or [`SubCommand`], level settings
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .settings(&[AppSettings::SubcommandRequired,
-    ///                  AppSettings::WaitOnError])
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn settings(mut self, settings: &[AppSettings]) -> Self {
-        for s in settings {
-            self.p.set(*s);
-        }
-        self
-    }
-
-    /// Enables a single setting that is propagated down through all child [`SubCommand`]s.
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// **NOTE**: The setting is *only* propagated *down* and not up through parent commands.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .global_setting(AppSettings::SubcommandRequired)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn global_setting(mut self, setting: AppSettings) -> Self {
-        self.p.set(setting);
-        self.p.g_settings.set(setting);
-        self
-    }
-
-    /// Enables multiple settings which are propagated *down* through all child [`SubCommand`]s.
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// **NOTE**: The setting is *only* propagated *down* and not up through parent commands.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .global_settings(&[AppSettings::SubcommandRequired,
-    ///                  AppSettings::ColoredHelp])
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn global_settings(mut self, settings: &[AppSettings]) -> Self {
-        for s in settings {
-            self.p.set(*s);
-            self.p.g_settings.set(*s)
-        }
-        self
-    }
-
-    /// Disables a single command, or [`SubCommand`], level setting.
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, AppSettings};
-    /// App::new("myprog")
-    ///     .unset_setting(AppSettings::ColorAuto)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn unset_setting(mut self, setting: AppSettings) -> Self {
-        self.p.unset(setting);
-        self
-    }
-
-    /// Disables multiple command, or [`SubCommand`], level settings.
-    ///
-    /// See [`AppSettings`] for a full list of possibilities and examples.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, AppSettings};
-    /// App::new("myprog")
-    ///     .unset_settings(&[AppSettings::ColorAuto,
-    ///                       AppSettings::AllowInvalidUtf8])
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings`]: ./enum.AppSettings.html
-    pub fn unset_settings(mut self, settings: &[AppSettings]) -> Self {
-        for s in settings {
-            self.p.unset(*s);
-        }
-        self
-    }
-
-    /// Sets the terminal width at which to wrap help messages. Defaults to `120`. Using `0` will
-    /// ignore terminal widths and use source formatting.
-    ///
-    /// `clap` automatically tries to determine the terminal width on Unix, Linux, macOS and Windows
-    /// if the `wrap_help` cargo "feature" has been used while compiling. If the terminal width
-    /// cannot be determined, `clap` defaults to `120`.
-    ///
-    /// **NOTE:** This setting applies globally and *not* on a per-command basis.
-    ///
-    /// **NOTE:** This setting must be set **before** any subcommands are added!
-    ///
-    /// # Platform Specific
-    ///
-    /// Only Unix, Linux, macOS and Windows support automatic determination of terminal width.
-    /// Even on those platforms, this setting is useful if for any reason the terminal width
-    /// cannot be determined.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::App;
-    /// App::new("myprog")
-    ///     .set_term_width(80)
-    /// # ;
-    /// ```
-    pub fn set_term_width(mut self, width: usize) -> Self {
-        self.p.meta.term_w = Some(width);
-        self
-    }
-
-    /// Sets the max terminal width at which to wrap help messages. Using `0` will ignore terminal
-    /// widths and use source formatting.
-    ///
-    /// `clap` automatically tries to determine the terminal width on Unix, Linux, macOS and Windows
-    /// if the `wrap_help` cargo "feature" has been used while compiling, but one might want to
-    /// limit the size (e.g. when the terminal is running fullscreen).
-    ///
-    /// **NOTE:** This setting applies globally and *not* on a per-command basis.
-    ///
-    /// **NOTE:** This setting must be set **before** any subcommands are added!
-    ///
-    /// # Platform Specific
-    ///
-    /// Only Unix, Linux, macOS and Windows support automatic determination of terminal width.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::App;
-    /// App::new("myprog")
-    ///     .max_term_width(100)
-    /// # ;
-    /// ```
-    pub fn max_term_width(mut self, w: usize) -> Self {
-        self.p.meta.max_w = Some(w);
-        self
-    }
-
-    /// Adds an [argument] to the list of valid possibilities.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     // Adding a single "flag" argument with a short and help text, using Arg::with_name()
-    ///     .arg(
-    ///         Arg::with_name("debug")
-    ///            .short("d")
-    ///            .help("turns on debugging mode")
-    ///     )
-    ///     // Adding a single "option" argument with a short, a long, and help text using the less
-    ///     // verbose Arg::from_usage()
-    ///     .arg(
-    ///         Arg::from_usage("-c --config=[CONFIG] 'Optionally sets a config file to use'")
-    ///     )
-    /// # ;
-    /// ```
-    /// [argument]: ./struct.Arg.html
-    pub fn arg<A: Into<Arg<'a, 'b>>>(mut self, a: A) -> Self {
-        self.p.add_arg(a.into());
-        self
-    }
-
-    /// Adds multiple [arguments] to the list of valid possibilities
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .args(
-    ///         &[Arg::from_usage("[debug] -d 'turns on debugging info'"),
-    ///          Arg::with_name("input").index(1).help("the input file to use")]
-    ///     )
-    /// # ;
-    /// ```
-    /// [arguments]: ./struct.Arg.html
-    pub fn args(mut self, args: &[Arg<'a, 'b>]) -> Self {
-        for arg in args {
-            self.p.add_arg_ref(arg);
-        }
-        self
-    }
-
-    /// A convenience method for adding a single [argument] from a usage type string. The string
-    /// used follows the same rules and syntax as [`Arg::from_usage`]
-    ///
-    /// **NOTE:** The downside to using this method is that you can not set any additional
-    /// properties of the [`Arg`] other than what [`Arg::from_usage`] supports.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .arg_from_usage("-c --config=<FILE> 'Sets a configuration file to use'")
-    /// # ;
-    /// ```
-    /// [argument]: ./struct.Arg.html
-    /// [`Arg`]: ./struct.Arg.html
-    /// [`Arg::from_usage`]: ./struct.Arg.html#method.from_usage
-    pub fn arg_from_usage(mut self, usage: &'a str) -> Self {
-        self.p.add_arg(Arg::from_usage(usage));
-        self
-    }
-
-    /// Adds multiple [arguments] at once from a usage string, one per line. See
-    /// [`Arg::from_usage`] for details on the syntax and rules supported.
-    ///
-    /// **NOTE:** Like [`App::arg_from_usage`] the downside is you only set properties for the
-    /// [`Arg`]s which [`Arg::from_usage`] supports.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// App::new("myprog")
-    ///     .args_from_usage(
-    ///         "-c --config=[FILE] 'Sets a configuration file to use'
-    ///          [debug]... -d 'Sets the debugging level'
-    ///          <FILE> 'The input file to use'"
-    ///     )
-    /// # ;
-    /// ```
-    /// [arguments]: ./struct.Arg.html
-    /// [`Arg::from_usage`]: ./struct.Arg.html#method.from_usage
-    /// [`App::arg_from_usage`]: ./struct.App.html#method.arg_from_usage
-    /// [`Arg`]: ./struct.Arg.html
-    pub fn args_from_usage(mut self, usage: &'a str) -> Self {
-        for line in usage.lines() {
-            let l = line.trim();
-            if l.is_empty() {
-                continue;
-            }
-            self.p.add_arg(Arg::from_usage(l));
-        }
-        self
-    }
-
-    /// Allows adding a [`SubCommand`] alias, which function as "hidden" subcommands that
-    /// automatically dispatch as if this subcommand was used. This is more efficient, and easier
-    /// than creating multiple hidden subcommands as one only needs to check for the existence of
-    /// this command, and not all variants.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    /// let m = App::new("myprog")
-    ///             .subcommand(SubCommand::with_name("test")
-    ///                 .alias("do-stuff"))
-    ///             .get_matches_from(vec!["myprog", "do-stuff"]);
-    /// assert_eq!(m.subcommand_name(), Some("test"));
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    pub fn alias<S: Into<&'b str>>(mut self, name: S) -> Self {
-        if let Some(ref mut als) = self.p.meta.aliases {
-            als.push((name.into(), false));
-        } else {
-            self.p.meta.aliases = Some(vec![(name.into(), false)]);
-        }
-        self
-    }
-
-    /// Allows adding [`SubCommand`] aliases, which function as "hidden" subcommands that
-    /// automatically dispatch as if this subcommand was used. This is more efficient, and easier
-    /// than creating multiple hidden subcommands as one only needs to check for the existence of
-    /// this command, and not all variants.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, SubCommand};
-    /// let m = App::new("myprog")
-    ///             .subcommand(SubCommand::with_name("test")
-    ///                 .aliases(&["do-stuff", "do-tests", "tests"]))
-    ///                 .arg(Arg::with_name("input")
-    ///                             .help("the file to add")
-    ///                             .index(1)
-    ///                             .required(false))
-    ///             .get_matches_from(vec!["myprog", "do-tests"]);
-    /// assert_eq!(m.subcommand_name(), Some("test"));
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    pub fn aliases(mut self, names: &[&'b str]) -> Self {
-        if let Some(ref mut als) = self.p.meta.aliases {
-            for n in names {
-                als.push((n, false));
-            }
-        } else {
-            self.p.meta.aliases = Some(names.iter().map(|n| (*n, false)).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Allows adding a [`SubCommand`] alias that functions exactly like those defined with
-    /// [`App::alias`], except that they are visible inside the help message.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    /// let m = App::new("myprog")
-    ///             .subcommand(SubCommand::with_name("test")
-    ///                 .visible_alias("do-stuff"))
-    ///             .get_matches_from(vec!["myprog", "do-stuff"]);
-    /// assert_eq!(m.subcommand_name(), Some("test"));
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`App::alias`]: ./struct.App.html#method.alias
-    pub fn visible_alias<S: Into<&'b str>>(mut self, name: S) -> Self {
-        if let Some(ref mut als) = self.p.meta.aliases {
-            als.push((name.into(), true));
-        } else {
-            self.p.meta.aliases = Some(vec![(name.into(), true)]);
-        }
-        self
-    }
-
-    /// Allows adding multiple [`SubCommand`] aliases that functions exactly like those defined
-    /// with [`App::aliases`], except that they are visible inside the help message.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    /// let m = App::new("myprog")
-    ///             .subcommand(SubCommand::with_name("test")
-    ///                 .visible_aliases(&["do-stuff", "tests"]))
-    ///             .get_matches_from(vec!["myprog", "do-stuff"]);
-    /// assert_eq!(m.subcommand_name(), Some("test"));
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`App::aliases`]: ./struct.App.html#method.aliases
-    pub fn visible_aliases(mut self, names: &[&'b str]) -> Self {
-        if let Some(ref mut als) = self.p.meta.aliases {
-            for n in names {
-                als.push((n, true));
-            }
-        } else {
-            self.p.meta.aliases = Some(names.iter().map(|n| (*n, true)).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Adds an [`ArgGroup`] to the application. [`ArgGroup`]s are a family of related arguments.
-    /// By placing them in a logical group, you can build easier requirement and exclusion rules.
-    /// For instance, you can make an entire [`ArgGroup`] required, meaning that one (and *only*
-    /// one) argument from that group must be present at runtime.
-    ///
-    /// You can also do things such as name an [`ArgGroup`] as a conflict to another argument.
-    /// Meaning any of the arguments that belong to that group will cause a failure if present with
-    /// the conflicting argument.
-    ///
-    /// Another added benefit of [`ArgGroup`]s is that you can extract a value from a group instead
-    /// of determining exactly which argument was used.
-    ///
-    /// Finally, using [`ArgGroup`]s to ensure exclusion between arguments is another very common
-    /// use
-    ///
-    /// # Examples
-    ///
-    /// The following example demonstrates using an [`ArgGroup`] to ensure that one, and only one,
-    /// of the arguments from the specified group is present at runtime.
-    ///
-    /// ```no_run
-    /// # use clap::{App, ArgGroup};
-    /// App::new("app")
-    ///     .args_from_usage(
-    ///         "--set-ver [ver] 'set the version manually'
-    ///          --major         'auto increase major'
-    ///          --minor         'auto increase minor'
-    ///          --patch         'auto increase patch'")
-    ///     .group(ArgGroup::with_name("vers")
-    ///          .args(&["set-ver", "major", "minor","patch"])
-    ///          .required(true))
-    /// # ;
-    /// ```
-    /// [`ArgGroup`]: ./struct.ArgGroup.html
-    pub fn group(mut self, group: ArgGroup<'a>) -> Self {
-        self.p.add_group(group);
-        self
-    }
-
-    /// Adds multiple [`ArgGroup`]s to the [`App`] at once.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, ArgGroup};
-    /// App::new("app")
-    ///     .args_from_usage(
-    ///         "--set-ver [ver] 'set the version manually'
-    ///          --major         'auto increase major'
-    ///          --minor         'auto increase minor'
-    ///          --patch         'auto increase patch'
-    ///          -c [FILE]       'a config file'
-    ///          -i [IFACE]      'an interface'")
-    ///     .groups(&[
-    ///         ArgGroup::with_name("vers")
-    ///             .args(&["set-ver", "major", "minor","patch"])
-    ///             .required(true),
-    ///         ArgGroup::with_name("input")
-    ///             .args(&["c", "i"])
-    ///     ])
-    /// # ;
-    /// ```
-    /// [`ArgGroup`]: ./struct.ArgGroup.html
-    /// [`App`]: ./struct.App.html
-    pub fn groups(mut self, groups: &[ArgGroup<'a>]) -> Self {
-        for g in groups {
-            self = self.group(g.into());
-        }
-        self
-    }
-
-    /// Adds a [`SubCommand`] to the list of valid possibilities. Subcommands are effectively
-    /// sub-[`App`]s, because they can contain their own arguments, subcommands, version, usage,
-    /// etc. They also function just like [`App`]s, in that they get their own auto generated help,
-    /// version, and usage.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    /// App::new("myprog")
-    ///     .subcommand(SubCommand::with_name("config")
-    ///         .about("Controls configuration features")
-    ///         .arg_from_usage("<config> 'Required configuration file to use'"))
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`App`]: ./struct.App.html
-    pub fn subcommand(mut self, subcmd: App<'a, 'b>) -> Self {
-        self.p.add_subcommand(subcmd);
-        self
-    }
-
-    /// Adds multiple subcommands to the list of valid possibilities by iterating over an
-    /// [`IntoIterator`] of [`SubCommand`]s
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, SubCommand};
-    /// # App::new("myprog")
-    /// .subcommands( vec![
-    ///        SubCommand::with_name("config").about("Controls configuration functionality")
-    ///                                 .arg(Arg::with_name("config_file").index(1)),
-    ///        SubCommand::with_name("debug").about("Controls debug functionality")])
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`IntoIterator`]: https://doc.rust-lang.org/std/iter/trait.IntoIterator.html
-    pub fn subcommands<I>(mut self, subcmds: I) -> Self
-    where
-        I: IntoIterator<Item = App<'a, 'b>>,
-    {
-        for subcmd in subcmds {
-            self.p.add_subcommand(subcmd);
-        }
-        self
-    }
-
-    /// Allows custom ordering of [`SubCommand`]s within the help message. Subcommands with a lower
-    /// value will be displayed first in the help message. This is helpful when one would like to
-    /// emphasise frequently used subcommands, or prioritize those towards the top of the list.
-    /// Duplicate values **are** allowed. Subcommands with duplicate display orders will be
-    /// displayed in alphabetical order.
-    ///
-    /// **NOTE:** The default is 999 for all subcommands.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, SubCommand};
-    /// let m = App::new("cust-ord")
-    ///     .subcommand(SubCommand::with_name("alpha") // typically subcommands are grouped
-    ///                                                // alphabetically by name. Subcommands
-    ///                                                // without a display_order have a value of
-    ///                                                // 999 and are displayed alphabetically with
-    ///                                                // all other 999 subcommands
-    ///         .about("Some help and text"))
-    ///     .subcommand(SubCommand::with_name("beta")
-    ///         .display_order(1)   // In order to force this subcommand to appear *first*
-    ///                             // all we have to do is give it a value lower than 999.
-    ///                             // Any other subcommands with a value of 1 will be displayed
-    ///                             // alphabetically with this one...then 2 values, then 3, etc.
-    ///         .about("I should be first!"))
-    ///     .get_matches_from(vec![
-    ///         "cust-ord", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays the following help message
-    ///
-    /// ```text
-    /// cust-ord
-    ///
-    /// USAGE:
-    ///     cust-ord [FLAGS] [OPTIONS]
-    ///
-    /// FLAGS:
-    ///     -h, --help       Prints help information
-    ///     -V, --version    Prints version information
-    ///
-    /// SUBCOMMANDS:
-    ///     beta    I should be first!
-    ///     alpha   Some help and text
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    pub fn display_order(mut self, ord: usize) -> Self {
-        self.p.meta.disp_ord = ord;
-        self
-    }
-
-    /// Prints the full help message to [`io::stdout()`] using a [`BufWriter`] using the same
-    /// method as if someone ran `-h` to request the help message
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" help messages
-    /// depending on if the user ran [`-h` (short)] or [`--help` (long)]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// let mut app = App::new("myprog");
-    /// app.print_help();
-    /// ```
-    /// [`io::stdout()`]: https://doc.rust-lang.org/std/io/fn.stdout.html
-    /// [`BufWriter`]: https://doc.rust-lang.org/std/io/struct.BufWriter.html
-    /// [`-h` (short)]: ./struct.Arg.html#method.help
-    /// [`--help` (long)]: ./struct.Arg.html#method.long_help
-    pub fn print_help(&mut self) -> ClapResult<()> {
-        // If there are global arguments, or settings we need to propagate them down to subcommands
-        // before parsing incase we run into a subcommand
-        self.p.propagate_globals();
-        self.p.propagate_settings();
-        self.p.derive_display_order();
-
-        self.p.create_help_and_version();
-        let out = io::stdout();
-        let mut buf_w = BufWriter::new(out.lock());
-        self.write_help(&mut buf_w)
-    }
-
-    /// Prints the full help message to [`io::stdout()`] using a [`BufWriter`] using the same
-    /// method as if someone ran `--help` to request the help message
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" help messages
-    /// depending on if the user ran [`-h` (short)] or [`--help` (long)]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// let mut app = App::new("myprog");
-    /// app.print_long_help();
-    /// ```
-    /// [`io::stdout()`]: https://doc.rust-lang.org/std/io/fn.stdout.html
-    /// [`BufWriter`]: https://doc.rust-lang.org/std/io/struct.BufWriter.html
-    /// [`-h` (short)]: ./struct.Arg.html#method.help
-    /// [`--help` (long)]: ./struct.Arg.html#method.long_help
-    pub fn print_long_help(&mut self) -> ClapResult<()> {
-        let out = io::stdout();
-        let mut buf_w = BufWriter::new(out.lock());
-        self.write_long_help(&mut buf_w)
-    }
-
-    /// Writes the full help message to the user to a [`io::Write`] object in the same method as if
-    /// the user ran `-h`
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" help messages
-    /// depending on if the user ran [`-h` (short)] or [`--help` (long)]
-    ///
-    /// **NOTE:** There is a known bug where this method does not write propagated global arguments
-    /// or autogenerated arguments (i.e. the default help/version args). Prefer
-    /// [`App::write_long_help`] instead if possible!
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// use std::io;
-    /// let mut app = App::new("myprog");
-    /// let mut out = io::stdout();
-    /// app.write_help(&mut out).expect("failed to write to stdout");
-    /// ```
-    /// [`io::Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
-    /// [`-h` (short)]: ./struct.Arg.html#method.help
-    /// [`--help` (long)]: ./struct.Arg.html#method.long_help
-    pub fn write_help<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        // PENDING ISSUE: 808
-        //      https://github.com/clap-rs/clap/issues/808
-        // If there are global arguments, or settings we need to propagate them down to subcommands
-        // before parsing incase we run into a subcommand
-        // self.p.propagate_globals();
-        // self.p.propagate_settings();
-        // self.p.derive_display_order();
-        // self.p.create_help_and_version();
-
-        Help::write_app_help(w, self, false)
-    }
-
-    /// Writes the full help message to the user to a [`io::Write`] object in the same method as if
-    /// the user ran `--help`
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" help messages
-    /// depending on if the user ran [`-h` (short)] or [`--help` (long)]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// use std::io;
-    /// let mut app = App::new("myprog");
-    /// let mut out = io::stdout();
-    /// app.write_long_help(&mut out).expect("failed to write to stdout");
-    /// ```
-    /// [`io::Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
-    /// [`-h` (short)]: ./struct.Arg.html#method.help
-    /// [`--help` (long)]: ./struct.Arg.html#method.long_help
-    pub fn write_long_help<W: Write>(&mut self, w: &mut W) -> ClapResult<()> {
-        // If there are global arguments, or settings we need to propagate them down to subcommands
-        // before parsing incase we run into a subcommand
-        self.p.propagate_globals();
-        self.p.propagate_settings();
-        self.p.derive_display_order();
-        self.p.create_help_and_version();
-
-        Help::write_app_help(w, self, true)
-    }
-
-    /// Writes the version message to the user to a [`io::Write`] object as if the user ran `-V`.
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" version messages
-    /// depending on if the user ran [`-V` (short)] or [`--version` (long)]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// use std::io;
-    /// let mut app = App::new("myprog");
-    /// let mut out = io::stdout();
-    /// app.write_version(&mut out).expect("failed to write to stdout");
-    /// ```
-    /// [`io::Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
-    /// [`-V` (short)]: ./struct.App.html#method.version
-    /// [`--version` (long)]: ./struct.App.html#method.long_version
-    pub fn write_version<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        self.p.write_version(w, false).map_err(From::from)
-    }
-
-    /// Writes the version message to the user to a [`io::Write`] object
-    ///
-    /// **NOTE:** clap has the ability to distinguish between "short" and "long" version messages
-    /// depending on if the user ran [`-V` (short)] or [`--version` (long)]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::App;
-    /// use std::io;
-    /// let mut app = App::new("myprog");
-    /// let mut out = io::stdout();
-    /// app.write_long_version(&mut out).expect("failed to write to stdout");
-    /// ```
-    /// [`io::Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
-    /// [`-V` (short)]: ./struct.App.html#method.version
-    /// [`--version` (long)]: ./struct.App.html#method.long_version
-    pub fn write_long_version<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        self.p.write_version(w, true).map_err(From::from)
-    }
-
-    /// Generate a completions file for a specified shell at compile time.
-    ///
-    /// **NOTE:** to generate the file at compile time you must use a `build.rs` "Build Script"
-    ///
-    /// # Examples
-    ///
-    /// The following example generates a bash completion script via a `build.rs` script. In this
-    /// simple example, we'll demo a very small application with only a single subcommand and two
-    /// args. Real applications could be many multiple levels deep in subcommands, and have tens or
-    /// potentially hundreds of arguments.
-    ///
-    /// First, it helps if we separate out our `App` definition into a separate file. Whether you
-    /// do this as a function, or bare App definition is a matter of personal preference.
-    ///
-    /// ```
-    /// // src/cli.rs
-    ///
-    /// use clap::{App, Arg, SubCommand};
-    ///
-    /// pub fn build_cli() -> App<'static, 'static> {
-    ///     App::new("compl")
-    ///         .about("Tests completions")
-    ///         .arg(Arg::with_name("file")
-    ///             .help("some input file"))
-    ///         .subcommand(SubCommand::with_name("test")
-    ///             .about("tests things")
-    ///             .arg(Arg::with_name("case")
-    ///                 .long("case")
-    ///                 .takes_value(true)
-    ///                 .help("the case to test")))
-    /// }
-    /// ```
-    ///
-    /// In our regular code, we can simply call this `build_cli()` function, then call
-    /// `get_matches()`, or any of the other normal methods directly after. For example:
-    ///
-    /// ```ignore
-    /// // src/main.rs
-    ///
-    /// mod cli;
-    ///
-    /// fn main() {
-    ///     let m = cli::build_cli().get_matches();
-    ///
-    ///     // normal logic continues...
-    /// }
-    /// ```
-    ///
-    /// Next, we set up our `Cargo.toml` to use a `build.rs` build script.
-    ///
-    /// ```toml
-    /// # Cargo.toml
-    /// build = "build.rs"
-    ///
-    /// [build-dependencies]
-    /// clap = "2.23"
-    /// ```
-    ///
-    /// Next, we place a `build.rs` in our project root.
-    ///
-    /// ```ignore
-    /// extern crate clap;
-    ///
-    /// use clap::Shell;
-    ///
-    /// include!("src/cli.rs");
-    ///
-    /// fn main() {
-    ///     let outdir = match env::var_os("OUT_DIR") {
-    ///         None => return,
-    ///         Some(outdir) => outdir,
-    ///     };
-    ///     let mut app = build_cli();
-    ///     app.gen_completions("myapp",      // We need to specify the bin name manually
-    ///                         Shell::Bash,  // Then say which shell to build completions for
-    ///                         outdir);      // Then say where write the completions to
-    /// }
-    /// ```
-    /// Now, once we compile there will be a `{bin_name}.bash` file in the directory.
-    /// Assuming we compiled with debug mode, it would be somewhere similar to
-    /// `<project>/target/debug/build/myapp-<hash>/out/myapp.bash`.
-    ///
-    /// Fish shell completions will use the file format `{bin_name}.fish`
-    pub fn gen_completions<T: Into<OsString>, S: Into<String>>(
-        &mut self,
-        bin_name: S,
-        for_shell: Shell,
-        out_dir: T,
-    ) {
-        self.p.meta.bin_name = Some(bin_name.into());
-        self.p.gen_completions(for_shell, out_dir.into());
-    }
-
-    /// Generate a completions file for a specified shell at runtime.  Until `cargo install` can
-    /// install extra files like a completion script, this may be used e.g. in a command that
-    /// outputs the contents of the completion script, to be redirected into a file by the user.
-    ///
-    /// # Examples
-    ///
-    /// Assuming a separate `cli.rs` like the [example above](./struct.App.html#method.gen_completions),
-    /// we can let users generate a completion script using a command:
-    ///
-    /// ```ignore
-    /// // src/main.rs
-    ///
-    /// mod cli;
-    /// use std::io;
-    ///
-    /// fn main() {
-    ///     let matches = cli::build_cli().get_matches();
-    ///
-    ///     if matches.is_present("generate-bash-completions") {
-    ///         cli::build_cli().gen_completions_to("myapp", Shell::Bash, &mut io::stdout());
-    ///     }
-    ///
-    ///     // normal logic continues...
-    /// }
-    ///
-    /// ```
-    ///
-    /// Usage:
-    ///
-    /// ```shell
-    /// $ myapp generate-bash-completions > /usr/share/bash-completion/completions/myapp.bash
-    /// ```
-    pub fn gen_completions_to<W: Write, S: Into<String>>(
-        &mut self,
-        bin_name: S,
-        for_shell: Shell,
-        buf: &mut W,
-    ) {
-        self.p.meta.bin_name = Some(bin_name.into());
-        self.p.gen_completions_to(for_shell, buf);
-    }
-
-    /// Starts the parsing process, upon a failed parse an error will be displayed to the user and
-    /// the process will exit with the appropriate error code. By default this method gets all user
-    /// provided arguments from [`env::args_os`] in order to allow for invalid UTF-8 code points,
-    /// which are legal on many platforms.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let matches = App::new("myprog")
-    ///     // Args and options go here...
-    ///     .get_matches();
-    /// ```
-    /// [`env::args_os`]: https://doc.rust-lang.org/std/env/fn.args_os.html
-    pub fn get_matches(self) -> ArgMatches<'a> {
-        self.get_matches_from(&mut env::args_os())
-    }
-
-    /// Starts the parsing process. This method will return a [`clap::Result`] type instead of exiting
-    /// the process on failed parse. By default this method gets matches from [`env::args_os`]
-    ///
-    /// **NOTE:** This method WILL NOT exit when `--help` or `--version` (or short versions) are
-    /// used. It will return a [`clap::Error`], where the [`kind`] is a
-    /// [`ErrorKind::HelpDisplayed`] or [`ErrorKind::VersionDisplayed`] respectively. You must call
-    /// [`Error::exit`] or perform a [`std::process::exit`].
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let matches = App::new("myprog")
-    ///     // Args and options go here...
-    ///     .get_matches_safe()
-    ///     .unwrap_or_else( |e| e.exit() );
-    /// ```
-    /// [`env::args_os`]: https://doc.rust-lang.org/std/env/fn.args_os.html
-    /// [`ErrorKind::HelpDisplayed`]: ./enum.ErrorKind.html#variant.HelpDisplayed
-    /// [`ErrorKind::VersionDisplayed`]: ./enum.ErrorKind.html#variant.VersionDisplayed
-    /// [`Error::exit`]: ./struct.Error.html#method.exit
-    /// [`std::process::exit`]: https://doc.rust-lang.org/std/process/fn.exit.html
-    /// [`clap::Result`]: ./type.Result.html
-    /// [`clap::Error`]: ./struct.Error.html
-    /// [`kind`]: ./struct.Error.html
-    pub fn get_matches_safe(self) -> ClapResult<ArgMatches<'a>> {
-        // Start the parsing
-        self.get_matches_from_safe(&mut env::args_os())
-    }
-
-    /// Starts the parsing process. Like [`App::get_matches`] this method does not return a [`clap::Result`]
-    /// and will automatically exit with an error message. This method, however, lets you specify
-    /// what iterator to use when performing matches, such as a [`Vec`] of your making.
-    ///
-    /// **NOTE:** The first argument will be parsed as the binary name unless
-    /// [`AppSettings::NoBinaryName`] is used
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let arg_vec = vec!["my_prog", "some", "args", "to", "parse"];
-    ///
-    /// let matches = App::new("myprog")
-    ///     // Args and options go here...
-    ///     .get_matches_from(arg_vec);
-    /// ```
-    /// [`App::get_matches`]: ./struct.App.html#method.get_matches
-    /// [`clap::Result`]: ./type.Result.html
-    /// [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
-    /// [`AppSettings::NoBinaryName`]: ./enum.AppSettings.html#variant.NoBinaryName
-    pub fn get_matches_from<I, T>(mut self, itr: I) -> ArgMatches<'a>
-    where
-        I: IntoIterator<Item = T>,
-        T: Into<OsString> + Clone,
-    {
-        self.get_matches_from_safe_borrow(itr).unwrap_or_else(|e| {
-            // Otherwise, write to stderr and exit
-            if e.use_stderr() {
-                wlnerr!("{}", e.message);
-                if self.p.is_set(AppSettings::WaitOnError) {
-                    wlnerr!("\nPress [ENTER] / [RETURN] to continue...");
-                    let mut s = String::new();
-                    let i = io::stdin();
-                    i.lock().read_line(&mut s).unwrap();
-                }
-                drop(self);
-                drop(e);
-                process::exit(1);
-            }
-
-            drop(self);
-            e.exit()
-        })
-    }
-
-    /// Starts the parsing process. A combination of [`App::get_matches_from`], and
-    /// [`App::get_matches_safe`]
-    ///
-    /// **NOTE:** This method WILL NOT exit when `--help` or `--version` (or short versions) are
-    /// used. It will return a [`clap::Error`], where the [`kind`] is a [`ErrorKind::HelpDisplayed`]
-    /// or [`ErrorKind::VersionDisplayed`] respectively. You must call [`Error::exit`] or
-    /// perform a [`std::process::exit`] yourself.
-    ///
-    /// **NOTE:** The first argument will be parsed as the binary name unless
-    /// [`AppSettings::NoBinaryName`] is used
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let arg_vec = vec!["my_prog", "some", "args", "to", "parse"];
-    ///
-    /// let matches = App::new("myprog")
-    ///     // Args and options go here...
-    ///     .get_matches_from_safe(arg_vec)
-    ///     .unwrap_or_else( |e| { panic!("An error occurs: {}", e) });
-    /// ```
-    /// [`App::get_matches_from`]: ./struct.App.html#method.get_matches_from
-    /// [`App::get_matches_safe`]: ./struct.App.html#method.get_matches_safe
-    /// [`ErrorKind::HelpDisplayed`]: ./enum.ErrorKind.html#variant.HelpDisplayed
-    /// [`ErrorKind::VersionDisplayed`]: ./enum.ErrorKind.html#variant.VersionDisplayed
-    /// [`Error::exit`]: ./struct.Error.html#method.exit
-    /// [`std::process::exit`]: https://doc.rust-lang.org/std/process/fn.exit.html
-    /// [`clap::Error`]: ./struct.Error.html
-    /// [`Error::exit`]: ./struct.Error.html#method.exit
-    /// [`kind`]: ./struct.Error.html
-    /// [`AppSettings::NoBinaryName`]: ./enum.AppSettings.html#variant.NoBinaryName
-    pub fn get_matches_from_safe<I, T>(mut self, itr: I) -> ClapResult<ArgMatches<'a>>
-    where
-        I: IntoIterator<Item = T>,
-        T: Into<OsString> + Clone,
-    {
-        self.get_matches_from_safe_borrow(itr)
-    }
-
-    /// Starts the parsing process without consuming the [`App`] struct `self`. This is normally not
-    /// the desired functionality, instead prefer [`App::get_matches_from_safe`] which *does*
-    /// consume `self`.
-    ///
-    /// **NOTE:** The first argument will be parsed as the binary name unless
-    /// [`AppSettings::NoBinaryName`] is used
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg};
-    /// let arg_vec = vec!["my_prog", "some", "args", "to", "parse"];
-    ///
-    /// let mut app = App::new("myprog");
-    ///     // Args and options go here...
-    /// let matches = app.get_matches_from_safe_borrow(arg_vec)
-    ///     .unwrap_or_else( |e| { panic!("An error occurs: {}", e) });
-    /// ```
-    /// [`App`]: ./struct.App.html
-    /// [`App::get_matches_from_safe`]: ./struct.App.html#method.get_matches_from_safe
-    /// [`AppSettings::NoBinaryName`]: ./enum.AppSettings.html#variant.NoBinaryName
-    pub fn get_matches_from_safe_borrow<I, T>(&mut self, itr: I) -> ClapResult<ArgMatches<'a>>
-    where
-        I: IntoIterator<Item = T>,
-        T: Into<OsString> + Clone,
-    {
-        // If there are global arguments, or settings we need to propagate them down to subcommands
-        // before parsing incase we run into a subcommand
-        if !self.p.is_set(AppSettings::Propagated) {
-            self.p.propagate_globals();
-            self.p.propagate_settings();
-            self.p.derive_display_order();
-            self.p.set(AppSettings::Propagated);
-        }
-
-        let mut matcher = ArgMatcher::new();
-
-        let mut it = itr.into_iter();
-        // Get the name of the program (argument 1 of env::args()) and determine the
-        // actual file
-        // that was used to execute the program. This is because a program called
-        // ./target/release/my_prog -a
-        // will have two arguments, './target/release/my_prog', '-a' but we don't want
-        // to display
-        // the full path when displaying help messages and such
-        if !self.p.is_set(AppSettings::NoBinaryName) {
-            if let Some(name) = it.next() {
-                let bn_os = name.into();
-                let p = Path::new(&*bn_os);
-                if let Some(f) = p.file_name() {
-                    if let Some(s) = f.to_os_string().to_str() {
-                        if self.p.meta.bin_name.is_none() {
-                            self.p.meta.bin_name = Some(s.to_owned());
-                        }
-                    }
-                }
-            }
-        }
-
-        // do the real parsing
-        if let Err(e) = self.p.get_matches_with(&mut matcher, &mut it.peekable()) {
-            return Err(e);
-        }
-
-        let global_arg_vec: Vec<&str> = (&self).p.global_args.iter().map(|ga| ga.b.name).collect();
-        matcher.propagate_globals(&global_arg_vec);
-
-        Ok(matcher.into())
-    }
-}
-
-#[cfg(feature = "yaml")]
-impl<'a> From<&'a Yaml> for App<'a, 'a> {
-    fn from(mut yaml: &'a Yaml) -> Self {
-        use args::SubCommand;
-        // We WANT this to panic on error...so expect() is good.
-        let mut is_sc = None;
-        let mut a = if let Some(name) = yaml["name"].as_str() {
-            App::new(name)
-        } else {
-            let yaml_hash = yaml.as_hash().unwrap();
-            let sc_key = yaml_hash.keys().nth(0).unwrap();
-            is_sc = Some(yaml_hash.get(sc_key).unwrap());
-            App::new(sc_key.as_str().unwrap())
-        };
-        yaml = if let Some(sc) = is_sc { sc } else { yaml };
-
-        macro_rules! yaml_str {
-            ($a:ident, $y:ident, $i:ident) => {
-                if let Some(v) = $y[stringify!($i)].as_str() {
-                    $a = $a.$i(v);
-                } else if $y[stringify!($i)] != Yaml::BadValue {
-                    panic!(
-                        "Failed to convert YAML value {:?} to a string",
-                        $y[stringify!($i)]
-                    );
-                }
-            };
-        }
-
-        yaml_str!(a, yaml, version);
-        yaml_str!(a, yaml, long_version);
-        yaml_str!(a, yaml, author);
-        yaml_str!(a, yaml, bin_name);
-        yaml_str!(a, yaml, about);
-        yaml_str!(a, yaml, long_about);
-        yaml_str!(a, yaml, before_help);
-        yaml_str!(a, yaml, after_help);
-        yaml_str!(a, yaml, template);
-        yaml_str!(a, yaml, usage);
-        yaml_str!(a, yaml, help);
-        yaml_str!(a, yaml, help_short);
-        yaml_str!(a, yaml, version_short);
-        yaml_str!(a, yaml, help_message);
-        yaml_str!(a, yaml, version_message);
-        yaml_str!(a, yaml, alias);
-        yaml_str!(a, yaml, visible_alias);
-
-        if let Some(v) = yaml["display_order"].as_i64() {
-            a = a.display_order(v as usize);
-        } else if yaml["display_order"] != Yaml::BadValue {
-            panic!(
-                "Failed to convert YAML value {:?} to a u64",
-                yaml["display_order"]
-            );
-        }
-        if let Some(v) = yaml["setting"].as_str() {
-            a = a.setting(v.parse().expect("unknown AppSetting found in YAML file"));
-        } else if yaml["setting"] != Yaml::BadValue {
-            panic!(
-                "Failed to convert YAML value {:?} to an AppSetting",
-                yaml["setting"]
-            );
-        }
-        if let Some(v) = yaml["settings"].as_vec() {
-            for ys in v {
-                if let Some(s) = ys.as_str() {
-                    a = a.setting(s.parse().expect("unknown AppSetting found in YAML file"));
-                }
-            }
-        } else if let Some(v) = yaml["settings"].as_str() {
-            a = a.setting(v.parse().expect("unknown AppSetting found in YAML file"));
-        } else if yaml["settings"] != Yaml::BadValue {
-            panic!(
-                "Failed to convert YAML value {:?} to a string",
-                yaml["settings"]
-            );
-        }
-        if let Some(v) = yaml["global_setting"].as_str() {
-            a = a.setting(v.parse().expect("unknown AppSetting found in YAML file"));
-        } else if yaml["global_setting"] != Yaml::BadValue {
-            panic!(
-                "Failed to convert YAML value {:?} to an AppSetting",
-                yaml["setting"]
-            );
-        }
-        if let Some(v) = yaml["global_settings"].as_vec() {
-            for ys in v {
-                if let Some(s) = ys.as_str() {
-                    a = a.global_setting(s.parse().expect("unknown AppSetting found in YAML file"));
-                }
-            }
-        } else if let Some(v) = yaml["global_settings"].as_str() {
-            a = a.global_setting(v.parse().expect("unknown AppSetting found in YAML file"));
-        } else if yaml["global_settings"] != Yaml::BadValue {
-            panic!(
-                "Failed to convert YAML value {:?} to a string",
-                yaml["global_settings"]
-            );
-        }
-
-        macro_rules! vec_or_str {
-            ($a:ident, $y:ident, $as_vec:ident, $as_single:ident) => {{
-                let maybe_vec = $y[stringify!($as_vec)].as_vec();
-                if let Some(vec) = maybe_vec {
-                    for ys in vec {
-                        if let Some(s) = ys.as_str() {
-                            $a = $a.$as_single(s);
-                        } else {
-                            panic!("Failed to convert YAML value {:?} to a string", ys);
-                        }
-                    }
-                } else {
-                    if let Some(s) = $y[stringify!($as_vec)].as_str() {
-                        $a = $a.$as_single(s);
-                    } else if $y[stringify!($as_vec)] != Yaml::BadValue {
-                        panic!(
-                            "Failed to convert YAML value {:?} to either a vec or string",
-                            $y[stringify!($as_vec)]
-                        );
-                    }
-                }
-                $a
-            }};
-        }
-
-        a = vec_or_str!(a, yaml, aliases, alias);
-        a = vec_or_str!(a, yaml, visible_aliases, visible_alias);
-
-        if let Some(v) = yaml["args"].as_vec() {
-            for arg_yaml in v {
-                a = a.arg(Arg::from_yaml(arg_yaml.as_hash().unwrap()));
-            }
-        }
-        if let Some(v) = yaml["subcommands"].as_vec() {
-            for sc_yaml in v {
-                a = a.subcommand(SubCommand::from_yaml(sc_yaml));
-            }
-        }
-        if let Some(v) = yaml["groups"].as_vec() {
-            for ag_yaml in v {
-                a = a.group(ArgGroup::from(ag_yaml.as_hash().unwrap()));
-            }
-        }
-
-        a
-    }
-}
-
-impl<'a, 'b> Clone for App<'a, 'b> {
-    fn clone(&self) -> Self {
-        App { p: self.p.clone() }
-    }
-}
-
-impl<'n, 'e> AnyArg<'n, 'e> for App<'n, 'e> {
-    fn name(&self) -> &'n str {
-        ""
-    }
-    fn overrides(&self) -> Option<&[&'e str]> {
-        None
-    }
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]> {
-        None
-    }
-    fn blacklist(&self) -> Option<&[&'e str]> {
-        None
-    }
-    fn required_unless(&self) -> Option<&[&'e str]> {
-        None
-    }
-    fn val_names(&self) -> Option<&VecMap<&'e str>> {
-        None
-    }
-    fn is_set(&self, _: ArgSettings) -> bool {
-        false
-    }
-    fn val_terminator(&self) -> Option<&'e str> {
-        None
-    }
-    fn set(&mut self, _: ArgSettings) {
-        unreachable!("App struct does not support AnyArg::set, this is a bug!")
-    }
-    fn has_switch(&self) -> bool {
-        false
-    }
-    fn max_vals(&self) -> Option<u64> {
-        None
-    }
-    fn num_vals(&self) -> Option<u64> {
-        None
-    }
-    fn possible_vals(&self) -> Option<&[&'e str]> {
-        None
-    }
-    fn validator(&self) -> Option<&Rc<Fn(String) -> StdResult<(), String>>> {
-        None
-    }
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> StdResult<(), OsString>>> {
-        None
-    }
-    fn min_vals(&self) -> Option<u64> {
-        None
-    }
-    fn short(&self) -> Option<char> {
-        None
-    }
-    fn long(&self) -> Option<&'e str> {
-        None
-    }
-    fn val_delim(&self) -> Option<char> {
-        None
-    }
-    fn takes_value(&self) -> bool {
-        true
-    }
-    fn help(&self) -> Option<&'e str> {
-        self.p.meta.about
-    }
-    fn long_help(&self) -> Option<&'e str> {
-        self.p.meta.long_about
-    }
-    fn default_val(&self) -> Option<&'e OsStr> {
-        None
-    }
-    fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
-        None
-    }
-    fn env<'s>(&'s self) -> Option<(&'n OsStr, Option<&'s OsString>)> {
-        None
-    }
-    fn longest_filter(&self) -> bool {
-        true
-    }
-    fn aliases(&self) -> Option<Vec<&'e str>> {
-        if let Some(ref aliases) = self.p.meta.aliases {
-            let vis_aliases: Vec<_> = aliases
-                .iter()
-                .filter_map(|&(n, v)| if v { Some(n) } else { None })
-                .collect();
-            if vis_aliases.is_empty() {
-                None
-            } else {
-                Some(vis_aliases)
-            }
-        } else {
-            None
-        }
-    }
-}
-
-impl<'n, 'e> fmt::Display for App<'n, 'e> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}", self.p.meta.name)
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/app/parser.rs b/third_party/rust/clap/v2/crate/src/app/parser.rs
deleted file mode 100644
index c05602e..0000000
--- a/third_party/rust/clap/v2/crate/src/app/parser.rs
+++ /dev/null
@@ -1,2241 +0,0 @@
-// Std
-#[cfg(all(feature = "debug", any(target_os = "windows", target_arch = "wasm32")))]
-use osstringext::OsStrExt3;
-use std::cell::Cell;
-use std::ffi::{OsStr, OsString};
-use std::fmt::Display;
-use std::fs::File;
-use std::io::{self, BufWriter, Write};
-use std::iter::Peekable;
-#[cfg(all(
-    feature = "debug",
-    not(any(target_os = "windows", target_arch = "wasm32"))
-))]
-use std::os::unix::ffi::OsStrExt;
-use std::path::PathBuf;
-use std::slice::Iter;
-
-// Internal
-use app::help::Help;
-use app::meta::AppMeta;
-use app::settings::AppFlags;
-use app::settings::AppSettings as AS;
-use app::usage;
-use app::validator::Validator;
-use app::App;
-use args::settings::ArgSettings;
-use args::{
-    AnyArg, Arg, ArgGroup, ArgMatcher, Base, FlagBuilder, OptBuilder, PosBuilder, Switched,
-};
-use completions::ComplGen;
-use completions::Shell;
-use errors::Result as ClapResult;
-use errors::{Error, ErrorKind};
-use fmt::ColorWhen;
-use map::{self, VecMap};
-use osstringext::OsStrExt2;
-use suggestions;
-use SubCommand;
-use INTERNAL_ERROR_MSG;
-use INVALID_UTF8;
-
-#[derive(Debug, PartialEq, Copy, Clone)]
-#[doc(hidden)]
-pub enum ParseResult<'a> {
-    Flag,
-    Opt(&'a str),
-    Pos(&'a str),
-    MaybeHyphenValue,
-    MaybeNegNum,
-    NotFound,
-    ValuesDone,
-}
-
-#[allow(missing_debug_implementations)]
-#[doc(hidden)]
-#[derive(Clone, Default)]
-pub struct Parser<'a, 'b>
-where
-    'a: 'b,
-{
-    pub meta: AppMeta<'b>,
-    settings: AppFlags,
-    pub g_settings: AppFlags,
-    pub flags: Vec<FlagBuilder<'a, 'b>>,
-    pub opts: Vec<OptBuilder<'a, 'b>>,
-    pub positionals: VecMap<PosBuilder<'a, 'b>>,
-    pub subcommands: Vec<App<'a, 'b>>,
-    pub groups: Vec<ArgGroup<'a>>,
-    pub global_args: Vec<Arg<'a, 'b>>,
-    pub required: Vec<&'a str>,
-    pub r_ifs: Vec<(&'a str, &'b str, &'a str)>,
-    pub overrides: Vec<(&'b str, &'a str)>,
-    help_short: Option<char>,
-    version_short: Option<char>,
-    cache: Option<&'a str>,
-    pub help_message: Option<&'a str>,
-    pub version_message: Option<&'a str>,
-    cur_idx: Cell<usize>,
-}
-
-impl<'a, 'b> Parser<'a, 'b>
-where
-    'a: 'b,
-{
-    pub fn with_name(n: String) -> Self {
-        Parser {
-            meta: AppMeta::with_name(n),
-            g_settings: AppFlags::zeroed(),
-            cur_idx: Cell::new(0),
-            ..Default::default()
-        }
-    }
-
-    pub fn help_short(&mut self, s: &str) {
-        let c = s
-            .trim_left_matches(|c| c == '-')
-            .chars()
-            .nth(0)
-            .unwrap_or('h');
-        self.help_short = Some(c);
-    }
-
-    pub fn version_short(&mut self, s: &str) {
-        let c = s
-            .trim_left_matches(|c| c == '-')
-            .chars()
-            .nth(0)
-            .unwrap_or('V');
-        self.version_short = Some(c);
-    }
-
-    pub fn gen_completions_to<W: Write>(&mut self, for_shell: Shell, buf: &mut W) {
-        if !self.is_set(AS::Propagated) {
-            self.propagate_help_version();
-            self.build_bin_names();
-            self.propagate_globals();
-            self.propagate_settings();
-            self.set(AS::Propagated);
-        }
-
-        ComplGen::new(self).generate(for_shell, buf)
-    }
-
-    pub fn gen_completions(&mut self, for_shell: Shell, od: OsString) {
-        use std::error::Error;
-
-        let out_dir = PathBuf::from(od);
-        let name = &*self.meta.bin_name.as_ref().unwrap().clone();
-        let file_name = match for_shell {
-            Shell::Bash => format!("{}.bash", name),
-            Shell::Fish => format!("{}.fish", name),
-            Shell::Zsh => format!("_{}", name),
-            Shell::PowerShell => format!("_{}.ps1", name),
-            Shell::Elvish => format!("{}.elv", name),
-        };
-
-        let mut file = match File::create(out_dir.join(file_name)) {
-            Err(why) => panic!("couldn't create completion file: {}", why.description()),
-            Ok(file) => file,
-        };
-        self.gen_completions_to(for_shell, &mut file)
-    }
-
-    #[inline]
-    fn app_debug_asserts(&self) -> bool {
-        assert!(self.verify_positionals());
-        let should_err = self.groups.iter().all(|g| {
-            g.args.iter().all(|arg| {
-                (self.flags.iter().any(|f| &f.b.name == arg)
-                    || self.opts.iter().any(|o| &o.b.name == arg)
-                    || self.positionals.values().any(|p| &p.b.name == arg)
-                    || self.groups.iter().any(|g| &g.name == arg))
-            })
-        });
-        let g = self.groups.iter().find(|g| {
-            g.args.iter().any(|arg| {
-                !(self.flags.iter().any(|f| &f.b.name == arg)
-                    || self.opts.iter().any(|o| &o.b.name == arg)
-                    || self.positionals.values().any(|p| &p.b.name == arg)
-                    || self.groups.iter().any(|g| &g.name == arg))
-            })
-        });
-        assert!(
-            should_err,
-            "The group '{}' contains the arg '{}' that doesn't actually exist.",
-            g.unwrap().name,
-            g.unwrap()
-                .args
-                .iter()
-                .find(|arg| !(self.flags.iter().any(|f| &&f.b.name == arg)
-                    || self.opts.iter().any(|o| &&o.b.name == arg)
-                    || self.positionals.values().any(|p| &&p.b.name == arg)
-                    || self.groups.iter().any(|g| &&g.name == arg)))
-                .unwrap()
-        );
-        true
-    }
-
-    #[inline]
-    fn debug_asserts(&self, a: &Arg) -> bool {
-        assert!(
-            !arg_names!(self).any(|name| name == a.b.name),
-            format!("Non-unique argument name: {} is already in use", a.b.name)
-        );
-        if let Some(l) = a.s.long {
-            assert!(
-                !self.contains_long(l),
-                "Argument long must be unique\n\n\t--{} is already in use",
-                l
-            );
-        }
-        if let Some(s) = a.s.short {
-            assert!(
-                !self.contains_short(s),
-                "Argument short must be unique\n\n\t-{} is already in use",
-                s
-            );
-        }
-        let i = if a.index.is_none() {
-            (self.positionals.len() + 1)
-        } else {
-            a.index.unwrap() as usize
-        };
-        assert!(
-            !self.positionals.contains_key(i),
-            "Argument \"{}\" has the same index as another positional \
-             argument\n\n\tPerhaps try .multiple(true) to allow one positional argument \
-             to take multiple values",
-            a.b.name
-        );
-        assert!(
-            !(a.is_set(ArgSettings::Required) && a.is_set(ArgSettings::Global)),
-            "Global arguments cannot be required.\n\n\t'{}' is marked as \
-             global and required",
-            a.b.name
-        );
-        if a.b.is_set(ArgSettings::Last) {
-            assert!(
-                !self
-                    .positionals
-                    .values()
-                    .any(|p| p.b.is_set(ArgSettings::Last)),
-                "Only one positional argument may have last(true) set. Found two."
-            );
-            assert!(a.s.long.is_none(),
-                    "Flags or Options may not have last(true) set. {} has both a long and last(true) set.",
-                    a.b.name);
-            assert!(a.s.short.is_none(),
-                    "Flags or Options may not have last(true) set. {} has both a short and last(true) set.",
-                    a.b.name);
-        }
-        true
-    }
-
-    #[inline]
-    fn add_conditional_reqs(&mut self, a: &Arg<'a, 'b>) {
-        if let Some(ref r_ifs) = a.r_ifs {
-            for &(arg, val) in r_ifs {
-                self.r_ifs.push((arg, val, a.b.name));
-            }
-        }
-    }
-
-    #[inline]
-    fn add_arg_groups(&mut self, a: &Arg<'a, 'b>) {
-        if let Some(ref grps) = a.b.groups {
-            for g in grps {
-                let mut found = false;
-                if let Some(ref mut ag) = self.groups.iter_mut().find(|grp| &grp.name == g) {
-                    ag.args.push(a.b.name);
-                    found = true;
-                }
-                if !found {
-                    let mut ag = ArgGroup::with_name(g);
-                    ag.args.push(a.b.name);
-                    self.groups.push(ag);
-                }
-            }
-        }
-    }
-
-    #[inline]
-    fn add_reqs(&mut self, a: &Arg<'a, 'b>) {
-        if a.is_set(ArgSettings::Required) {
-            // If the arg is required, add all it's requirements to master required list
-            self.required.push(a.b.name);
-            if let Some(ref areqs) = a.b.requires {
-                for name in areqs
-                    .iter()
-                    .filter(|&&(val, _)| val.is_none())
-                    .map(|&(_, name)| name)
-                {
-                    self.required.push(name);
-                }
-            }
-        }
-    }
-
-    #[inline]
-    fn implied_settings(&mut self, a: &Arg<'a, 'b>) {
-        if a.is_set(ArgSettings::Last) {
-            // if an arg has `Last` set, we need to imply DontCollapseArgsInUsage so that args
-            // in the usage string don't get confused or left out.
-            self.set(AS::DontCollapseArgsInUsage);
-            self.set(AS::ContainsLast);
-        }
-        if let Some(l) = a.s.long {
-            if l == "version" {
-                self.unset(AS::NeedsLongVersion);
-            } else if l == "help" {
-                self.unset(AS::NeedsLongHelp);
-            }
-        }
-    }
-
-    // actually adds the arguments
-    pub fn add_arg(&mut self, a: Arg<'a, 'b>) {
-        // if it's global we have to clone anyways
-        if a.is_set(ArgSettings::Global) {
-            return self.add_arg_ref(&a);
-        }
-        debug_assert!(self.debug_asserts(&a));
-        self.add_conditional_reqs(&a);
-        self.add_arg_groups(&a);
-        self.add_reqs(&a);
-        self.implied_settings(&a);
-        if a.index.is_some() || (a.s.short.is_none() && a.s.long.is_none()) {
-            let i = if a.index.is_none() {
-                (self.positionals.len() + 1)
-            } else {
-                a.index.unwrap() as usize
-            };
-            self.positionals
-                .insert(i, PosBuilder::from_arg(a, i as u64));
-        } else if a.is_set(ArgSettings::TakesValue) {
-            let mut ob = OptBuilder::from(a);
-            ob.s.unified_ord = self.flags.len() + self.opts.len();
-            self.opts.push(ob);
-        } else {
-            let mut fb = FlagBuilder::from(a);
-            fb.s.unified_ord = self.flags.len() + self.opts.len();
-            self.flags.push(fb);
-        }
-    }
-    // actually adds the arguments but from a borrow (which means we have to do some cloning)
-    pub fn add_arg_ref(&mut self, a: &Arg<'a, 'b>) {
-        debug_assert!(self.debug_asserts(a));
-        self.add_conditional_reqs(a);
-        self.add_arg_groups(a);
-        self.add_reqs(a);
-        self.implied_settings(a);
-        if a.index.is_some() || (a.s.short.is_none() && a.s.long.is_none()) {
-            let i = if a.index.is_none() {
-                (self.positionals.len() + 1)
-            } else {
-                a.index.unwrap() as usize
-            };
-            let pb = PosBuilder::from_arg_ref(a, i as u64);
-            self.positionals.insert(i, pb);
-        } else if a.is_set(ArgSettings::TakesValue) {
-            let mut ob = OptBuilder::from(a);
-            ob.s.unified_ord = self.flags.len() + self.opts.len();
-            self.opts.push(ob);
-        } else {
-            let mut fb = FlagBuilder::from(a);
-            fb.s.unified_ord = self.flags.len() + self.opts.len();
-            self.flags.push(fb);
-        }
-        if a.is_set(ArgSettings::Global) {
-            self.global_args.push(a.into());
-        }
-    }
-
-    pub fn add_group(&mut self, group: ArgGroup<'a>) {
-        if group.required {
-            self.required.push(group.name);
-            if let Some(ref reqs) = group.requires {
-                self.required.extend_from_slice(reqs);
-            }
-            //            if let Some(ref bl) = group.conflicts {
-            //                self.blacklist.extend_from_slice(bl);
-            //            }
-        }
-        if self.groups.iter().any(|g| g.name == group.name) {
-            let grp = self
-                .groups
-                .iter_mut()
-                .find(|g| g.name == group.name)
-                .expect(INTERNAL_ERROR_MSG);
-            grp.args.extend_from_slice(&group.args);
-            grp.requires = group.requires.clone();
-            grp.conflicts = group.conflicts.clone();
-            grp.required = group.required;
-        } else {
-            self.groups.push(group);
-        }
-    }
-
-    pub fn add_subcommand(&mut self, mut subcmd: App<'a, 'b>) {
-        debugln!(
-            "Parser::add_subcommand: term_w={:?}, name={}",
-            self.meta.term_w,
-            subcmd.p.meta.name
-        );
-        subcmd.p.meta.term_w = self.meta.term_w;
-        if subcmd.p.meta.name == "help" {
-            self.unset(AS::NeedsSubcommandHelp);
-        }
-
-        self.subcommands.push(subcmd);
-    }
-
-    pub fn propagate_settings(&mut self) {
-        debugln!(
-            "Parser::propagate_settings: self={}, g_settings={:#?}",
-            self.meta.name,
-            self.g_settings
-        );
-        for sc in &mut self.subcommands {
-            debugln!(
-                "Parser::propagate_settings: sc={}, settings={:#?}, g_settings={:#?}",
-                sc.p.meta.name,
-                sc.p.settings,
-                sc.p.g_settings
-            );
-            // We have to create a new scope in order to tell rustc the borrow of `sc` is
-            // done and to recursively call this method
-            {
-                let vsc = self.settings.is_set(AS::VersionlessSubcommands);
-                let gv = self.settings.is_set(AS::GlobalVersion);
-
-                if vsc {
-                    sc.p.set(AS::DisableVersion);
-                }
-                if gv && sc.p.meta.version.is_none() && self.meta.version.is_some() {
-                    sc.p.set(AS::GlobalVersion);
-                    sc.p.meta.version = Some(self.meta.version.unwrap());
-                }
-                sc.p.settings = sc.p.settings | self.g_settings;
-                sc.p.g_settings = sc.p.g_settings | self.g_settings;
-                sc.p.meta.term_w = self.meta.term_w;
-                sc.p.meta.max_w = self.meta.max_w;
-            }
-            sc.p.propagate_settings();
-        }
-    }
-
-    #[cfg_attr(feature = "lints", allow(needless_borrow))]
-    pub fn derive_display_order(&mut self) {
-        if self.is_set(AS::DeriveDisplayOrder) {
-            let unified = self.is_set(AS::UnifiedHelpMessage);
-            for (i, o) in self
-                .opts
-                .iter_mut()
-                .enumerate()
-                .filter(|&(_, ref o)| o.s.disp_ord == 999)
-            {
-                o.s.disp_ord = if unified { o.s.unified_ord } else { i };
-            }
-            for (i, f) in self
-                .flags
-                .iter_mut()
-                .enumerate()
-                .filter(|&(_, ref f)| f.s.disp_ord == 999)
-            {
-                f.s.disp_ord = if unified { f.s.unified_ord } else { i };
-            }
-            for (i, sc) in &mut self
-                .subcommands
-                .iter_mut()
-                .enumerate()
-                .filter(|&(_, ref sc)| sc.p.meta.disp_ord == 999)
-            {
-                sc.p.meta.disp_ord = i;
-            }
-        }
-        for sc in &mut self.subcommands {
-            sc.p.derive_display_order();
-        }
-    }
-
-    pub fn required(&self) -> Iter<&str> {
-        self.required.iter()
-    }
-
-    #[cfg_attr(feature = "lints", allow(needless_borrow))]
-    #[inline]
-    pub fn has_args(&self) -> bool {
-        !(self.flags.is_empty() && self.opts.is_empty() && self.positionals.is_empty())
-    }
-
-    #[inline]
-    pub fn has_opts(&self) -> bool {
-        !self.opts.is_empty()
-    }
-
-    #[inline]
-    pub fn has_flags(&self) -> bool {
-        !self.flags.is_empty()
-    }
-
-    #[inline]
-    pub fn has_positionals(&self) -> bool {
-        !self.positionals.is_empty()
-    }
-
-    #[inline]
-    pub fn has_subcommands(&self) -> bool {
-        !self.subcommands.is_empty()
-    }
-
-    #[inline]
-    pub fn has_visible_opts(&self) -> bool {
-        if self.opts.is_empty() {
-            return false;
-        }
-        self.opts.iter().any(|o| !o.is_set(ArgSettings::Hidden))
-    }
-
-    #[inline]
-    pub fn has_visible_flags(&self) -> bool {
-        if self.flags.is_empty() {
-            return false;
-        }
-        self.flags.iter().any(|f| !f.is_set(ArgSettings::Hidden))
-    }
-
-    #[inline]
-    pub fn has_visible_positionals(&self) -> bool {
-        if self.positionals.is_empty() {
-            return false;
-        }
-        self.positionals
-            .values()
-            .any(|p| !p.is_set(ArgSettings::Hidden))
-    }
-
-    #[inline]
-    pub fn has_visible_subcommands(&self) -> bool {
-        self.has_subcommands()
-            && self
-                .subcommands
-                .iter()
-                .filter(|sc| sc.p.meta.name != "help")
-                .any(|sc| !sc.p.is_set(AS::Hidden))
-    }
-
-    #[inline]
-    pub fn is_set(&self, s: AS) -> bool {
-        self.settings.is_set(s)
-    }
-
-    #[inline]
-    pub fn set(&mut self, s: AS) {
-        self.settings.set(s)
-    }
-
-    #[inline]
-    pub fn unset(&mut self, s: AS) {
-        self.settings.unset(s)
-    }
-
-    #[cfg_attr(feature = "lints", allow(block_in_if_condition_stmt))]
-    pub fn verify_positionals(&self) -> bool {
-        // Because you must wait until all arguments have been supplied, this is the first chance
-        // to make assertions on positional argument indexes
-        //
-        // First we verify that the index highest supplied index, is equal to the number of
-        // positional arguments to verify there are no gaps (i.e. supplying an index of 1 and 3
-        // but no 2)
-        if let Some((idx, p)) = self.positionals.iter().rev().next() {
-            assert!(
-                !(idx != self.positionals.len()),
-                "Found positional argument \"{}\" whose index is {} but there \
-                 are only {} positional arguments defined",
-                p.b.name,
-                idx,
-                self.positionals.len()
-            );
-        }
-
-        // Next we verify that only the highest index has a .multiple(true) (if any)
-        if self.positionals.values().any(|a| {
-            a.b.is_set(ArgSettings::Multiple) && (a.index as usize != self.positionals.len())
-        }) {
-            let mut it = self.positionals.values().rev();
-            let last = it.next().unwrap();
-            let second_to_last = it.next().unwrap();
-            // Either the final positional is required
-            // Or the second to last has a terminator or .last(true) set
-            let ok = last.is_set(ArgSettings::Required)
-                || (second_to_last.v.terminator.is_some()
-                    || second_to_last.b.is_set(ArgSettings::Last))
-                || last.is_set(ArgSettings::Last);
-            assert!(
-                ok,
-                "When using a positional argument with .multiple(true) that is *not the \
-                 last* positional argument, the last positional argument (i.e the one \
-                 with the highest index) *must* have .required(true) or .last(true) set."
-            );
-            let ok = second_to_last.is_set(ArgSettings::Multiple) || last.is_set(ArgSettings::Last);
-            assert!(
-                ok,
-                "Only the last positional argument, or second to last positional \
-                 argument may be set to .multiple(true)"
-            );
-
-            let count = self
-                .positionals
-                .values()
-                .filter(|p| p.b.settings.is_set(ArgSettings::Multiple) && p.v.num_vals.is_none())
-                .count();
-            let ok = count <= 1
-                || (last.is_set(ArgSettings::Last)
-                    && last.is_set(ArgSettings::Multiple)
-                    && second_to_last.is_set(ArgSettings::Multiple)
-                    && count == 2);
-            assert!(
-                ok,
-                "Only one positional argument with .multiple(true) set is allowed per \
-                 command, unless the second one also has .last(true) set"
-            );
-        }
-
-        if self.is_set(AS::AllowMissingPositional) {
-            // Check that if a required positional argument is found, all positions with a lower
-            // index are also required.
-            let mut found = false;
-            let mut foundx2 = false;
-            for p in self.positionals.values().rev() {
-                if foundx2 && !p.b.settings.is_set(ArgSettings::Required) {
-                    assert!(
-                        p.b.is_set(ArgSettings::Required),
-                        "Found positional argument which is not required with a lower \
-                         index than a required positional argument by two or more: {:?} \
-                         index {}",
-                        p.b.name,
-                        p.index
-                    );
-                } else if p.b.is_set(ArgSettings::Required) && !p.b.is_set(ArgSettings::Last) {
-                    // Args that .last(true) don't count since they can be required and have
-                    // positionals with a lower index that aren't required
-                    // Imagine: prog <req1> [opt1] -- <req2>
-                    // Both of these are valid invocations:
-                    //      $ prog r1 -- r2
-                    //      $ prog r1 o1 -- r2
-                    if found {
-                        foundx2 = true;
-                        continue;
-                    }
-                    found = true;
-                    continue;
-                } else {
-                    found = false;
-                }
-            }
-        } else {
-            // Check that if a required positional argument is found, all positions with a lower
-            // index are also required
-            let mut found = false;
-            for p in self.positionals.values().rev() {
-                if found {
-                    assert!(
-                        p.b.is_set(ArgSettings::Required),
-                        "Found positional argument which is not required with a lower \
-                         index than a required positional argument: {:?} index {}",
-                        p.b.name,
-                        p.index
-                    );
-                } else if p.b.is_set(ArgSettings::Required) && !p.b.is_set(ArgSettings::Last) {
-                    // Args that .last(true) don't count since they can be required and have
-                    // positionals with a lower index that aren't required
-                    // Imagine: prog <req1> [opt1] -- <req2>
-                    // Both of these are valid invocations:
-                    //      $ prog r1 -- r2
-                    //      $ prog r1 o1 -- r2
-                    found = true;
-                    continue;
-                }
-            }
-        }
-        if self
-            .positionals
-            .values()
-            .any(|p| p.b.is_set(ArgSettings::Last) && p.b.is_set(ArgSettings::Required))
-            && self.has_subcommands()
-            && !self.is_set(AS::SubcommandsNegateReqs)
-        {
-            panic!(
-                "Having a required positional argument with .last(true) set *and* child \
-                 subcommands without setting SubcommandsNegateReqs isn't compatible."
-            );
-        }
-
-        true
-    }
-
-    pub fn propagate_globals(&mut self) {
-        for sc in &mut self.subcommands {
-            // We have to create a new scope in order to tell rustc the borrow of `sc` is
-            // done and to recursively call this method
-            {
-                for a in &self.global_args {
-                    sc.p.add_arg_ref(a);
-                }
-            }
-            sc.p.propagate_globals();
-        }
-    }
-
-    // Checks if the arg matches a subcommand name, or any of it's aliases (if defined)
-    fn possible_subcommand(&self, arg_os: &OsStr) -> (bool, Option<&str>) {
-        #[cfg(any(target_os = "windows", target_arch = "wasm32"))]
-        use osstringext::OsStrExt3;
-        #[cfg(not(any(target_os = "windows", target_arch = "wasm32")))]
-        use std::os::unix::ffi::OsStrExt;
-        debugln!("Parser::possible_subcommand: arg={:?}", arg_os);
-        fn starts(h: &str, n: &OsStr) -> bool {
-            let n_bytes = n.as_bytes();
-            let h_bytes = OsStr::new(h).as_bytes();
-
-            h_bytes.starts_with(n_bytes)
-        }
-
-        if self.is_set(AS::ArgsNegateSubcommands) && self.is_set(AS::ValidArgFound) {
-            return (false, None);
-        }
-        if !self.is_set(AS::InferSubcommands) {
-            if let Some(sc) = find_subcmd!(self, arg_os) {
-                return (true, Some(&sc.p.meta.name));
-            }
-        } else {
-            let v = self
-                .subcommands
-                .iter()
-                .filter(|s| {
-                    starts(&s.p.meta.name[..], &*arg_os)
-                        || (s.p.meta.aliases.is_some()
-                            && s.p
-                                .meta
-                                .aliases
-                                .as_ref()
-                                .unwrap()
-                                .iter()
-                                .filter(|&&(a, _)| starts(a, &*arg_os))
-                                .count()
-                                == 1)
-                })
-                .map(|sc| &sc.p.meta.name)
-                .collect::<Vec<_>>();
-
-            for sc in &v {
-                if OsStr::new(sc) == arg_os {
-                    return (true, Some(sc));
-                }
-            }
-
-            if v.len() == 1 {
-                return (true, Some(v[0]));
-            }
-        }
-        (false, None)
-    }
-
-    fn parse_help_subcommand<I, T>(&self, it: &mut I) -> ClapResult<ParseResult<'a>>
-    where
-        I: Iterator<Item = T>,
-        T: Into<OsString>,
-    {
-        debugln!("Parser::parse_help_subcommand;");
-        let cmds: Vec<OsString> = it.map(|c| c.into()).collect();
-        let mut help_help = false;
-        let mut bin_name = self
-            .meta
-            .bin_name
-            .as_ref()
-            .unwrap_or(&self.meta.name)
-            .clone();
-        let mut sc = {
-            let mut sc: &Parser = self;
-            for (i, cmd) in cmds.iter().enumerate() {
-                if &*cmd.to_string_lossy() == "help" {
-                    // cmd help help
-                    help_help = true;
-                }
-                if let Some(c) = sc
-                    .subcommands
-                    .iter()
-                    .find(|s| &*s.p.meta.name == cmd)
-                    .map(|sc| &sc.p)
-                {
-                    sc = c;
-                    if i == cmds.len() - 1 {
-                        break;
-                    }
-                } else if let Some(c) = sc
-                    .subcommands
-                    .iter()
-                    .find(|s| {
-                        if let Some(ref als) = s.p.meta.aliases {
-                            als.iter().any(|&(a, _)| a == &*cmd.to_string_lossy())
-                        } else {
-                            false
-                        }
-                    })
-                    .map(|sc| &sc.p)
-                {
-                    sc = c;
-                    if i == cmds.len() - 1 {
-                        break;
-                    }
-                } else {
-                    return Err(Error::unrecognized_subcommand(
-                        cmd.to_string_lossy().into_owned(),
-                        self.meta.bin_name.as_ref().unwrap_or(&self.meta.name),
-                        self.color(),
-                    ));
-                }
-                bin_name = format!("{} {}", bin_name, &*sc.meta.name);
-            }
-            sc.clone()
-        };
-        if help_help {
-            let mut pb = PosBuilder::new("subcommand", 1);
-            pb.b.help = Some("The subcommand whose help message to display");
-            pb.set(ArgSettings::Multiple);
-            sc.positionals.insert(1, pb);
-            sc.settings = sc.settings | self.g_settings;
-        } else {
-            sc.create_help_and_version();
-        }
-        if sc.meta.bin_name != self.meta.bin_name {
-            sc.meta.bin_name = Some(format!("{} {}", bin_name, sc.meta.name));
-        }
-        Err(sc._help(false))
-    }
-
-    // allow wrong self convention due to self.valid_neg_num = true and it's a private method
-    #[cfg_attr(feature = "lints", allow(wrong_self_convention))]
-    fn is_new_arg(&mut self, arg_os: &OsStr, needs_val_of: ParseResult) -> bool {
-        debugln!("Parser::is_new_arg:{:?}:{:?}", arg_os, needs_val_of);
-        let app_wide_settings = if self.is_set(AS::AllowLeadingHyphen) {
-            true
-        } else if self.is_set(AS::AllowNegativeNumbers) {
-            let a = arg_os.to_string_lossy();
-            if a.parse::<i64>().is_ok() || a.parse::<f64>().is_ok() {
-                self.set(AS::ValidNegNumFound);
-                true
-            } else {
-                false
-            }
-        } else {
-            false
-        };
-        let arg_allows_tac = match needs_val_of {
-            ParseResult::Opt(name) => {
-                let o = self
-                    .opts
-                    .iter()
-                    .find(|o| o.b.name == name)
-                    .expect(INTERNAL_ERROR_MSG);
-                (o.is_set(ArgSettings::AllowLeadingHyphen) || app_wide_settings)
-            }
-            ParseResult::Pos(name) => {
-                let p = self
-                    .positionals
-                    .values()
-                    .find(|p| p.b.name == name)
-                    .expect(INTERNAL_ERROR_MSG);
-                (p.is_set(ArgSettings::AllowLeadingHyphen) || app_wide_settings)
-            }
-            ParseResult::ValuesDone => return true,
-            _ => false,
-        };
-        debugln!("Parser::is_new_arg: arg_allows_tac={:?}", arg_allows_tac);
-
-        // Is this a new argument, or values from a previous option?
-        let mut ret = if arg_os.starts_with(b"--") {
-            debugln!("Parser::is_new_arg: -- found");
-            if arg_os.len() == 2 && !arg_allows_tac {
-                return true; // We have to return true so override everything else
-            } else if arg_allows_tac {
-                return false;
-            }
-            true
-        } else if arg_os.starts_with(b"-") {
-            debugln!("Parser::is_new_arg: - found");
-            // a singe '-' by itself is a value and typically means "stdin" on unix systems
-            !(arg_os.len() == 1)
-        } else {
-            debugln!("Parser::is_new_arg: probably value");
-            false
-        };
-
-        ret = ret && !arg_allows_tac;
-
-        debugln!("Parser::is_new_arg: starts_new_arg={:?}", ret);
-        ret
-    }
-
-    // The actual parsing function
-    #[cfg_attr(feature = "lints", allow(while_let_on_iterator, collapsible_if))]
-    pub fn get_matches_with<I, T>(
-        &mut self,
-        matcher: &mut ArgMatcher<'a>,
-        it: &mut Peekable<I>,
-    ) -> ClapResult<()>
-    where
-        I: Iterator<Item = T>,
-        T: Into<OsString> + Clone,
-    {
-        debugln!("Parser::get_matches_with;");
-        // Verify all positional assertions pass
-        debug_assert!(self.app_debug_asserts());
-        if self.positionals.values().any(|a| {
-            a.b.is_set(ArgSettings::Multiple) && (a.index as usize != self.positionals.len())
-        }) && self
-            .positionals
-            .values()
-            .last()
-            .map_or(false, |p| !p.is_set(ArgSettings::Last))
-        {
-            self.settings.set(AS::LowIndexMultiplePositional);
-        }
-        let has_args = self.has_args();
-
-        // Next we create the `--help` and `--version` arguments and add them if
-        // necessary
-        self.create_help_and_version();
-
-        let mut subcmd_name: Option<String> = None;
-        let mut needs_val_of: ParseResult<'a> = ParseResult::NotFound;
-        let mut pos_counter = 1;
-        let mut sc_is_external = false;
-        while let Some(arg) = it.next() {
-            let arg_os = arg.into();
-            debugln!(
-                "Parser::get_matches_with: Begin parsing '{:?}' ({:?})",
-                arg_os,
-                &*arg_os.as_bytes()
-            );
-
-            self.unset(AS::ValidNegNumFound);
-            // Is this a new argument, or values from a previous option?
-            let starts_new_arg = self.is_new_arg(&arg_os, needs_val_of);
-            if !self.is_set(AS::TrailingValues)
-                && arg_os.starts_with(b"--")
-                && arg_os.len() == 2
-                && starts_new_arg
-            {
-                debugln!("Parser::get_matches_with: setting TrailingVals=true");
-                self.set(AS::TrailingValues);
-                continue;
-            }
-
-            // Has the user already passed '--'? Meaning only positional args follow
-            if !self.is_set(AS::TrailingValues) {
-                // Does the arg match a subcommand name, or any of it's aliases (if defined)
-                {
-                    match needs_val_of {
-                        ParseResult::Opt(_) | ParseResult::Pos(_) => (),
-                        _ => {
-                            let (is_match, sc_name) = self.possible_subcommand(&arg_os);
-                            debugln!(
-                                "Parser::get_matches_with: possible_sc={:?}, sc={:?}",
-                                is_match,
-                                sc_name
-                            );
-                            if is_match {
-                                let sc_name = sc_name.expect(INTERNAL_ERROR_MSG);
-                                if sc_name == "help" && self.is_set(AS::NeedsSubcommandHelp) {
-                                    self.parse_help_subcommand(it)?;
-                                }
-                                subcmd_name = Some(sc_name.to_owned());
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                if starts_new_arg {
-                    let check_all = self.is_set(AS::AllArgsOverrideSelf);
-                    {
-                        let any_arg = find_any_by_name!(self, self.cache.unwrap_or(""));
-                        matcher.process_arg_overrides(
-                            any_arg,
-                            &mut self.overrides,
-                            &mut self.required,
-                            check_all,
-                        );
-                    }
-
-                    if arg_os.starts_with(b"--") {
-                        needs_val_of = self.parse_long_arg(matcher, &arg_os, it)?;
-                        debugln!(
-                            "Parser:get_matches_with: After parse_long_arg {:?}",
-                            needs_val_of
-                        );
-                        match needs_val_of {
-                            ParseResult::Flag | ParseResult::Opt(..) | ParseResult::ValuesDone => {
-                                continue
-                            }
-                            _ => (),
-                        }
-                    } else if arg_os.starts_with(b"-") && arg_os.len() != 1 {
-                        // Try to parse short args like normal, if AllowLeadingHyphen or
-                        // AllowNegativeNumbers is set, parse_short_arg will *not* throw
-                        // an error, and instead return Ok(None)
-                        needs_val_of = self.parse_short_arg(matcher, &arg_os)?;
-                        // If it's None, we then check if one of those two AppSettings was set
-                        debugln!(
-                            "Parser:get_matches_with: After parse_short_arg {:?}",
-                            needs_val_of
-                        );
-                        match needs_val_of {
-                            ParseResult::MaybeNegNum => {
-                                if !(arg_os.to_string_lossy().parse::<i64>().is_ok()
-                                    || arg_os.to_string_lossy().parse::<f64>().is_ok())
-                                {
-                                    return Err(Error::unknown_argument(
-                                        &*arg_os.to_string_lossy(),
-                                        "",
-                                        &*usage::create_error_usage(self, matcher, None),
-                                        self.color(),
-                                    ));
-                                }
-                            }
-                            ParseResult::Opt(..) | ParseResult::Flag | ParseResult::ValuesDone => {
-                                continue
-                            }
-                            _ => (),
-                        }
-                    }
-                } else {
-                    if let ParseResult::Opt(name) = needs_val_of {
-                        // Check to see if parsing a value from a previous arg
-                        let arg = self
-                            .opts
-                            .iter()
-                            .find(|o| o.b.name == name)
-                            .expect(INTERNAL_ERROR_MSG);
-                        // get the OptBuilder so we can check the settings
-                        needs_val_of = self.add_val_to_arg(arg, &arg_os, matcher)?;
-                        // get the next value from the iterator
-                        continue;
-                    }
-                }
-            }
-
-            if !(self.is_set(AS::ArgsNegateSubcommands) && self.is_set(AS::ValidArgFound))
-                && !self.is_set(AS::InferSubcommands)
-                && !self.is_set(AS::AllowExternalSubcommands)
-            {
-                if let Some(cdate) =
-                    suggestions::did_you_mean(&*arg_os.to_string_lossy(), sc_names!(self))
-                {
-                    return Err(Error::invalid_subcommand(
-                        arg_os.to_string_lossy().into_owned(),
-                        cdate,
-                        self.meta.bin_name.as_ref().unwrap_or(&self.meta.name),
-                        &*usage::create_error_usage(self, matcher, None),
-                        self.color(),
-                    ));
-                }
-            }
-
-            let low_index_mults = self.is_set(AS::LowIndexMultiplePositional)
-                && pos_counter == (self.positionals.len() - 1);
-            let missing_pos = self.is_set(AS::AllowMissingPositional)
-                && (pos_counter == (self.positionals.len() - 1)
-                    && !self.is_set(AS::TrailingValues));
-            debugln!(
-                "Parser::get_matches_with: Positional counter...{}",
-                pos_counter
-            );
-            debugln!(
-                "Parser::get_matches_with: Low index multiples...{:?}",
-                low_index_mults
-            );
-            if low_index_mults || missing_pos {
-                if let Some(na) = it.peek() {
-                    let n = (*na).clone().into();
-                    needs_val_of = if needs_val_of != ParseResult::ValuesDone {
-                        if let Some(p) = self.positionals.get(pos_counter) {
-                            ParseResult::Pos(p.b.name)
-                        } else {
-                            ParseResult::ValuesDone
-                        }
-                    } else {
-                        ParseResult::ValuesDone
-                    };
-                    let sc_match = { self.possible_subcommand(&n).0 };
-                    if self.is_new_arg(&n, needs_val_of)
-                        || sc_match
-                        || suggestions::did_you_mean(&n.to_string_lossy(), sc_names!(self))
-                            .is_some()
-                    {
-                        debugln!("Parser::get_matches_with: Bumping the positional counter...");
-                        pos_counter += 1;
-                    }
-                } else {
-                    debugln!("Parser::get_matches_with: Bumping the positional counter...");
-                    pos_counter += 1;
-                }
-            } else if (self.is_set(AS::AllowMissingPositional) && self.is_set(AS::TrailingValues))
-                || (self.is_set(AS::ContainsLast) && self.is_set(AS::TrailingValues))
-            {
-                // Came to -- and one postional has .last(true) set, so we go immediately
-                // to the last (highest index) positional
-                debugln!("Parser::get_matches_with: .last(true) and --, setting last pos");
-                pos_counter = self.positionals.len();
-            }
-            if let Some(p) = self.positionals.get(pos_counter) {
-                if p.is_set(ArgSettings::Last) && !self.is_set(AS::TrailingValues) {
-                    return Err(Error::unknown_argument(
-                        &*arg_os.to_string_lossy(),
-                        "",
-                        &*usage::create_error_usage(self, matcher, None),
-                        self.color(),
-                    ));
-                }
-                if !self.is_set(AS::TrailingValues)
-                    && (self.is_set(AS::TrailingVarArg) && pos_counter == self.positionals.len())
-                {
-                    self.settings.set(AS::TrailingValues);
-                }
-                if self.cache.map_or(true, |name| name != p.b.name) {
-                    let check_all = self.is_set(AS::AllArgsOverrideSelf);
-                    {
-                        let any_arg = find_any_by_name!(self, self.cache.unwrap_or(""));
-                        matcher.process_arg_overrides(
-                            any_arg,
-                            &mut self.overrides,
-                            &mut self.required,
-                            check_all,
-                        );
-                    }
-                    self.cache = Some(p.b.name);
-                }
-                let _ = self.add_val_to_arg(p, &arg_os, matcher)?;
-
-                matcher.inc_occurrence_of(p.b.name);
-                let _ = self
-                    .groups_for_arg(p.b.name)
-                    .and_then(|vec| Some(matcher.inc_occurrences_of(&*vec)));
-
-                self.settings.set(AS::ValidArgFound);
-                // Only increment the positional counter if it doesn't allow multiples
-                if !p.b.settings.is_set(ArgSettings::Multiple) {
-                    pos_counter += 1;
-                }
-                self.settings.set(AS::ValidArgFound);
-            } else if self.is_set(AS::AllowExternalSubcommands) {
-                // Get external subcommand name
-                let sc_name = match arg_os.to_str() {
-                    Some(s) => s.to_string(),
-                    None => {
-                        if !self.is_set(AS::StrictUtf8) {
-                            return Err(Error::invalid_utf8(
-                                &*usage::create_error_usage(self, matcher, None),
-                                self.color(),
-                            ));
-                        }
-                        arg_os.to_string_lossy().into_owned()
-                    }
-                };
-
-                // Collect the external subcommand args
-                let mut sc_m = ArgMatcher::new();
-                while let Some(v) = it.next() {
-                    let a = v.into();
-                    if a.to_str().is_none() && !self.is_set(AS::StrictUtf8) {
-                        return Err(Error::invalid_utf8(
-                            &*usage::create_error_usage(self, matcher, None),
-                            self.color(),
-                        ));
-                    }
-                    sc_m.add_val_to("", &a);
-                }
-
-                matcher.subcommand(SubCommand {
-                    name: sc_name,
-                    matches: sc_m.into(),
-                });
-                sc_is_external = true;
-            } else if !((self.is_set(AS::AllowLeadingHyphen)
-                || self.is_set(AS::AllowNegativeNumbers))
-                && arg_os.starts_with(b"-"))
-                && !self.is_set(AS::InferSubcommands)
-            {
-                return Err(Error::unknown_argument(
-                    &*arg_os.to_string_lossy(),
-                    "",
-                    &*usage::create_error_usage(self, matcher, None),
-                    self.color(),
-                ));
-            } else if !has_args || self.is_set(AS::InferSubcommands) && self.has_subcommands() {
-                if let Some(cdate) =
-                    suggestions::did_you_mean(&*arg_os.to_string_lossy(), sc_names!(self))
-                {
-                    return Err(Error::invalid_subcommand(
-                        arg_os.to_string_lossy().into_owned(),
-                        cdate,
-                        self.meta.bin_name.as_ref().unwrap_or(&self.meta.name),
-                        &*usage::create_error_usage(self, matcher, None),
-                        self.color(),
-                    ));
-                } else {
-                    return Err(Error::unrecognized_subcommand(
-                        arg_os.to_string_lossy().into_owned(),
-                        self.meta.bin_name.as_ref().unwrap_or(&self.meta.name),
-                        self.color(),
-                    ));
-                }
-            } else {
-                return Err(Error::unknown_argument(
-                    &*arg_os.to_string_lossy(),
-                    "",
-                    &*usage::create_error_usage(self, matcher, None),
-                    self.color(),
-                ));
-            }
-        }
-
-        if !sc_is_external {
-            if let Some(ref pos_sc_name) = subcmd_name {
-                let sc_name = {
-                    find_subcmd!(self, pos_sc_name)
-                        .expect(INTERNAL_ERROR_MSG)
-                        .p
-                        .meta
-                        .name
-                        .clone()
-                };
-                self.parse_subcommand(&*sc_name, matcher, it)?;
-            } else if self.is_set(AS::SubcommandRequired) {
-                let bn = self.meta.bin_name.as_ref().unwrap_or(&self.meta.name);
-                return Err(Error::missing_subcommand(
-                    bn,
-                    &usage::create_error_usage(self, matcher, None),
-                    self.color(),
-                ));
-            } else if self.is_set(AS::SubcommandRequiredElseHelp) {
-                debugln!("Parser::get_matches_with: SubcommandRequiredElseHelp=true");
-                let mut out = vec![];
-                self.write_help_err(&mut out)?;
-                return Err(Error {
-                    message: String::from_utf8_lossy(&*out).into_owned(),
-                    kind: ErrorKind::MissingArgumentOrSubcommand,
-                    info: None,
-                });
-            }
-        }
-
-        // In case the last arg was new, we  need to process it's overrides
-        let check_all = self.is_set(AS::AllArgsOverrideSelf);
-        {
-            let any_arg = find_any_by_name!(self, self.cache.unwrap_or(""));
-            matcher.process_arg_overrides(
-                any_arg,
-                &mut self.overrides,
-                &mut self.required,
-                check_all,
-            );
-        }
-
-        self.remove_overrides(matcher);
-
-        Validator::new(self).validate(needs_val_of, subcmd_name, matcher)
-    }
-
-    fn remove_overrides(&mut self, matcher: &mut ArgMatcher) {
-        debugln!("Parser::remove_overrides:{:?};", self.overrides);
-        for &(overr, name) in &self.overrides {
-            debugln!("Parser::remove_overrides:iter:({},{});", overr, name);
-            if matcher.is_present(overr) {
-                debugln!(
-                    "Parser::remove_overrides:iter:({},{}): removing {};",
-                    overr,
-                    name,
-                    name
-                );
-                matcher.remove(name);
-                for i in (0..self.required.len()).rev() {
-                    debugln!(
-                        "Parser::remove_overrides:iter:({},{}): removing required {};",
-                        overr,
-                        name,
-                        name
-                    );
-                    if self.required[i] == name {
-                        self.required.swap_remove(i);
-                        break;
-                    }
-                }
-            }
-        }
-    }
-
-    fn propagate_help_version(&mut self) {
-        debugln!("Parser::propagate_help_version;");
-        self.create_help_and_version();
-        for sc in &mut self.subcommands {
-            sc.p.propagate_help_version();
-        }
-    }
-
-    fn build_bin_names(&mut self) {
-        debugln!("Parser::build_bin_names;");
-        for sc in &mut self.subcommands {
-            debug!("Parser::build_bin_names:iter: bin_name set...");
-            if sc.p.meta.bin_name.is_none() {
-                sdebugln!("No");
-                let bin_name = format!(
-                    "{}{}{}",
-                    self.meta
-                        .bin_name
-                        .as_ref()
-                        .unwrap_or(&self.meta.name.clone()),
-                    if self.meta.bin_name.is_some() {
-                        " "
-                    } else {
-                        ""
-                    },
-                    &*sc.p.meta.name
-                );
-                debugln!(
-                    "Parser::build_bin_names:iter: Setting bin_name of {} to {}",
-                    self.meta.name,
-                    bin_name
-                );
-                sc.p.meta.bin_name = Some(bin_name);
-            } else {
-                sdebugln!("yes ({:?})", sc.p.meta.bin_name);
-            }
-            debugln!(
-                "Parser::build_bin_names:iter: Calling build_bin_names from...{}",
-                sc.p.meta.name
-            );
-            sc.p.build_bin_names();
-        }
-    }
-
-    fn parse_subcommand<I, T>(
-        &mut self,
-        sc_name: &str,
-        matcher: &mut ArgMatcher<'a>,
-        it: &mut Peekable<I>,
-    ) -> ClapResult<()>
-    where
-        I: Iterator<Item = T>,
-        T: Into<OsString> + Clone,
-    {
-        use std::fmt::Write;
-        debugln!("Parser::parse_subcommand;");
-        let mut mid_string = String::new();
-        if !self.is_set(AS::SubcommandsNegateReqs) {
-            let mut hs: Vec<&str> = self.required.iter().map(|n| &**n).collect();
-            for k in matcher.arg_names() {
-                hs.push(k);
-            }
-            let reqs = usage::get_required_usage_from(self, &hs, Some(matcher), None, false);
-
-            for s in &reqs {
-                write!(&mut mid_string, " {}", s).expect(INTERNAL_ERROR_MSG);
-            }
-        }
-        mid_string.push_str(" ");
-        if let Some(ref mut sc) = self
-            .subcommands
-            .iter_mut()
-            .find(|s| s.p.meta.name == sc_name)
-        {
-            let mut sc_matcher = ArgMatcher::new();
-            // bin_name should be parent's bin_name + [<reqs>] + the sc's name separated by
-            // a space
-            sc.p.meta.usage = Some(format!(
-                "{}{}{}",
-                self.meta.bin_name.as_ref().unwrap_or(&String::new()),
-                if self.meta.bin_name.is_some() {
-                    &*mid_string
-                } else {
-                    ""
-                },
-                &*sc.p.meta.name
-            ));
-            sc.p.meta.bin_name = Some(format!(
-                "{}{}{}",
-                self.meta.bin_name.as_ref().unwrap_or(&String::new()),
-                if self.meta.bin_name.is_some() {
-                    " "
-                } else {
-                    ""
-                },
-                &*sc.p.meta.name
-            ));
-            debugln!(
-                "Parser::parse_subcommand: About to parse sc={}",
-                sc.p.meta.name
-            );
-            debugln!("Parser::parse_subcommand: sc settings={:#?}", sc.p.settings);
-            sc.p.get_matches_with(&mut sc_matcher, it)?;
-            matcher.subcommand(SubCommand {
-                name: sc.p.meta.name.clone(),
-                matches: sc_matcher.into(),
-            });
-        }
-        Ok(())
-    }
-
-    pub fn groups_for_arg(&self, name: &str) -> Option<Vec<&'a str>> {
-        debugln!("Parser::groups_for_arg: name={}", name);
-
-        if self.groups.is_empty() {
-            debugln!("Parser::groups_for_arg: No groups defined");
-            return None;
-        }
-        let mut res = vec![];
-        debugln!("Parser::groups_for_arg: Searching through groups...");
-        for grp in &self.groups {
-            for a in &grp.args {
-                if a == &name {
-                    sdebugln!("\tFound '{}'", grp.name);
-                    res.push(&*grp.name);
-                }
-            }
-        }
-        if res.is_empty() {
-            return None;
-        }
-
-        Some(res)
-    }
-
-    pub fn args_in_group(&self, group: &str) -> Vec<String> {
-        debug_assert!(self.app_debug_asserts());
-
-        let mut g_vec = vec![];
-        let mut args = vec![];
-
-        for n in &self
-            .groups
-            .iter()
-            .find(|g| g.name == group)
-            .expect(INTERNAL_ERROR_MSG)
-            .args
-        {
-            if let Some(f) = self.flags.iter().find(|f| &f.b.name == n) {
-                args.push(f.to_string());
-            } else if let Some(f) = self.opts.iter().find(|o| &o.b.name == n) {
-                args.push(f.to_string());
-            } else if let Some(p) = self.positionals.values().find(|p| &p.b.name == n) {
-                args.push(p.b.name.to_owned());
-            } else {
-                g_vec.push(*n);
-            }
-        }
-
-        for av in g_vec.iter().map(|g| self.args_in_group(g)) {
-            args.extend(av);
-        }
-        args.dedup();
-        args.iter().map(ToOwned::to_owned).collect()
-    }
-
-    pub fn arg_names_in_group(&self, group: &str) -> Vec<&'a str> {
-        let mut g_vec = vec![];
-        let mut args = vec![];
-
-        for n in &self
-            .groups
-            .iter()
-            .find(|g| g.name == group)
-            .expect(INTERNAL_ERROR_MSG)
-            .args
-        {
-            if self.groups.iter().any(|g| g.name == *n) {
-                args.extend(self.arg_names_in_group(n));
-                g_vec.push(*n);
-            } else if !args.contains(n) {
-                args.push(*n);
-            }
-        }
-
-        args.iter().map(|s| *s).collect()
-    }
-
-    pub fn create_help_and_version(&mut self) {
-        debugln!("Parser::create_help_and_version;");
-        // name is "hclap_help" because flags are sorted by name
-        if !self.is_set(AS::DisableHelpFlags) && !self.contains_long("help") {
-            debugln!("Parser::create_help_and_version: Building --help");
-            if self.help_short.is_none() && !self.contains_short('h') {
-                self.help_short = Some('h');
-            }
-            let arg = FlagBuilder {
-                b: Base {
-                    name: "hclap_help",
-                    help: self.help_message.or(Some("Prints help information")),
-                    ..Default::default()
-                },
-                s: Switched {
-                    short: self.help_short,
-                    long: Some("help"),
-                    ..Default::default()
-                },
-            };
-            self.flags.push(arg);
-        }
-        if !self.is_set(AS::DisableVersion) && !self.contains_long("version") {
-            debugln!("Parser::create_help_and_version: Building --version");
-            if self.version_short.is_none() && !self.contains_short('V') {
-                self.version_short = Some('V');
-            }
-            // name is "vclap_version" because flags are sorted by name
-            let arg = FlagBuilder {
-                b: Base {
-                    name: "vclap_version",
-                    help: self.version_message.or(Some("Prints version information")),
-                    ..Default::default()
-                },
-                s: Switched {
-                    short: self.version_short,
-                    long: Some("version"),
-                    ..Default::default()
-                },
-            };
-            self.flags.push(arg);
-        }
-        if !self.subcommands.is_empty()
-            && !self.is_set(AS::DisableHelpSubcommand)
-            && self.is_set(AS::NeedsSubcommandHelp)
-        {
-            debugln!("Parser::create_help_and_version: Building help");
-            self.subcommands.push(
-                App::new("help")
-                    .about("Prints this message or the help of the given subcommand(s)"),
-            );
-        }
-    }
-
-    // Retrieves the names of all args the user has supplied thus far, except required ones
-    // because those will be listed in self.required
-    fn check_for_help_and_version_str(&self, arg: &OsStr) -> ClapResult<()> {
-        debugln!("Parser::check_for_help_and_version_str;");
-        debug!(
-            "Parser::check_for_help_and_version_str: Checking if --{} is help or version...",
-            arg.to_str().unwrap()
-        );
-        if arg == "help" && self.is_set(AS::NeedsLongHelp) {
-            sdebugln!("Help");
-            return Err(self._help(true));
-        }
-        if arg == "version" && self.is_set(AS::NeedsLongVersion) {
-            sdebugln!("Version");
-            return Err(self._version(true));
-        }
-        sdebugln!("Neither");
-
-        Ok(())
-    }
-
-    fn check_for_help_and_version_char(&self, arg: char) -> ClapResult<()> {
-        debugln!("Parser::check_for_help_and_version_char;");
-        debug!(
-            "Parser::check_for_help_and_version_char: Checking if -{} is help or version...",
-            arg
-        );
-        if let Some(h) = self.help_short {
-            if arg == h && self.is_set(AS::NeedsLongHelp) {
-                sdebugln!("Help");
-                return Err(self._help(false));
-            }
-        }
-        if let Some(v) = self.version_short {
-            if arg == v && self.is_set(AS::NeedsLongVersion) {
-                sdebugln!("Version");
-                return Err(self._version(false));
-            }
-        }
-        sdebugln!("Neither");
-        Ok(())
-    }
-
-    fn use_long_help(&self) -> bool {
-        // In this case, both must be checked. This allows the retention of
-        // original formatting, but also ensures that the actual -h or --help
-        // specified by the user is sent through. If HiddenShortHelp is not included,
-        // then items specified with hidden_short_help will also be hidden.
-        let should_long = |v: &Base| {
-            v.long_help.is_some()
-                || v.is_set(ArgSettings::HiddenLongHelp)
-                || v.is_set(ArgSettings::HiddenShortHelp)
-        };
-
-        self.meta.long_about.is_some()
-            || self.flags.iter().any(|f| should_long(&f.b))
-            || self.opts.iter().any(|o| should_long(&o.b))
-            || self.positionals.values().any(|p| should_long(&p.b))
-            || self
-                .subcommands
-                .iter()
-                .any(|s| s.p.meta.long_about.is_some())
-    }
-
-    fn _help(&self, mut use_long: bool) -> Error {
-        debugln!("Parser::_help: use_long={:?}", use_long);
-        use_long = use_long && self.use_long_help();
-        let mut buf = vec![];
-        match Help::write_parser_help(&mut buf, self, use_long) {
-            Err(e) => e,
-            _ => Error {
-                message: String::from_utf8(buf).unwrap_or_default(),
-                kind: ErrorKind::HelpDisplayed,
-                info: None,
-            },
-        }
-    }
-
-    fn _version(&self, use_long: bool) -> Error {
-        debugln!("Parser::_version: ");
-        let out = io::stdout();
-        let mut buf_w = BufWriter::new(out.lock());
-        match self.print_version(&mut buf_w, use_long) {
-            Err(e) => e,
-            _ => Error {
-                message: String::new(),
-                kind: ErrorKind::VersionDisplayed,
-                info: None,
-            },
-        }
-    }
-
-    fn parse_long_arg<I, T>(
-        &mut self,
-        matcher: &mut ArgMatcher<'a>,
-        full_arg: &OsStr,
-        it: &mut Peekable<I>,
-    ) -> ClapResult<ParseResult<'a>>
-    where
-        I: Iterator<Item = T>,
-        T: Into<OsString> + Clone,
-    {
-        // maybe here lifetime should be 'a
-        debugln!("Parser::parse_long_arg;");
-
-        // Update the current index
-        self.cur_idx.set(self.cur_idx.get() + 1);
-
-        let mut val = None;
-        debug!("Parser::parse_long_arg: Does it contain '='...");
-        let arg = if full_arg.contains_byte(b'=') {
-            let (p0, p1) = full_arg.trim_left_matches(b'-').split_at_byte(b'=');
-            sdebugln!("Yes '{:?}'", p1);
-            val = Some(p1);
-            p0
-        } else {
-            sdebugln!("No");
-            full_arg.trim_left_matches(b'-')
-        };
-
-        if let Some(opt) = find_opt_by_long!(@os self, arg) {
-            debugln!(
-                "Parser::parse_long_arg: Found valid opt '{}'",
-                opt.to_string()
-            );
-            self.settings.set(AS::ValidArgFound);
-            let ret = self.parse_opt(val, opt, val.is_some(), matcher)?;
-            if self.cache.map_or(true, |name| name != opt.b.name) {
-                self.cache = Some(opt.b.name);
-            }
-
-            return Ok(ret);
-        } else if let Some(flag) = find_flag_by_long!(@os self, arg) {
-            debugln!(
-                "Parser::parse_long_arg: Found valid flag '{}'",
-                flag.to_string()
-            );
-            self.settings.set(AS::ValidArgFound);
-            // Only flags could be help or version, and we need to check the raw long
-            // so this is the first point to check
-            self.check_for_help_and_version_str(arg)?;
-
-            self.parse_flag(flag, matcher)?;
-
-            // Handle conflicts, requirements, etc.
-            if self.cache.map_or(true, |name| name != flag.b.name) {
-                self.cache = Some(flag.b.name);
-            }
-
-            return Ok(ParseResult::Flag);
-        } else if self.is_set(AS::AllowLeadingHyphen) {
-            return Ok(ParseResult::MaybeHyphenValue);
-        } else if self.is_set(AS::ValidNegNumFound) {
-            return Ok(ParseResult::MaybeNegNum);
-        }
-
-        debugln!("Parser::parse_long_arg: Didn't match anything");
-
-        let args_rest: Vec<_> = it.map(|x| x.clone().into()).collect();
-        let args_rest2: Vec<_> = args_rest
-            .iter()
-            .map(|x| x.to_str().expect(INVALID_UTF8))
-            .collect();
-        self.did_you_mean_error(arg.to_str().expect(INVALID_UTF8), matcher, &args_rest2[..])
-            .map(|_| ParseResult::NotFound)
-    }
-
-    #[cfg_attr(feature = "lints", allow(len_zero))]
-    fn parse_short_arg(
-        &mut self,
-        matcher: &mut ArgMatcher<'a>,
-        full_arg: &OsStr,
-    ) -> ClapResult<ParseResult<'a>> {
-        debugln!("Parser::parse_short_arg: full_arg={:?}", full_arg);
-        let arg_os = full_arg.trim_left_matches(b'-');
-        let arg = arg_os.to_string_lossy();
-
-        // If AllowLeadingHyphen is set, we want to ensure `-val` gets parsed as `-val` and not
-        // `-v` `-a` `-l` assuming `v` `a` and `l` are all, or mostly, valid shorts.
-        if self.is_set(AS::AllowLeadingHyphen) {
-            if arg.chars().any(|c| !self.contains_short(c)) {
-                debugln!(
-                    "Parser::parse_short_arg: LeadingHyphenAllowed yet -{} isn't valid",
-                    arg
-                );
-                return Ok(ParseResult::MaybeHyphenValue);
-            }
-        } else if self.is_set(AS::ValidNegNumFound) {
-            // TODO: Add docs about having AllowNegativeNumbers and `-2` as a valid short
-            // May be better to move this to *after* not finding a valid flag/opt?
-            debugln!("Parser::parse_short_arg: Valid negative num...");
-            return Ok(ParseResult::MaybeNegNum);
-        }
-
-        let mut ret = ParseResult::NotFound;
-        for c in arg.chars() {
-            debugln!("Parser::parse_short_arg:iter:{}", c);
-
-            // update each index because `-abcd` is four indices to clap
-            self.cur_idx.set(self.cur_idx.get() + 1);
-
-            // Check for matching short options, and return the name if there is no trailing
-            // concatenated value: -oval
-            // Option: -o
-            // Value: val
-            if let Some(opt) = find_opt_by_short!(self, c) {
-                debugln!("Parser::parse_short_arg:iter:{}: Found valid opt", c);
-                self.settings.set(AS::ValidArgFound);
-                // Check for trailing concatenated value
-                let p: Vec<_> = arg.splitn(2, c).collect();
-                debugln!(
-                    "Parser::parse_short_arg:iter:{}: p[0]={:?}, p[1]={:?}",
-                    c,
-                    p[0].as_bytes(),
-                    p[1].as_bytes()
-                );
-                let i = p[0].as_bytes().len() + 1;
-                let val = if p[1].as_bytes().len() > 0 {
-                    debugln!(
-                        "Parser::parse_short_arg:iter:{}: val={:?} (bytes), val={:?} (ascii)",
-                        c,
-                        arg_os.split_at(i).1.as_bytes(),
-                        arg_os.split_at(i).1
-                    );
-                    Some(arg_os.split_at(i).1)
-                } else {
-                    None
-                };
-
-                // Default to "we're expecting a value later"
-                let ret = self.parse_opt(val, opt, false, matcher)?;
-
-                if self.cache.map_or(true, |name| name != opt.b.name) {
-                    self.cache = Some(opt.b.name);
-                }
-
-                return Ok(ret);
-            } else if let Some(flag) = find_flag_by_short!(self, c) {
-                debugln!("Parser::parse_short_arg:iter:{}: Found valid flag", c);
-                self.settings.set(AS::ValidArgFound);
-                // Only flags can be help or version
-                self.check_for_help_and_version_char(c)?;
-                ret = self.parse_flag(flag, matcher)?;
-
-                // Handle conflicts, requirements, overrides, etc.
-                // Must be called here due to mutabililty
-                if self.cache.map_or(true, |name| name != flag.b.name) {
-                    self.cache = Some(flag.b.name);
-                }
-            } else {
-                let arg = format!("-{}", c);
-                return Err(Error::unknown_argument(
-                    &*arg,
-                    "",
-                    &*usage::create_error_usage(self, matcher, None),
-                    self.color(),
-                ));
-            }
-        }
-        Ok(ret)
-    }
-
-    fn parse_opt(
-        &self,
-        val: Option<&OsStr>,
-        opt: &OptBuilder<'a, 'b>,
-        had_eq: bool,
-        matcher: &mut ArgMatcher<'a>,
-    ) -> ClapResult<ParseResult<'a>> {
-        debugln!("Parser::parse_opt; opt={}, val={:?}", opt.b.name, val);
-        debugln!("Parser::parse_opt; opt.settings={:?}", opt.b.settings);
-        let mut has_eq = false;
-        let no_val = val.is_none();
-        let empty_vals = opt.is_set(ArgSettings::EmptyValues);
-        let min_vals_zero = opt.v.min_vals.unwrap_or(1) == 0;
-        let needs_eq = opt.is_set(ArgSettings::RequireEquals);
-
-        debug!("Parser::parse_opt; Checking for val...");
-        if let Some(fv) = val {
-            has_eq = fv.starts_with(&[b'=']) || had_eq;
-            let v = fv.trim_left_matches(b'=');
-            if !empty_vals && (v.len() == 0 || (needs_eq && !has_eq)) {
-                sdebugln!("Found Empty - Error");
-                return Err(Error::empty_value(
-                    opt,
-                    &*usage::create_error_usage(self, matcher, None),
-                    self.color(),
-                ));
-            }
-            sdebugln!("Found - {:?}, len: {}", v, v.len());
-            debugln!(
-                "Parser::parse_opt: {:?} contains '='...{:?}",
-                fv,
-                fv.starts_with(&[b'='])
-            );
-            self.add_val_to_arg(opt, v, matcher)?;
-        } else if needs_eq && !(empty_vals || min_vals_zero) {
-            sdebugln!("None, but requires equals...Error");
-            return Err(Error::empty_value(
-                opt,
-                &*usage::create_error_usage(self, matcher, None),
-                self.color(),
-            ));
-        } else {
-            sdebugln!("None");
-        }
-
-        matcher.inc_occurrence_of(opt.b.name);
-        // Increment or create the group "args"
-        self.groups_for_arg(opt.b.name)
-            .and_then(|vec| Some(matcher.inc_occurrences_of(&*vec)));
-
-        let needs_delim = opt.is_set(ArgSettings::RequireDelimiter);
-        let mult = opt.is_set(ArgSettings::Multiple);
-        if no_val && min_vals_zero && !has_eq && needs_eq {
-            debugln!("Parser::parse_opt: More arg vals not required...");
-            return Ok(ParseResult::ValuesDone);
-        } else if no_val || (mult && !needs_delim) && !has_eq && matcher.needs_more_vals(opt) {
-            debugln!("Parser::parse_opt: More arg vals required...");
-            return Ok(ParseResult::Opt(opt.b.name));
-        }
-        debugln!("Parser::parse_opt: More arg vals not required...");
-        Ok(ParseResult::ValuesDone)
-    }
-
-    fn add_val_to_arg<A>(
-        &self,
-        arg: &A,
-        val: &OsStr,
-        matcher: &mut ArgMatcher<'a>,
-    ) -> ClapResult<ParseResult<'a>>
-    where
-        A: AnyArg<'a, 'b> + Display,
-    {
-        debugln!("Parser::add_val_to_arg; arg={}, val={:?}", arg.name(), val);
-        debugln!(
-            "Parser::add_val_to_arg; trailing_vals={:?}, DontDelimTrailingVals={:?}",
-            self.is_set(AS::TrailingValues),
-            self.is_set(AS::DontDelimitTrailingValues)
-        );
-        if !(self.is_set(AS::TrailingValues) && self.is_set(AS::DontDelimitTrailingValues)) {
-            if let Some(delim) = arg.val_delim() {
-                if val.is_empty() {
-                    Ok(self.add_single_val_to_arg(arg, val, matcher)?)
-                } else {
-                    let mut iret = ParseResult::ValuesDone;
-                    for v in val.split(delim as u32 as u8) {
-                        iret = self.add_single_val_to_arg(arg, v, matcher)?;
-                    }
-                    // If there was a delimiter used, we're not looking for more values
-                    if val.contains_byte(delim as u32 as u8)
-                        || arg.is_set(ArgSettings::RequireDelimiter)
-                    {
-                        iret = ParseResult::ValuesDone;
-                    }
-                    Ok(iret)
-                }
-            } else {
-                self.add_single_val_to_arg(arg, val, matcher)
-            }
-        } else {
-            self.add_single_val_to_arg(arg, val, matcher)
-        }
-    }
-
-    fn add_single_val_to_arg<A>(
-        &self,
-        arg: &A,
-        v: &OsStr,
-        matcher: &mut ArgMatcher<'a>,
-    ) -> ClapResult<ParseResult<'a>>
-    where
-        A: AnyArg<'a, 'b> + Display,
-    {
-        debugln!("Parser::add_single_val_to_arg;");
-        debugln!("Parser::add_single_val_to_arg: adding val...{:?}", v);
-
-        // update the current index because each value is a distinct index to clap
-        self.cur_idx.set(self.cur_idx.get() + 1);
-
-        // @TODO @docs @p4: docs for indices should probably note that a terminator isn't a value
-        // and therefore not reported in indices
-        if let Some(t) = arg.val_terminator() {
-            if t == v {
-                return Ok(ParseResult::ValuesDone);
-            }
-        }
-
-        matcher.add_val_to(arg.name(), v);
-        matcher.add_index_to(arg.name(), self.cur_idx.get());
-
-        // Increment or create the group "args"
-        if let Some(grps) = self.groups_for_arg(arg.name()) {
-            for grp in grps {
-                matcher.add_val_to(&*grp, v);
-            }
-        }
-
-        if matcher.needs_more_vals(arg) {
-            return Ok(ParseResult::Opt(arg.name()));
-        }
-        Ok(ParseResult::ValuesDone)
-    }
-
-    fn parse_flag(
-        &self,
-        flag: &FlagBuilder<'a, 'b>,
-        matcher: &mut ArgMatcher<'a>,
-    ) -> ClapResult<ParseResult<'a>> {
-        debugln!("Parser::parse_flag;");
-
-        matcher.inc_occurrence_of(flag.b.name);
-        matcher.add_index_to(flag.b.name, self.cur_idx.get());
-
-        // Increment or create the group "args"
-        self.groups_for_arg(flag.b.name)
-            .and_then(|vec| Some(matcher.inc_occurrences_of(&*vec)));
-
-        Ok(ParseResult::Flag)
-    }
-
-    fn did_you_mean_error(
-        &self,
-        arg: &str,
-        matcher: &mut ArgMatcher<'a>,
-        args_rest: &[&str],
-    ) -> ClapResult<()> {
-        // Didn't match a flag or option
-        let suffix =
-            suggestions::did_you_mean_flag_suffix(arg, &args_rest, longs!(self), &self.subcommands);
-
-        // Add the arg to the matches to build a proper usage string
-        if let Some(name) = suffix.1 {
-            if let Some(opt) = find_opt_by_long!(self, name) {
-                self.groups_for_arg(&*opt.b.name)
-                    .and_then(|grps| Some(matcher.inc_occurrences_of(&*grps)));
-                matcher.insert(&*opt.b.name);
-            } else if let Some(flg) = find_flag_by_long!(self, name) {
-                self.groups_for_arg(&*flg.b.name)
-                    .and_then(|grps| Some(matcher.inc_occurrences_of(&*grps)));
-                matcher.insert(&*flg.b.name);
-            }
-        }
-
-        let used_arg = format!("--{}", arg);
-        Err(Error::unknown_argument(
-            &*used_arg,
-            &*suffix.0,
-            &*usage::create_error_usage(self, matcher, None),
-            self.color(),
-        ))
-    }
-
-    // Prints the version to the user and exits if quit=true
-    fn print_version<W: Write>(&self, w: &mut W, use_long: bool) -> ClapResult<()> {
-        self.write_version(w, use_long)?;
-        w.flush().map_err(Error::from)
-    }
-
-    pub fn write_version<W: Write>(&self, w: &mut W, use_long: bool) -> io::Result<()> {
-        let ver = if use_long {
-            self.meta
-                .long_version
-                .unwrap_or_else(|| self.meta.version.unwrap_or(""))
-        } else {
-            self.meta
-                .version
-                .unwrap_or_else(|| self.meta.long_version.unwrap_or(""))
-        };
-        if let Some(bn) = self.meta.bin_name.as_ref() {
-            if bn.contains(' ') {
-                // Incase we're dealing with subcommands i.e. git mv is translated to git-mv
-                write!(w, "{} {}", bn.replace(" ", "-"), ver)
-            } else {
-                write!(w, "{} {}", &self.meta.name[..], ver)
-            }
-        } else {
-            write!(w, "{} {}", &self.meta.name[..], ver)
-        }
-    }
-
-    pub fn print_help(&self) -> ClapResult<()> {
-        let out = io::stdout();
-        let mut buf_w = BufWriter::new(out.lock());
-        self.write_help(&mut buf_w)
-    }
-
-    pub fn write_help<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        Help::write_parser_help(w, self, false)
-    }
-
-    pub fn write_long_help<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        Help::write_parser_help(w, self, true)
-    }
-
-    pub fn write_help_err<W: Write>(&self, w: &mut W) -> ClapResult<()> {
-        Help::write_parser_help_to_stderr(w, self)
-    }
-
-    pub fn add_defaults(&mut self, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
-        debugln!("Parser::add_defaults;");
-        macro_rules! add_val {
-            (@default $_self:ident, $a:ident, $m:ident) => {
-                if let Some(ref val) = $a.v.default_val {
-                    debugln!("Parser::add_defaults:iter:{}: has default vals", $a.b.name);
-                    if $m.get($a.b.name).map(|ma| ma.vals.len()).map(|len| len == 0).unwrap_or(false) {
-                        debugln!("Parser::add_defaults:iter:{}: has no user defined vals", $a.b.name);
-                        $_self.add_val_to_arg($a, OsStr::new(val), $m)?;
-
-                        if $_self.cache.map_or(true, |name| name != $a.name()) {
-                            $_self.cache = Some($a.name());
-                        }
-                    } else if $m.get($a.b.name).is_some() {
-                        debugln!("Parser::add_defaults:iter:{}: has user defined vals", $a.b.name);
-                    } else {
-                        debugln!("Parser::add_defaults:iter:{}: wasn't used", $a.b.name);
-
-                        $_self.add_val_to_arg($a, OsStr::new(val), $m)?;
-
-                        if $_self.cache.map_or(true, |name| name != $a.name()) {
-                            $_self.cache = Some($a.name());
-                        }
-                    }
-                } else {
-                    debugln!("Parser::add_defaults:iter:{}: doesn't have default vals", $a.b.name);
-                }
-            };
-            ($_self:ident, $a:ident, $m:ident) => {
-                if let Some(ref vm) = $a.v.default_vals_ifs {
-                    sdebugln!(" has conditional defaults");
-                    let mut done = false;
-                    if $m.get($a.b.name).is_none() {
-                        for &(arg, val, default) in vm.values() {
-                            let add = if let Some(a) = $m.get(arg) {
-                                if let Some(v) = val {
-                                    a.vals.iter().any(|value| v == value)
-                                } else {
-                                    true
-                                }
-                            } else {
-                                false
-                            };
-                            if add {
-                                $_self.add_val_to_arg($a, OsStr::new(default), $m)?;
-                                if $_self.cache.map_or(true, |name| name != $a.name()) {
-                                    $_self.cache = Some($a.name());
-                                }
-                                done = true;
-                                break;
-                            }
-                        }
-                    }
-
-                    if done {
-                        continue; // outer loop (outside macro)
-                    }
-                } else {
-                    sdebugln!(" doesn't have conditional defaults");
-                }
-                add_val!(@default $_self, $a, $m)
-            };
-        }
-
-        for o in &self.opts {
-            debug!("Parser::add_defaults:iter:{}:", o.b.name);
-            add_val!(self, o, matcher);
-        }
-        for p in self.positionals.values() {
-            debug!("Parser::add_defaults:iter:{}:", p.b.name);
-            add_val!(self, p, matcher);
-        }
-        Ok(())
-    }
-
-    pub fn add_env(&mut self, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
-        macro_rules! add_val {
-            ($_self:ident, $a:ident, $m:ident) => {
-                if let Some(ref val) = $a.v.env {
-                    if $m
-                        .get($a.b.name)
-                        .map(|ma| ma.vals.len())
-                        .map(|len| len == 0)
-                        .unwrap_or(false)
-                    {
-                        if let Some(ref val) = val.1 {
-                            $_self.add_val_to_arg($a, OsStr::new(val), $m)?;
-
-                            if $_self.cache.map_or(true, |name| name != $a.name()) {
-                                $_self.cache = Some($a.name());
-                            }
-                        }
-                    } else {
-                        if let Some(ref val) = val.1 {
-                            $_self.add_val_to_arg($a, OsStr::new(val), $m)?;
-
-                            if $_self.cache.map_or(true, |name| name != $a.name()) {
-                                $_self.cache = Some($a.name());
-                            }
-                        }
-                    }
-                }
-            };
-        }
-
-        for o in &self.opts {
-            add_val!(self, o, matcher);
-        }
-        for p in self.positionals.values() {
-            add_val!(self, p, matcher);
-        }
-        Ok(())
-    }
-
-    pub fn flags(&self) -> Iter<FlagBuilder<'a, 'b>> {
-        self.flags.iter()
-    }
-
-    pub fn opts(&self) -> Iter<OptBuilder<'a, 'b>> {
-        self.opts.iter()
-    }
-
-    pub fn positionals(&self) -> map::Values<PosBuilder<'a, 'b>> {
-        self.positionals.values()
-    }
-
-    pub fn subcommands(&self) -> Iter<App> {
-        self.subcommands.iter()
-    }
-
-    // Should we color the output? None=determined by output location, true=yes, false=no
-    #[doc(hidden)]
-    pub fn color(&self) -> ColorWhen {
-        debugln!("Parser::color;");
-        debug!("Parser::color: Color setting...");
-        if self.is_set(AS::ColorNever) {
-            sdebugln!("Never");
-            ColorWhen::Never
-        } else if self.is_set(AS::ColorAlways) {
-            sdebugln!("Always");
-            ColorWhen::Always
-        } else {
-            sdebugln!("Auto");
-            ColorWhen::Auto
-        }
-    }
-
-    pub fn find_any_arg(&self, name: &str) -> Option<&AnyArg<'a, 'b>> {
-        if let Some(f) = find_by_name!(self, name, flags, iter) {
-            return Some(f);
-        }
-        if let Some(o) = find_by_name!(self, name, opts, iter) {
-            return Some(o);
-        }
-        if let Some(p) = find_by_name!(self, name, positionals, values) {
-            return Some(p);
-        }
-        None
-    }
-
-    /// Check is a given string matches the binary name for this parser
-    fn is_bin_name(&self, value: &str) -> bool {
-        self.meta
-            .bin_name
-            .as_ref()
-            .and_then(|name| Some(value == name))
-            .unwrap_or(false)
-    }
-
-    /// Check is a given string is an alias for this parser
-    fn is_alias(&self, value: &str) -> bool {
-        self.meta
-            .aliases
-            .as_ref()
-            .and_then(|aliases| {
-                for alias in aliases {
-                    if alias.0 == value {
-                        return Some(true);
-                    }
-                }
-                Some(false)
-            })
-            .unwrap_or(false)
-    }
-
-    // Only used for completion scripts due to bin_name messiness
-    #[cfg_attr(feature = "lints", allow(block_in_if_condition_stmt))]
-    pub fn find_subcommand(&'b self, sc: &str) -> Option<&'b App<'a, 'b>> {
-        debugln!("Parser::find_subcommand: sc={}", sc);
-        debugln!(
-            "Parser::find_subcommand: Currently in Parser...{}",
-            self.meta.bin_name.as_ref().unwrap()
-        );
-        for s in &self.subcommands {
-            if s.p.is_bin_name(sc) {
-                return Some(s);
-            }
-            // XXX: why do we split here?
-            // isn't `sc` supposed to be single word already?
-            let last = sc.split(' ').rev().next().expect(INTERNAL_ERROR_MSG);
-            if s.p.is_alias(last) {
-                return Some(s);
-            }
-
-            if let Some(app) = s.p.find_subcommand(sc) {
-                return Some(app);
-            }
-        }
-        None
-    }
-
-    #[inline]
-    fn contains_long(&self, l: &str) -> bool {
-        longs!(self).any(|al| al == &l)
-    }
-
-    #[inline]
-    fn contains_short(&self, s: char) -> bool {
-        shorts!(self).any(|arg_s| arg_s == &s)
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/app/settings.rs b/third_party/rust/clap/v2/crate/src/app/settings.rs
deleted file mode 100644
index e387d9e..0000000
--- a/third_party/rust/clap/v2/crate/src/app/settings.rs
+++ /dev/null
@@ -1,1192 +0,0 @@
-// Std
-#[allow(deprecated, unused_imports)]
-use std::ascii::AsciiExt;
-use std::ops::BitOr;
-use std::str::FromStr;
-
-bitflags! {
-    struct Flags: u64 {
-        const SC_NEGATE_REQS       = 1;
-        const SC_REQUIRED          = 1 << 1;
-        const A_REQUIRED_ELSE_HELP = 1 << 2;
-        const GLOBAL_VERSION       = 1 << 3;
-        const VERSIONLESS_SC       = 1 << 4;
-        const UNIFIED_HELP         = 1 << 5;
-        const WAIT_ON_ERROR        = 1 << 6;
-        const SC_REQUIRED_ELSE_HELP= 1 << 7;
-        const NEEDS_LONG_HELP      = 1 << 8;
-        const NEEDS_LONG_VERSION   = 1 << 9;
-        const NEEDS_SC_HELP        = 1 << 10;
-        const DISABLE_VERSION      = 1 << 11;
-        const HIDDEN               = 1 << 12;
-        const TRAILING_VARARG      = 1 << 13;
-        const NO_BIN_NAME          = 1 << 14;
-        const ALLOW_UNK_SC         = 1 << 15;
-        const UTF8_STRICT          = 1 << 16;
-        const UTF8_NONE            = 1 << 17;
-        const LEADING_HYPHEN       = 1 << 18;
-        const NO_POS_VALUES        = 1 << 19;
-        const NEXT_LINE_HELP       = 1 << 20;
-        const DERIVE_DISP_ORDER    = 1 << 21;
-        const COLORED_HELP         = 1 << 22;
-        const COLOR_ALWAYS         = 1 << 23;
-        const COLOR_AUTO           = 1 << 24;
-        const COLOR_NEVER          = 1 << 25;
-        const DONT_DELIM_TRAIL     = 1 << 26;
-        const ALLOW_NEG_NUMS       = 1 << 27;
-        const LOW_INDEX_MUL_POS    = 1 << 28;
-        const DISABLE_HELP_SC      = 1 << 29;
-        const DONT_COLLAPSE_ARGS   = 1 << 30;
-        const ARGS_NEGATE_SCS      = 1 << 31;
-        const PROPAGATE_VALS_DOWN  = 1 << 32;
-        const ALLOW_MISSING_POS    = 1 << 33;
-        const TRAILING_VALUES      = 1 << 34;
-        const VALID_NEG_NUM_FOUND  = 1 << 35;
-        const PROPAGATED           = 1 << 36;
-        const VALID_ARG_FOUND      = 1 << 37;
-        const INFER_SUBCOMMANDS    = 1 << 38;
-        const CONTAINS_LAST        = 1 << 39;
-        const ARGS_OVERRIDE_SELF   = 1 << 40;
-        const DISABLE_HELP_FLAGS   = 1 << 41;
-    }
-}
-
-#[doc(hidden)]
-#[derive(Debug, Copy, Clone, PartialEq)]
-pub struct AppFlags(Flags);
-
-impl BitOr for AppFlags {
-    type Output = Self;
-    fn bitor(self, rhs: Self) -> Self {
-        AppFlags(self.0 | rhs.0)
-    }
-}
-
-impl Default for AppFlags {
-    fn default() -> Self {
-        AppFlags(
-            Flags::NEEDS_LONG_VERSION
-                | Flags::NEEDS_LONG_HELP
-                | Flags::NEEDS_SC_HELP
-                | Flags::UTF8_NONE
-                | Flags::COLOR_AUTO,
-        )
-    }
-}
-
-#[allow(deprecated)]
-impl AppFlags {
-    pub fn new() -> Self {
-        AppFlags::default()
-    }
-    pub fn zeroed() -> Self {
-        AppFlags(Flags::empty())
-    }
-
-    impl_settings! { AppSettings,
-        ArgRequiredElseHelp => Flags::A_REQUIRED_ELSE_HELP,
-        ArgsNegateSubcommands => Flags::ARGS_NEGATE_SCS,
-        AllArgsOverrideSelf => Flags::ARGS_OVERRIDE_SELF,
-        AllowExternalSubcommands => Flags::ALLOW_UNK_SC,
-        AllowInvalidUtf8 => Flags::UTF8_NONE,
-        AllowLeadingHyphen => Flags::LEADING_HYPHEN,
-        AllowNegativeNumbers => Flags::ALLOW_NEG_NUMS,
-        AllowMissingPositional => Flags::ALLOW_MISSING_POS,
-        ColoredHelp => Flags::COLORED_HELP,
-        ColorAlways => Flags::COLOR_ALWAYS,
-        ColorAuto => Flags::COLOR_AUTO,
-        ColorNever => Flags::COLOR_NEVER,
-        DontDelimitTrailingValues => Flags::DONT_DELIM_TRAIL,
-        DontCollapseArgsInUsage => Flags::DONT_COLLAPSE_ARGS,
-        DeriveDisplayOrder => Flags::DERIVE_DISP_ORDER,
-        DisableHelpFlags => Flags::DISABLE_HELP_FLAGS,
-        DisableHelpSubcommand => Flags::DISABLE_HELP_SC,
-        DisableVersion => Flags::DISABLE_VERSION,
-        GlobalVersion => Flags::GLOBAL_VERSION,
-        HidePossibleValuesInHelp => Flags::NO_POS_VALUES,
-        Hidden => Flags::HIDDEN,
-        LowIndexMultiplePositional => Flags::LOW_INDEX_MUL_POS,
-        NeedsLongHelp => Flags::NEEDS_LONG_HELP,
-        NeedsLongVersion => Flags::NEEDS_LONG_VERSION,
-        NeedsSubcommandHelp => Flags::NEEDS_SC_HELP,
-        NoBinaryName => Flags::NO_BIN_NAME,
-        PropagateGlobalValuesDown=> Flags::PROPAGATE_VALS_DOWN,
-        StrictUtf8 => Flags::UTF8_STRICT,
-        SubcommandsNegateReqs => Flags::SC_NEGATE_REQS,
-        SubcommandRequired => Flags::SC_REQUIRED,
-        SubcommandRequiredElseHelp => Flags::SC_REQUIRED_ELSE_HELP,
-        TrailingVarArg => Flags::TRAILING_VARARG,
-        UnifiedHelpMessage => Flags::UNIFIED_HELP,
-        NextLineHelp => Flags::NEXT_LINE_HELP,
-        VersionlessSubcommands => Flags::VERSIONLESS_SC,
-        WaitOnError => Flags::WAIT_ON_ERROR,
-        TrailingValues => Flags::TRAILING_VALUES,
-        ValidNegNumFound => Flags::VALID_NEG_NUM_FOUND,
-        Propagated => Flags::PROPAGATED,
-        ValidArgFound => Flags::VALID_ARG_FOUND,
-        InferSubcommands => Flags::INFER_SUBCOMMANDS,
-        ContainsLast => Flags::CONTAINS_LAST
-    }
-}
-
-/// Application level settings, which affect how [`App`] operates
-///
-/// **NOTE:** When these settings are used, they apply only to current command, and are *not*
-/// propagated down or up through child or parent subcommands
-///
-/// [`App`]: ./struct.App.html
-#[derive(Debug, PartialEq, Copy, Clone)]
-pub enum AppSettings {
-    /// Specifies that any invalid UTF-8 code points should *not* be treated as an error.
-    /// This is the default behavior of `clap`.
-    ///
-    /// **NOTE:** Using argument values with invalid UTF-8 code points requires using
-    /// [`ArgMatches::os_value_of`], [`ArgMatches::os_values_of`], [`ArgMatches::lossy_value_of`],
-    /// or [`ArgMatches::lossy_values_of`] for those particular arguments which may contain invalid
-    /// UTF-8 values
-    ///
-    /// **NOTE:** This rule only applies to  argument values, as flags, options, and
-    /// [`SubCommand`]s themselves only allow valid UTF-8 code points.
-    ///
-    /// # Platform Specific
-    ///
-    /// Non Windows systems only
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc = " ```ignore")]
-    #[cfg_attr(unix, doc = " ```")]
-    /// # use clap::{App, AppSettings};
-    /// use std::ffi::OsString;
-    /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
-    ///
-    /// let r = App::new("myprog")
-    ///   //.setting(AppSettings::AllowInvalidUtf8)
-    ///     .arg_from_usage("<arg> 'some positional arg'")
-    ///     .get_matches_from_safe(
-    ///         vec![
-    ///             OsString::from("myprog"),
-    ///             OsString::from_vec(vec![0xe9])]);
-    ///
-    /// assert!(r.is_ok());
-    /// let m = r.unwrap();
-    /// assert_eq!(m.value_of_os("arg").unwrap().as_bytes(), &[0xe9]);
-    /// ```
-    /// [`ArgMatches::os_value_of`]: ./struct.ArgMatches.html#method.os_value_of
-    /// [`ArgMatches::os_values_of`]: ./struct.ArgMatches.html#method.os_values_of
-    /// [`ArgMatches::lossy_value_of`]: ./struct.ArgMatches.html#method.lossy_value_of
-    /// [`ArgMatches::lossy_values_of`]: ./struct.ArgMatches.html#method.lossy_values_of
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    AllowInvalidUtf8,
-
-    /// Essentially sets [`Arg::overrides_with("itself")`] for all arguments.
-    ///
-    /// **WARNING:** Positional arguments cannot override themselves (or we would never be able
-    /// to advance to the next positional). This setting ignores positional arguments.
-    /// [`Arg::overrides_with("itself")`]: ./struct.Arg.html#method.overrides_with
-    AllArgsOverrideSelf,
-
-    /// Specifies that leading hyphens are allowed in argument *values*, such as negative numbers
-    /// like `-10`. (which would otherwise be parsed as another flag or option)
-    ///
-    /// **NOTE:** Use this setting with caution as it silences certain circumstances which would
-    /// otherwise be an error (such as accidentally forgetting to specify a value for leading
-    /// option). It is preferred to set this on a per argument basis, via [`Arg::allow_hyphen_values`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{Arg, App, AppSettings};
-    /// // Imagine you needed to represent negative numbers as well, such as -10
-    /// let m = App::new("nums")
-    ///     .setting(AppSettings::AllowLeadingHyphen)
-    ///     .arg(Arg::with_name("neg").index(1))
-    ///     .get_matches_from(vec![
-    ///         "nums", "-20"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("neg"), Some("-20"));
-    /// # ;
-    /// ```
-    /// [`Arg::allow_hyphen_values`]: ./struct.Arg.html#method.allow_hyphen_values
-    AllowLeadingHyphen,
-
-    /// Allows negative numbers to pass as values. This is similar to
-    /// `AllowLeadingHyphen` except that it only allows numbers, all
-    /// other undefined leading hyphens will fail to parse.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// let res = App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::AllowNegativeNumbers)
-    ///     .arg(Arg::with_name("num"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "-20"
-    ///     ]);
-    /// assert!(res.is_ok());
-    /// let m = res.unwrap();
-    /// assert_eq!(m.value_of("num").unwrap(), "-20");
-    /// ```
-    /// [`AllowLeadingHyphen`]: ./enum.AppSettings.html#variant.AllowLeadingHyphen
-    AllowNegativeNumbers,
-
-    /// Allows one to implement two styles of CLIs where positionals can be used out of order.
-    ///
-    /// The first example is a CLI where the second to last positional argument is optional, but
-    /// the final positional argument is required. Such as `$ prog [optional] <required>` where one
-    /// of the two following usages is allowed:
-    ///
-    /// * `$ prog [optional] <required>`
-    /// * `$ prog <required>`
-    ///
-    /// This would otherwise not be allowed. This is useful when `[optional]` has a default value.
-    ///
-    /// **Note:** when using this style of "missing positionals" the final positional *must* be
-    /// [required] if `--` will not be used to skip to the final positional argument.
-    ///
-    /// **Note:** This style also only allows a single positional argument to be "skipped" without
-    /// the use of `--`. To skip more than one, see the second example.
-    ///
-    /// The second example is when one wants to skip multiple optional positional arguments, and use
-    /// of the `--` operator is OK (but not required if all arguments will be specified anyways).
-    ///
-    /// For example, imagine a CLI which has three positional arguments `[foo] [bar] [baz]...` where
-    /// `baz` accepts multiple values (similar to man `ARGS...` style training arguments).
-    ///
-    /// With this setting the following invocations are possible:
-    ///
-    /// * `$ prog foo bar baz1 baz2 baz3`
-    /// * `$ prog foo -- baz1 baz2 baz3`
-    /// * `$ prog -- baz1 baz2 baz3`
-    ///
-    /// # Examples
-    ///
-    /// Style number one from above:
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// // Assume there is an external subcommand named "subcmd"
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::AllowMissingPositional)
-    ///     .arg(Arg::with_name("arg1"))
-    ///     .arg(Arg::with_name("arg2")
-    ///         .required(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "other"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("arg1"), None);
-    /// assert_eq!(m.value_of("arg2"), Some("other"));
-    /// ```
-    ///
-    /// Now the same example, but using a default value for the first optional positional argument
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// // Assume there is an external subcommand named "subcmd"
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::AllowMissingPositional)
-    ///     .arg(Arg::with_name("arg1")
-    ///         .default_value("something"))
-    ///     .arg(Arg::with_name("arg2")
-    ///         .required(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "other"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("arg1"), Some("something"));
-    /// assert_eq!(m.value_of("arg2"), Some("other"));
-    /// ```
-    /// Style number two from above:
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// // Assume there is an external subcommand named "subcmd"
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::AllowMissingPositional)
-    ///     .arg(Arg::with_name("foo"))
-    ///     .arg(Arg::with_name("bar"))
-    ///     .arg(Arg::with_name("baz").multiple(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "foo", "bar", "baz1", "baz2", "baz3"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("foo"), Some("foo"));
-    /// assert_eq!(m.value_of("bar"), Some("bar"));
-    /// assert_eq!(m.values_of("baz").unwrap().collect::<Vec<_>>(), &["baz1", "baz2", "baz3"]);
-    /// ```
-    ///
-    /// Now notice if we don't specify `foo` or `baz` but use the `--` operator.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// // Assume there is an external subcommand named "subcmd"
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::AllowMissingPositional)
-    ///     .arg(Arg::with_name("foo"))
-    ///     .arg(Arg::with_name("bar"))
-    ///     .arg(Arg::with_name("baz").multiple(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--", "baz1", "baz2", "baz3"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("foo"), None);
-    /// assert_eq!(m.value_of("bar"), None);
-    /// assert_eq!(m.values_of("baz").unwrap().collect::<Vec<_>>(), &["baz1", "baz2", "baz3"]);
-    /// ```
-    /// [required]: ./struct.Arg.html#method.required
-    AllowMissingPositional,
-
-    /// Specifies that an unexpected positional argument,
-    /// which would otherwise cause a [`ErrorKind::UnknownArgument`] error,
-    /// should instead be treated as a [`SubCommand`] within the [`ArgMatches`] struct.
-    ///
-    /// **NOTE:** Use this setting with caution,
-    /// as a truly unexpected argument (i.e. one that is *NOT* an external subcommand)
-    /// will **not** cause an error and instead be treated as a potential subcommand.
-    /// One should check for such cases manually and inform the user appropriately.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings};
-    /// // Assume there is an external subcommand named "subcmd"
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::AllowExternalSubcommands)
-    ///     .get_matches_from(vec![
-    ///         "myprog", "subcmd", "--option", "value", "-fff", "--flag"
-    ///     ]);
-    ///
-    /// // All trailing arguments will be stored under the subcommand's sub-matches using an empty
-    /// // string argument name
-    /// match m.subcommand() {
-    ///     (external, Some(ext_m)) => {
-    ///          let ext_args: Vec<&str> = ext_m.values_of("").unwrap().collect();
-    ///          assert_eq!(external, "subcmd");
-    ///          assert_eq!(ext_args, ["--option", "value", "-fff", "--flag"]);
-    ///     },
-    ///     _ => {},
-    /// }
-    /// ```
-    /// [`ErrorKind::UnknownArgument`]: ./enum.ErrorKind.html#variant.UnknownArgument
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`ArgMatches`]: ./struct.ArgMatches.html
-    AllowExternalSubcommands,
-
-    /// Specifies that use of a valid [argument] negates [subcommands] being used after. By default
-    /// `clap` allows arguments between subcommands such as
-    /// `<cmd> [cmd_args] <cmd2> [cmd2_args] <cmd3> [cmd3_args]`. This setting disables that
-    /// functionality and says that arguments can only follow the *final* subcommand. For instance
-    /// using this setting makes only the following invocations possible:
-    ///
-    /// * `<cmd> <cmd2> <cmd3> [cmd3_args]`
-    /// * `<cmd> <cmd2> [cmd2_args]`
-    /// * `<cmd> [cmd_args]`
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ArgsNegateSubcommands)
-    /// # ;
-    /// ```
-    /// [subcommands]: ./struct.SubCommand.html
-    /// [argument]: ./struct.Arg.html
-    ArgsNegateSubcommands,
-
-    /// Specifies that the help text should be displayed (and then exit gracefully),
-    /// if no arguments are present at runtime (i.e. an empty run such as, `$ myprog`.
-    ///
-    /// **NOTE:** [`SubCommand`]s count as arguments
-    ///
-    /// **NOTE:** Setting [`Arg::default_value`] effectively disables this option as it will
-    /// ensure that some argument is always present.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ArgRequiredElseHelp)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
-    ArgRequiredElseHelp,
-
-    /// Uses colorized help messages.
-    ///
-    /// **NOTE:** Must be compiled with the `color` cargo feature
-    ///
-    /// # Platform Specific
-    ///
-    /// This setting only applies to Unix, Linux, and macOS (i.e. non-Windows platforms)
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ColoredHelp)
-    ///     .get_matches();
-    /// ```
-    ColoredHelp,
-
-    /// Enables colored output only when the output is going to a terminal or TTY.
-    ///
-    /// **NOTE:** This is the default behavior of `clap`.
-    ///
-    /// **NOTE:** Must be compiled with the `color` cargo feature.
-    ///
-    /// # Platform Specific
-    ///
-    /// This setting only applies to Unix, Linux, and macOS (i.e. non-Windows platforms).
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ColorAuto)
-    ///     .get_matches();
-    /// ```
-    ColorAuto,
-
-    /// Enables colored output regardless of whether or not the output is going to a terminal/TTY.
-    ///
-    /// **NOTE:** Must be compiled with the `color` cargo feature.
-    ///
-    /// # Platform Specific
-    ///
-    /// This setting only applies to Unix, Linux, and macOS (i.e. non-Windows platforms).
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ColorAlways)
-    ///     .get_matches();
-    /// ```
-    ColorAlways,
-
-    /// Disables colored output no matter if the output is going to a terminal/TTY, or not.
-    ///
-    /// **NOTE:** Must be compiled with the `color` cargo feature
-    ///
-    /// # Platform Specific
-    ///
-    /// This setting only applies to Unix, Linux, and macOS (i.e. non-Windows platforms)
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::ColorNever)
-    ///     .get_matches();
-    /// ```
-    ColorNever,
-
-    /// Disables the automatic collapsing of positional args into `[ARGS]` inside the usage string
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::DontCollapseArgsInUsage)
-    ///     .get_matches();
-    /// ```
-    DontCollapseArgsInUsage,
-
-    /// Disables the automatic delimiting of values when `--` or [`AppSettings::TrailingVarArg`]
-    /// was used.
-    ///
-    /// **NOTE:** The same thing can be done manually by setting the final positional argument to
-    /// [`Arg::use_delimiter(false)`]. Using this setting is safer, because it's easier to locate
-    /// when making changes.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::DontDelimitTrailingValues)
-    ///     .get_matches();
-    /// ```
-    /// [`AppSettings::TrailingVarArg`]: ./enum.AppSettings.html#variant.TrailingVarArg
-    /// [`Arg::use_delimiter(false)`]: ./struct.Arg.html#method.use_delimiter
-    DontDelimitTrailingValues,
-
-    /// Disables `-h` and `--help` [`App`] without affecting any of the [`SubCommand`]s
-    /// (Defaults to `false`; application *does* have help flags)
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings, ErrorKind};
-    /// let res = App::new("myprog")
-    ///     .setting(AppSettings::DisableHelpFlags)
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "-h"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, SubCommand, AppSettings, ErrorKind};
-    /// let res = App::new("myprog")
-    ///     .setting(AppSettings::DisableHelpFlags)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "test", "-h"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::HelpDisplayed);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`App`]: ./struct.App.html
-    DisableHelpFlags,
-
-    /// Disables the `help` subcommand
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings, ErrorKind, SubCommand};
-    /// let res = App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::DisableHelpSubcommand)
-    ///     // Normally, creating a subcommand causes a `help` subcommand to automatically
-    ///     // be generated as well
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "help"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    DisableHelpSubcommand,
-
-    /// Disables `-V` and `--version` [`App`] without affecting any of the [`SubCommand`]s
-    /// (Defaults to `false`; application *does* have a version flag)
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings, ErrorKind};
-    /// let res = App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::DisableVersion)
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "-V"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, SubCommand, AppSettings, ErrorKind};
-    /// let res = App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::DisableVersion)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "test", "-V"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::VersionDisplayed);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`App`]: ./struct.App.html
-    DisableVersion,
-
-    /// Displays the arguments and [`SubCommand`]s in the help message in the order that they were
-    /// declared in, and not alphabetically which is the default.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::DeriveDisplayOrder)
-    ///     .get_matches();
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    DeriveDisplayOrder,
-
-    /// Specifies to use the version of the current command for all child [`SubCommand`]s.
-    /// (Defaults to `false`; subcommands have independent version strings from their parents.)
-    ///
-    /// **NOTE:** The version for the current command **and** this setting must be set **prior** to
-    /// adding any child subcommands
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::GlobalVersion)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches();
-    /// // running `$ myprog test --version` will display
-    /// // "myprog-test v1.1"
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    GlobalVersion,
-
-    /// Specifies that this [`SubCommand`] should be hidden from help messages
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, SubCommand};
-    /// App::new("myprog")
-    ///     .subcommand(SubCommand::with_name("test")
-    ///     .setting(AppSettings::Hidden))
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    Hidden,
-
-    /// Tells `clap` *not* to print possible values when displaying help information.
-    /// This can be useful if there are many values, or they are explained elsewhere.
-    HidePossibleValuesInHelp,
-
-    /// Tries to match unknown args to partial [`subcommands`] or their [aliases]. For example to
-    /// match a subcommand named `test`, one could use `t`, `te`, `tes`, and `test`.
-    ///
-    /// **NOTE:** The match *must not* be ambiguous at all in order to succeed. i.e. to match `te`
-    /// to `test` there could not also be a subcommand or alias `temp` because both start with `te`
-    ///
-    /// **CAUTION:** This setting can interfere with [positional/free arguments], take care when
-    /// designing CLIs which allow inferred subcommands and have potential positional/free
-    /// arguments whose values could start with the same characters as subcommands. If this is the
-    /// case, it's recommended to use settings such as [`AppSeettings::ArgsNegateSubcommands`] in
-    /// conjunction with this setting.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// let m = App::new("prog")
-    ///     .setting(AppSettings::InferSubcommands)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "te"
-    ///     ]);
-    /// assert_eq!(m.subcommand_name(), Some("test"));
-    /// ```
-    /// [`subcommands`]: ./struct.SubCommand.html
-    /// [positional/free arguments]: ./struct.Arg.html#method.index
-    /// [aliases]: ./struct.App.html#method.alias
-    /// [`AppSeettings::ArgsNegateSubcommands`]: ./enum.AppSettings.html#variant.ArgsNegateSubcommands
-    InferSubcommands,
-
-    /// Specifies that the parser should not assume the first argument passed is the binary name.
-    /// This is normally the case when using a "daemon" style mode, or an interactive CLI where one
-    /// one would not normally type the binary or program name for each command.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::NoBinaryName)
-    ///     .arg(Arg::from_usage("<cmd>... 'commands to run'"))
-    ///     .get_matches_from(vec!["command", "set"]);
-    ///
-    /// let cmds: Vec<&str> = m.values_of("cmd").unwrap().collect();
-    /// assert_eq!(cmds, ["command", "set"]);
-    /// ```
-    NoBinaryName,
-
-    /// Places the help string for all arguments on the line after the argument.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::NextLineHelp)
-    ///     .get_matches();
-    /// ```
-    NextLineHelp,
-
-    /// **DEPRECATED**: This setting is no longer required in order to propagate values up or down
-    ///
-    /// Specifies that the parser should propagate global arg's values down or up through any *used*
-    /// child subcommands. Meaning, if a subcommand wasn't used, the values won't be propagated to
-    /// said subcommand.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, SubCommand};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::from_usage("[cmd] 'command to run'")
-    ///         .global(true))
-    ///     .subcommand(SubCommand::with_name("foo"))
-    ///     .get_matches_from(vec!["myprog", "set", "foo"]);
-    ///
-    /// assert_eq!(m.value_of("cmd"), Some("set"));
-    ///
-    /// let sub_m = m.subcommand_matches("foo").unwrap();
-    /// assert_eq!(sub_m.value_of("cmd"), Some("set"));
-    /// ```
-    /// Now doing the same thing, but *not* using any subcommands will result in the value not being
-    /// propagated down.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, SubCommand};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::from_usage("[cmd] 'command to run'")
-    ///         .global(true))
-    ///     .subcommand(SubCommand::with_name("foo"))
-    ///     .get_matches_from(vec!["myprog", "set"]);
-    ///
-    /// assert_eq!(m.value_of("cmd"), Some("set"));
-    ///
-    /// assert!(m.subcommand_matches("foo").is_none());
-    /// ```
-    #[deprecated(since = "2.27.0", note = "No longer required to propagate values")]
-    PropagateGlobalValuesDown,
-
-    /// Allows [`SubCommand`]s to override all requirements of the parent command.
-    /// For example if you had a subcommand or top level application with a required argument
-    /// that is only required as long as there is no subcommand present,
-    /// using this setting would allow you to set those arguments to [`Arg::required(true)`]
-    /// and yet receive no error so long as the user uses a valid subcommand instead.
-    ///
-    /// **NOTE:** This defaults to false (using subcommand does *not* negate requirements)
-    ///
-    /// # Examples
-    ///
-    /// This first example shows that it is an error to not use a required argument
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, SubCommand, ErrorKind};
-    /// let err = App::new("myprog")
-    ///     .setting(AppSettings::SubcommandsNegateReqs)
-    ///     .arg(Arg::with_name("opt").required(true))
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog"
-    ///     ]);
-    /// assert!(err.is_err());
-    /// assert_eq!(err.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// # ;
-    /// ```
-    ///
-    /// This next example shows that it is no longer error to not use a required argument if a
-    /// valid subcommand is used.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, SubCommand, ErrorKind};
-    /// let noerr = App::new("myprog")
-    ///     .setting(AppSettings::SubcommandsNegateReqs)
-    ///     .arg(Arg::with_name("opt").required(true))
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "test"
-    ///     ]);
-    /// assert!(noerr.is_ok());
-    /// # ;
-    /// ```
-    /// [`Arg::required(true)`]: ./struct.Arg.html#method.required
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    SubcommandsNegateReqs,
-
-    /// Specifies that the help text should be displayed (before exiting gracefully) if no
-    /// [`SubCommand`]s are present at runtime (i.e. an empty run such as `$ myprog`).
-    ///
-    /// **NOTE:** This should *not* be used with [`AppSettings::SubcommandRequired`] as they do
-    /// nearly same thing; this prints the help text, and the other prints an error.
-    ///
-    /// **NOTE:** If the user specifies arguments at runtime, but no subcommand the help text will
-    /// still be displayed and exit. If this is *not* the desired result, consider using
-    /// [`AppSettings::ArgRequiredElseHelp`] instead.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::SubcommandRequiredElseHelp)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings::SubcommandRequired`]: ./enum.AppSettings.html#variant.SubcommandRequired
-    /// [`AppSettings::ArgRequiredElseHelp`]: ./enum.AppSettings.html#variant.ArgRequiredElseHelp
-    SubcommandRequiredElseHelp,
-
-    /// Specifies that any invalid UTF-8 code points should be treated as an error and fail
-    /// with a [`ErrorKind::InvalidUtf8`] error.
-    ///
-    /// **NOTE:** This rule only applies to argument values; Things such as flags, options, and
-    /// [`SubCommand`]s themselves only allow valid UTF-8 code points.
-    ///
-    /// # Platform Specific
-    ///
-    /// Non Windows systems only
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc = " ```ignore")]
-    #[cfg_attr(unix, doc = " ```")]
-    /// # use clap::{App, AppSettings, ErrorKind};
-    /// use std::ffi::OsString;
-    /// use std::os::unix::ffi::OsStringExt;
-    ///
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::StrictUtf8)
-    ///     .arg_from_usage("<arg> 'some positional arg'")
-    ///     .get_matches_from_safe(
-    ///         vec![
-    ///             OsString::from("myprog"),
-    ///             OsString::from_vec(vec![0xe9])]);
-    ///
-    /// assert!(m.is_err());
-    /// assert_eq!(m.unwrap_err().kind, ErrorKind::InvalidUtf8);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`ErrorKind::InvalidUtf8`]: ./enum.ErrorKind.html#variant.InvalidUtf8
-    StrictUtf8,
-
-    /// Allows specifying that if no [`SubCommand`] is present at runtime,
-    /// error and exit gracefully.
-    ///
-    /// **NOTE:** This defaults to `false` (subcommands do *not* need to be present)
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings, SubCommand, ErrorKind};
-    /// let err = App::new("myprog")
-    ///     .setting(AppSettings::SubcommandRequired)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog",
-    ///     ]);
-    /// assert!(err.is_err());
-    /// assert_eq!(err.unwrap_err().kind, ErrorKind::MissingSubcommand);
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    SubcommandRequired,
-
-    /// Specifies that the final positional argument is a "VarArg" and that `clap` should not
-    /// attempt to parse any further args.
-    ///
-    /// The values of the trailing positional argument will contain all args from itself on.
-    ///
-    /// **NOTE:** The final positional argument **must** have [`Arg::multiple(true)`] or the usage
-    /// string equivalent.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// let m = App::new("myprog")
-    ///     .setting(AppSettings::TrailingVarArg)
-    ///     .arg(Arg::from_usage("<cmd>... 'commands to run'"))
-    ///     .get_matches_from(vec!["myprog", "arg1", "-r", "val1"]);
-    ///
-    /// let trail: Vec<&str> = m.values_of("cmd").unwrap().collect();
-    /// assert_eq!(trail, ["arg1", "-r", "val1"]);
-    /// ```
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    TrailingVarArg,
-
-    /// Groups flags and options together, presenting a more unified help message
-    /// (a la `getopts` or `docopt` style).
-    ///
-    /// The default is that the auto-generated help message will group flags, and options
-    /// separately.
-    ///
-    /// **NOTE:** This setting is cosmetic only and does not affect any functionality.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::UnifiedHelpMessage)
-    ///     .get_matches();
-    /// // running `myprog --help` will display a unified "docopt" or "getopts" style help message
-    /// ```
-    UnifiedHelpMessage,
-
-    /// Disables `-V` and `--version` for all [`SubCommand`]s
-    /// (Defaults to `false`; subcommands *do* have version flags.)
-    ///
-    /// **NOTE:** This setting must be set **prior** to adding any subcommands.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, SubCommand, AppSettings, ErrorKind};
-    /// let res = App::new("myprog")
-    ///     .version("v1.1")
-    ///     .setting(AppSettings::VersionlessSubcommands)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog", "test", "-V"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    VersionlessSubcommands,
-
-    /// Will display a message "Press \[ENTER\]/\[RETURN\] to continue..." and wait for user before
-    /// exiting
-    ///
-    /// This is most useful when writing an application which is run from a GUI shortcut, or on
-    /// Windows where a user tries to open the binary by double-clicking instead of using the
-    /// command line.
-    ///
-    /// **NOTE:** This setting is **not** recursive with [`SubCommand`]s, meaning if you wish this
-    /// behavior for all subcommands, you must set this on each command (needing this is extremely
-    /// rare)
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings};
-    /// App::new("myprog")
-    ///     .setting(AppSettings::WaitOnError)
-    /// # ;
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    WaitOnError,
-
-    #[doc(hidden)]
-    NeedsLongVersion,
-
-    #[doc(hidden)]
-    NeedsLongHelp,
-
-    #[doc(hidden)]
-    NeedsSubcommandHelp,
-
-    #[doc(hidden)]
-    LowIndexMultiplePositional,
-
-    #[doc(hidden)]
-    TrailingValues,
-
-    #[doc(hidden)]
-    ValidNegNumFound,
-
-    #[doc(hidden)]
-    Propagated,
-
-    #[doc(hidden)]
-    ValidArgFound,
-
-    #[doc(hidden)]
-    ContainsLast,
-}
-
-impl FromStr for AppSettings {
-    type Err = String;
-    fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
-        match &*s.to_ascii_lowercase() {
-            "disablehelpflags" => Ok(AppSettings::DisableHelpFlags),
-            "argrequiredelsehelp" => Ok(AppSettings::ArgRequiredElseHelp),
-            "argsnegatesubcommands" => Ok(AppSettings::ArgsNegateSubcommands),
-            "allowinvalidutf8" => Ok(AppSettings::AllowInvalidUtf8),
-            "allowleadinghyphen" => Ok(AppSettings::AllowLeadingHyphen),
-            "allowexternalsubcommands" => Ok(AppSettings::AllowExternalSubcommands),
-            "allownegativenumbers" => Ok(AppSettings::AllowNegativeNumbers),
-            "colorauto" => Ok(AppSettings::ColorAuto),
-            "coloralways" => Ok(AppSettings::ColorAlways),
-            "colornever" => Ok(AppSettings::ColorNever),
-            "coloredhelp" => Ok(AppSettings::ColoredHelp),
-            "derivedisplayorder" => Ok(AppSettings::DeriveDisplayOrder),
-            "dontcollapseargsinusage" => Ok(AppSettings::DontCollapseArgsInUsage),
-            "dontdelimittrailingvalues" => Ok(AppSettings::DontDelimitTrailingValues),
-            "disablehelpsubcommand" => Ok(AppSettings::DisableHelpSubcommand),
-            "disableversion" => Ok(AppSettings::DisableVersion),
-            "globalversion" => Ok(AppSettings::GlobalVersion),
-            "hidden" => Ok(AppSettings::Hidden),
-            "hidepossiblevaluesinhelp" => Ok(AppSettings::HidePossibleValuesInHelp),
-            "infersubcommands" => Ok(AppSettings::InferSubcommands),
-            "lowindexmultiplepositional" => Ok(AppSettings::LowIndexMultiplePositional),
-            "nobinaryname" => Ok(AppSettings::NoBinaryName),
-            "nextlinehelp" => Ok(AppSettings::NextLineHelp),
-            "strictutf8" => Ok(AppSettings::StrictUtf8),
-            "subcommandsnegatereqs" => Ok(AppSettings::SubcommandsNegateReqs),
-            "subcommandrequired" => Ok(AppSettings::SubcommandRequired),
-            "subcommandrequiredelsehelp" => Ok(AppSettings::SubcommandRequiredElseHelp),
-            "trailingvararg" => Ok(AppSettings::TrailingVarArg),
-            "unifiedhelpmessage" => Ok(AppSettings::UnifiedHelpMessage),
-            "versionlesssubcommands" => Ok(AppSettings::VersionlessSubcommands),
-            "waitonerror" => Ok(AppSettings::WaitOnError),
-            "validnegnumfound" => Ok(AppSettings::ValidNegNumFound),
-            "validargfound" => Ok(AppSettings::ValidArgFound),
-            "propagated" => Ok(AppSettings::Propagated),
-            "trailingvalues" => Ok(AppSettings::TrailingValues),
-            _ => Err("unknown AppSetting, cannot convert from str".to_owned()),
-        }
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::AppSettings;
-
-    #[test]
-    fn app_settings_fromstr() {
-        assert_eq!(
-            "disablehelpflags".parse::<AppSettings>().unwrap(),
-            AppSettings::DisableHelpFlags
-        );
-        assert_eq!(
-            "argsnegatesubcommands".parse::<AppSettings>().unwrap(),
-            AppSettings::ArgsNegateSubcommands
-        );
-        assert_eq!(
-            "argrequiredelsehelp".parse::<AppSettings>().unwrap(),
-            AppSettings::ArgRequiredElseHelp
-        );
-        assert_eq!(
-            "allowexternalsubcommands".parse::<AppSettings>().unwrap(),
-            AppSettings::AllowExternalSubcommands
-        );
-        assert_eq!(
-            "allowinvalidutf8".parse::<AppSettings>().unwrap(),
-            AppSettings::AllowInvalidUtf8
-        );
-        assert_eq!(
-            "allowleadinghyphen".parse::<AppSettings>().unwrap(),
-            AppSettings::AllowLeadingHyphen
-        );
-        assert_eq!(
-            "allownegativenumbers".parse::<AppSettings>().unwrap(),
-            AppSettings::AllowNegativeNumbers
-        );
-        assert_eq!(
-            "coloredhelp".parse::<AppSettings>().unwrap(),
-            AppSettings::ColoredHelp
-        );
-        assert_eq!(
-            "colorauto".parse::<AppSettings>().unwrap(),
-            AppSettings::ColorAuto
-        );
-        assert_eq!(
-            "coloralways".parse::<AppSettings>().unwrap(),
-            AppSettings::ColorAlways
-        );
-        assert_eq!(
-            "colornever".parse::<AppSettings>().unwrap(),
-            AppSettings::ColorNever
-        );
-        assert_eq!(
-            "disablehelpsubcommand".parse::<AppSettings>().unwrap(),
-            AppSettings::DisableHelpSubcommand
-        );
-        assert_eq!(
-            "disableversion".parse::<AppSettings>().unwrap(),
-            AppSettings::DisableVersion
-        );
-        assert_eq!(
-            "dontcollapseargsinusage".parse::<AppSettings>().unwrap(),
-            AppSettings::DontCollapseArgsInUsage
-        );
-        assert_eq!(
-            "dontdelimittrailingvalues".parse::<AppSettings>().unwrap(),
-            AppSettings::DontDelimitTrailingValues
-        );
-        assert_eq!(
-            "derivedisplayorder".parse::<AppSettings>().unwrap(),
-            AppSettings::DeriveDisplayOrder
-        );
-        assert_eq!(
-            "globalversion".parse::<AppSettings>().unwrap(),
-            AppSettings::GlobalVersion
-        );
-        assert_eq!(
-            "hidden".parse::<AppSettings>().unwrap(),
-            AppSettings::Hidden
-        );
-        assert_eq!(
-            "hidepossiblevaluesinhelp".parse::<AppSettings>().unwrap(),
-            AppSettings::HidePossibleValuesInHelp
-        );
-        assert_eq!(
-            "lowindexmultiplePositional".parse::<AppSettings>().unwrap(),
-            AppSettings::LowIndexMultiplePositional
-        );
-        assert_eq!(
-            "nobinaryname".parse::<AppSettings>().unwrap(),
-            AppSettings::NoBinaryName
-        );
-        assert_eq!(
-            "nextlinehelp".parse::<AppSettings>().unwrap(),
-            AppSettings::NextLineHelp
-        );
-        assert_eq!(
-            "subcommandsnegatereqs".parse::<AppSettings>().unwrap(),
-            AppSettings::SubcommandsNegateReqs
-        );
-        assert_eq!(
-            "subcommandrequired".parse::<AppSettings>().unwrap(),
-            AppSettings::SubcommandRequired
-        );
-        assert_eq!(
-            "subcommandrequiredelsehelp".parse::<AppSettings>().unwrap(),
-            AppSettings::SubcommandRequiredElseHelp
-        );
-        assert_eq!(
-            "strictutf8".parse::<AppSettings>().unwrap(),
-            AppSettings::StrictUtf8
-        );
-        assert_eq!(
-            "trailingvararg".parse::<AppSettings>().unwrap(),
-            AppSettings::TrailingVarArg
-        );
-        assert_eq!(
-            "unifiedhelpmessage".parse::<AppSettings>().unwrap(),
-            AppSettings::UnifiedHelpMessage
-        );
-        assert_eq!(
-            "versionlesssubcommands".parse::<AppSettings>().unwrap(),
-            AppSettings::VersionlessSubcommands
-        );
-        assert_eq!(
-            "waitonerror".parse::<AppSettings>().unwrap(),
-            AppSettings::WaitOnError
-        );
-        assert_eq!(
-            "validnegnumfound".parse::<AppSettings>().unwrap(),
-            AppSettings::ValidNegNumFound
-        );
-        assert_eq!(
-            "validargfound".parse::<AppSettings>().unwrap(),
-            AppSettings::ValidArgFound
-        );
-        assert_eq!(
-            "propagated".parse::<AppSettings>().unwrap(),
-            AppSettings::Propagated
-        );
-        assert_eq!(
-            "trailingvalues".parse::<AppSettings>().unwrap(),
-            AppSettings::TrailingValues
-        );
-        assert_eq!(
-            "infersubcommands".parse::<AppSettings>().unwrap(),
-            AppSettings::InferSubcommands
-        );
-        assert!("hahahaha".parse::<AppSettings>().is_err());
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/app/usage.rs b/third_party/rust/clap/v2/crate/src/app/usage.rs
deleted file mode 100644
index e8105c6..0000000
--- a/third_party/rust/clap/v2/crate/src/app/usage.rs
+++ /dev/null
@@ -1,495 +0,0 @@
-// std
-use std::collections::{BTreeMap, VecDeque};
-
-// Internal
-use app::parser::Parser;
-use app::settings::AppSettings as AS;
-use args::settings::ArgSettings;
-use args::{AnyArg, ArgMatcher, PosBuilder};
-use INTERNAL_ERROR_MSG;
-
-// Creates a usage string for display. This happens just after all arguments were parsed, but before
-// any subcommands have been parsed (so as to give subcommands their own usage recursively)
-pub fn create_usage_with_title(p: &Parser, used: &[&str]) -> String {
-    debugln!("usage::create_usage_with_title;");
-    let mut usage = String::with_capacity(75);
-    usage.push_str("USAGE:\n    ");
-    usage.push_str(&*create_usage_no_title(p, used));
-    usage
-}
-
-// Creates a usage string to be used in error message (i.e. one with currently used args)
-pub fn create_error_usage<'a, 'b>(
-    p: &Parser<'a, 'b>,
-    matcher: &'b ArgMatcher<'a>,
-    extra: Option<&str>,
-) -> String {
-    let mut args: Vec<_> = matcher
-        .arg_names()
-        .iter()
-        .filter(|n| {
-            if let Some(o) = find_by_name!(p, **n, opts, iter) {
-                !o.b.is_set(ArgSettings::Required) && !o.b.is_set(ArgSettings::Hidden)
-            } else if let Some(p) = find_by_name!(p, **n, positionals, values) {
-                !p.b.is_set(ArgSettings::Required) && p.b.is_set(ArgSettings::Hidden)
-            } else {
-                true // flags can't be required, so they're always true
-            }
-        })
-        .map(|&n| n)
-        .collect();
-    if let Some(r) = extra {
-        args.push(r);
-    }
-    create_usage_with_title(p, &*args)
-}
-
-// Creates a usage string (*without title*) if one was not provided by the user manually.
-pub fn create_usage_no_title(p: &Parser, used: &[&str]) -> String {
-    debugln!("usage::create_usage_no_title;");
-    if let Some(u) = p.meta.usage_str {
-        String::from(&*u)
-    } else if used.is_empty() {
-        create_help_usage(p, true)
-    } else {
-        create_smart_usage(p, used)
-    }
-}
-
-// Creates a usage string for display in help messages (i.e. not for errors)
-pub fn create_help_usage(p: &Parser, incl_reqs: bool) -> String {
-    let mut usage = String::with_capacity(75);
-    let name = p
-        .meta
-        .usage
-        .as_ref()
-        .unwrap_or_else(|| p.meta.bin_name.as_ref().unwrap_or(&p.meta.name));
-    usage.push_str(&*name);
-    let req_string = if incl_reqs {
-        let mut reqs: Vec<&str> = p.required().map(|r| &**r).collect();
-        reqs.sort();
-        reqs.dedup();
-        get_required_usage_from(p, &reqs, None, None, false)
-            .iter()
-            .fold(String::new(), |a, s| a + &format!(" {}", s)[..])
-    } else {
-        String::new()
-    };
-
-    let flags = needs_flags_tag(p);
-    if flags && !p.is_set(AS::UnifiedHelpMessage) {
-        usage.push_str(" [FLAGS]");
-    } else if flags {
-        usage.push_str(" [OPTIONS]");
-    }
-    if !p.is_set(AS::UnifiedHelpMessage)
-        && p.opts
-            .iter()
-            .any(|o| !o.is_set(ArgSettings::Required) && !o.is_set(ArgSettings::Hidden))
-    {
-        usage.push_str(" [OPTIONS]");
-    }
-
-    usage.push_str(&req_string[..]);
-
-    let has_last = p.positionals.values().any(|p| p.is_set(ArgSettings::Last));
-    // places a '--' in the usage string if there are args and options
-    // supporting multiple values
-    if p.opts.iter().any(|o| o.is_set(ArgSettings::Multiple))
-        && p.positionals
-            .values()
-            .any(|p| !p.is_set(ArgSettings::Required))
-        && !(p.has_visible_subcommands() || p.is_set(AS::AllowExternalSubcommands))
-        && !has_last
-    {
-        usage.push_str(" [--]");
-    }
-    let not_req_or_hidden = |p: &PosBuilder| {
-        (!p.is_set(ArgSettings::Required) || p.is_set(ArgSettings::Last))
-            && !p.is_set(ArgSettings::Hidden)
-    };
-    if p.has_positionals() && p.positionals.values().any(not_req_or_hidden) {
-        if let Some(args_tag) = get_args_tag(p, incl_reqs) {
-            usage.push_str(&*args_tag);
-        } else {
-            usage.push_str(" [ARGS]");
-        }
-        if has_last && incl_reqs {
-            let pos = p
-                .positionals
-                .values()
-                .find(|p| p.b.is_set(ArgSettings::Last))
-                .expect(INTERNAL_ERROR_MSG);
-            debugln!("usage::create_help_usage: '{}' has .last(true)", pos.name());
-            let req = pos.is_set(ArgSettings::Required);
-            if req
-                && p.positionals
-                    .values()
-                    .any(|p| !p.is_set(ArgSettings::Required))
-            {
-                usage.push_str(" -- <");
-            } else if req {
-                usage.push_str(" [--] <");
-            } else {
-                usage.push_str(" [-- <");
-            }
-            usage.push_str(&*pos.name_no_brackets());
-            usage.push_str(">");
-            usage.push_str(pos.multiple_str());
-            if !req {
-                usage.push_str("]");
-            }
-        }
-    }
-
-    // incl_reqs is only false when this function is called recursively
-    if p.has_visible_subcommands() && incl_reqs || p.is_set(AS::AllowExternalSubcommands) {
-        if p.is_set(AS::SubcommandsNegateReqs) || p.is_set(AS::ArgsNegateSubcommands) {
-            if !p.is_set(AS::ArgsNegateSubcommands) {
-                usage.push_str("\n    ");
-                usage.push_str(&*create_help_usage(p, false));
-                usage.push_str(" <SUBCOMMAND>");
-            } else {
-                usage.push_str("\n    ");
-                usage.push_str(&*name);
-                usage.push_str(" <SUBCOMMAND>");
-            }
-        } else if p.is_set(AS::SubcommandRequired) || p.is_set(AS::SubcommandRequiredElseHelp) {
-            usage.push_str(" <SUBCOMMAND>");
-        } else {
-            usage.push_str(" [SUBCOMMAND]");
-        }
-    }
-    usage.shrink_to_fit();
-    debugln!("usage::create_help_usage: usage={}", usage);
-    usage
-}
-
-// Creates a context aware usage string, or "smart usage" from currently used
-// args, and requirements
-fn create_smart_usage(p: &Parser, used: &[&str]) -> String {
-    debugln!("usage::smart_usage;");
-    let mut usage = String::with_capacity(75);
-    let mut hs: Vec<&str> = p.required().map(|s| &**s).collect();
-    hs.extend_from_slice(used);
-
-    let r_string = get_required_usage_from(p, &hs, None, None, false)
-        .iter()
-        .fold(String::new(), |acc, s| acc + &format!(" {}", s)[..]);
-
-    usage.push_str(
-        &p.meta
-            .usage
-            .as_ref()
-            .unwrap_or_else(|| p.meta.bin_name.as_ref().unwrap_or(&p.meta.name))[..],
-    );
-    usage.push_str(&*r_string);
-    if p.is_set(AS::SubcommandRequired) {
-        usage.push_str(" <SUBCOMMAND>");
-    }
-    usage.shrink_to_fit();
-    usage
-}
-
-// Gets the `[ARGS]` tag for the usage string
-fn get_args_tag(p: &Parser, incl_reqs: bool) -> Option<String> {
-    debugln!("usage::get_args_tag;");
-    let mut count = 0;
-    'outer: for pos in p
-        .positionals
-        .values()
-        .filter(|pos| !pos.is_set(ArgSettings::Required))
-        .filter(|pos| !pos.is_set(ArgSettings::Hidden))
-        .filter(|pos| !pos.is_set(ArgSettings::Last))
-    {
-        debugln!("usage::get_args_tag:iter:{}:", pos.b.name);
-        if let Some(g_vec) = p.groups_for_arg(pos.b.name) {
-            for grp_s in &g_vec {
-                debugln!("usage::get_args_tag:iter:{}:iter:{};", pos.b.name, grp_s);
-                // if it's part of a required group we don't want to count it
-                if p.groups.iter().any(|g| g.required && (&g.name == grp_s)) {
-                    continue 'outer;
-                }
-            }
-        }
-        count += 1;
-        debugln!(
-            "usage::get_args_tag:iter: {} Args not required or hidden",
-            count
-        );
-    }
-    if !p.is_set(AS::DontCollapseArgsInUsage) && count > 1 {
-        debugln!("usage::get_args_tag:iter: More than one, returning [ARGS]");
-        return None; // [ARGS]
-    } else if count == 1 && incl_reqs {
-        let pos = p
-            .positionals
-            .values()
-            .find(|pos| {
-                !pos.is_set(ArgSettings::Required)
-                    && !pos.is_set(ArgSettings::Hidden)
-                    && !pos.is_set(ArgSettings::Last)
-            })
-            .expect(INTERNAL_ERROR_MSG);
-        debugln!(
-            "usage::get_args_tag:iter: Exactly one, returning '{}'",
-            pos.name()
-        );
-        return Some(format!(
-            " [{}]{}",
-            pos.name_no_brackets(),
-            pos.multiple_str()
-        ));
-    } else if p.is_set(AS::DontCollapseArgsInUsage) && !p.positionals.is_empty() && incl_reqs {
-        debugln!("usage::get_args_tag:iter: Don't collapse returning all");
-        return Some(
-            p.positionals
-                .values()
-                .filter(|pos| !pos.is_set(ArgSettings::Required))
-                .filter(|pos| !pos.is_set(ArgSettings::Hidden))
-                .filter(|pos| !pos.is_set(ArgSettings::Last))
-                .map(|pos| format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str()))
-                .collect::<Vec<_>>()
-                .join(""),
-        );
-    } else if !incl_reqs {
-        debugln!("usage::get_args_tag:iter: incl_reqs=false, building secondary usage string");
-        let highest_req_pos = p
-            .positionals
-            .iter()
-            .filter_map(|(idx, pos)| {
-                if pos.b.is_set(ArgSettings::Required) && !pos.b.is_set(ArgSettings::Last) {
-                    Some(idx)
-                } else {
-                    None
-                }
-            })
-            .max()
-            .unwrap_or_else(|| p.positionals.len());
-        return Some(
-            p.positionals
-                .iter()
-                .filter_map(|(idx, pos)| {
-                    if idx <= highest_req_pos {
-                        Some(pos)
-                    } else {
-                        None
-                    }
-                })
-                .filter(|pos| !pos.is_set(ArgSettings::Required))
-                .filter(|pos| !pos.is_set(ArgSettings::Hidden))
-                .filter(|pos| !pos.is_set(ArgSettings::Last))
-                .map(|pos| format!(" [{}]{}", pos.name_no_brackets(), pos.multiple_str()))
-                .collect::<Vec<_>>()
-                .join(""),
-        );
-    }
-    Some("".into())
-}
-
-// Determines if we need the `[FLAGS]` tag in the usage string
-fn needs_flags_tag(p: &Parser) -> bool {
-    debugln!("usage::needs_flags_tag;");
-    'outer: for f in &p.flags {
-        debugln!("usage::needs_flags_tag:iter: f={};", f.b.name);
-        if let Some(l) = f.s.long {
-            if l == "help" || l == "version" {
-                // Don't print `[FLAGS]` just for help or version
-                continue;
-            }
-        }
-        if let Some(g_vec) = p.groups_for_arg(f.b.name) {
-            for grp_s in &g_vec {
-                debugln!("usage::needs_flags_tag:iter:iter: grp_s={};", grp_s);
-                if p.groups.iter().any(|g| &g.name == grp_s && g.required) {
-                    debugln!("usage::needs_flags_tag:iter:iter: Group is required");
-                    continue 'outer;
-                }
-            }
-        }
-        if f.is_set(ArgSettings::Hidden) {
-            continue;
-        }
-        debugln!("usage::needs_flags_tag:iter: [FLAGS] required");
-        return true;
-    }
-
-    debugln!("usage::needs_flags_tag: [FLAGS] not required");
-    false
-}
-
-// Returns the required args in usage string form by fully unrolling all groups
-pub fn get_required_usage_from<'a, 'b>(
-    p: &Parser<'a, 'b>,
-    reqs: &[&'a str],
-    matcher: Option<&ArgMatcher<'a>>,
-    extra: Option<&str>,
-    incl_last: bool,
-) -> VecDeque<String> {
-    debugln!(
-        "usage::get_required_usage_from: reqs={:?}, extra={:?}",
-        reqs,
-        extra
-    );
-    let mut desc_reqs: Vec<&str> = vec![];
-    desc_reqs.extend(extra);
-    let mut new_reqs: Vec<&str> = vec![];
-    macro_rules! get_requires {
-        (@group $a: ident, $v:ident, $p:ident) => {{
-            if let Some(rl) = p
-                .groups
-                .iter()
-                .filter(|g| g.requires.is_some())
-                .find(|g| &g.name == $a)
-                .map(|g| g.requires.as_ref().unwrap())
-            {
-                for r in rl {
-                    if !$p.contains(&r) {
-                        debugln!(
-                            "usage::get_required_usage_from:iter:{}: adding group req={:?}",
-                            $a,
-                            r
-                        );
-                        $v.push(r);
-                    }
-                }
-            }
-        }};
-        ($a:ident, $what:ident, $how:ident, $v:ident, $p:ident) => {{
-            if let Some(rl) = p
-                .$what
-                .$how()
-                .filter(|a| a.b.requires.is_some())
-                .find(|arg| &arg.b.name == $a)
-                .map(|a| a.b.requires.as_ref().unwrap())
-            {
-                for &(_, r) in rl.iter() {
-                    if !$p.contains(&r) {
-                        debugln!(
-                            "usage::get_required_usage_from:iter:{}: adding arg req={:?}",
-                            $a,
-                            r
-                        );
-                        $v.push(r);
-                    }
-                }
-            }
-        }};
-    }
-    // initialize new_reqs
-    for a in reqs {
-        get_requires!(a, flags, iter, new_reqs, reqs);
-        get_requires!(a, opts, iter, new_reqs, reqs);
-        get_requires!(a, positionals, values, new_reqs, reqs);
-        get_requires!(@group a, new_reqs, reqs);
-    }
-    desc_reqs.extend_from_slice(&*new_reqs);
-    debugln!(
-        "usage::get_required_usage_from: after init desc_reqs={:?}",
-        desc_reqs
-    );
-    loop {
-        let mut tmp = vec![];
-        for a in &new_reqs {
-            get_requires!(a, flags, iter, tmp, desc_reqs);
-            get_requires!(a, opts, iter, tmp, desc_reqs);
-            get_requires!(a, positionals, values, tmp, desc_reqs);
-            get_requires!(@group a, tmp, desc_reqs);
-        }
-        if tmp.is_empty() {
-            debugln!("usage::get_required_usage_from: no more children");
-            break;
-        } else {
-            debugln!("usage::get_required_usage_from: after iter tmp={:?}", tmp);
-            debugln!(
-                "usage::get_required_usage_from: after iter new_reqs={:?}",
-                new_reqs
-            );
-            desc_reqs.extend_from_slice(&*new_reqs);
-            new_reqs.clear();
-            new_reqs.extend_from_slice(&*tmp);
-            debugln!(
-                "usage::get_required_usage_from: after iter desc_reqs={:?}",
-                desc_reqs
-            );
-        }
-    }
-    desc_reqs.extend_from_slice(reqs);
-    desc_reqs.sort();
-    desc_reqs.dedup();
-    debugln!(
-        "usage::get_required_usage_from: final desc_reqs={:?}",
-        desc_reqs
-    );
-    let mut ret_val = VecDeque::new();
-    let args_in_groups = p
-        .groups
-        .iter()
-        .filter(|gn| desc_reqs.contains(&gn.name))
-        .flat_map(|g| p.arg_names_in_group(g.name))
-        .collect::<Vec<_>>();
-
-    let pmap = if let Some(m) = matcher {
-        desc_reqs
-            .iter()
-            .filter(|a| p.positionals.values().any(|p| &&p.b.name == a))
-            .filter(|&pos| !m.contains(pos))
-            .filter_map(|pos| p.positionals.values().find(|x| &x.b.name == pos))
-            .filter(|&pos| incl_last || !pos.is_set(ArgSettings::Last))
-            .filter(|pos| !args_in_groups.contains(&pos.b.name))
-            .map(|pos| (pos.index, pos))
-            .collect::<BTreeMap<u64, &PosBuilder>>() // sort by index
-    } else {
-        desc_reqs
-            .iter()
-            .filter(|a| p.positionals.values().any(|pos| &&pos.b.name == a))
-            .filter_map(|pos| p.positionals.values().find(|x| &x.b.name == pos))
-            .filter(|&pos| incl_last || !pos.is_set(ArgSettings::Last))
-            .filter(|pos| !args_in_groups.contains(&pos.b.name))
-            .map(|pos| (pos.index, pos))
-            .collect::<BTreeMap<u64, &PosBuilder>>() // sort by index
-    };
-    debugln!(
-        "usage::get_required_usage_from: args_in_groups={:?}",
-        args_in_groups
-    );
-    for &p in pmap.values() {
-        let s = p.to_string();
-        if args_in_groups.is_empty() || !args_in_groups.contains(&&*s) {
-            ret_val.push_back(s);
-        }
-    }
-    for a in desc_reqs
-        .iter()
-        .filter(|name| !p.positionals.values().any(|p| &&p.b.name == name))
-        .filter(|name| !p.groups.iter().any(|g| &&g.name == name))
-        .filter(|name| !args_in_groups.contains(name))
-        .filter(|name| !(matcher.is_some() && matcher.as_ref().unwrap().contains(name)))
-    {
-        debugln!("usage::get_required_usage_from:iter:{}:", a);
-        let arg = find_by_name!(p, *a, flags, iter)
-            .map(|f| f.to_string())
-            .unwrap_or_else(|| {
-                find_by_name!(p, *a, opts, iter)
-                    .map(|o| o.to_string())
-                    .expect(INTERNAL_ERROR_MSG)
-            });
-        ret_val.push_back(arg);
-    }
-    let mut g_vec: Vec<String> = vec![];
-    for g in desc_reqs
-        .iter()
-        .filter(|n| p.groups.iter().any(|g| &&g.name == n))
-    {
-        let g_string = p.args_in_group(g).join("|");
-        let elem = format!("<{}>", &g_string[..g_string.len()]);
-        if !g_vec.contains(&elem) {
-            g_vec.push(elem);
-        }
-    }
-    for g in g_vec {
-        ret_val.push_back(g);
-    }
-
-    ret_val
-}
diff --git a/third_party/rust/clap/v2/crate/src/app/validator.rs b/third_party/rust/clap/v2/crate/src/app/validator.rs
deleted file mode 100644
index 862f0bbd..0000000
--- a/third_party/rust/clap/v2/crate/src/app/validator.rs
+++ /dev/null
@@ -1,583 +0,0 @@
-// std
-#[allow(deprecated, unused_imports)]
-use std::ascii::AsciiExt;
-use std::fmt::Display;
-
-// Internal
-use app::parser::{ParseResult, Parser};
-use app::settings::AppSettings as AS;
-use app::usage;
-use args::settings::ArgSettings;
-use args::{AnyArg, ArgMatcher, MatchedArg};
-use errors::Result as ClapResult;
-use errors::{Error, ErrorKind};
-use fmt::{Colorizer, ColorizerOption};
-use INTERNAL_ERROR_MSG;
-use INVALID_UTF8;
-
-pub struct Validator<'a, 'b, 'z>(&'z mut Parser<'a, 'b>)
-where
-    'a: 'b,
-    'b: 'z;
-
-impl<'a, 'b, 'z> Validator<'a, 'b, 'z> {
-    pub fn new(p: &'z mut Parser<'a, 'b>) -> Self {
-        Validator(p)
-    }
-
-    pub fn validate(
-        &mut self,
-        needs_val_of: ParseResult<'a>,
-        subcmd_name: Option<String>,
-        matcher: &mut ArgMatcher<'a>,
-    ) -> ClapResult<()> {
-        debugln!("Validator::validate;");
-        let mut reqs_validated = false;
-        self.0.add_env(matcher)?;
-        self.0.add_defaults(matcher)?;
-        if let ParseResult::Opt(a) = needs_val_of {
-            debugln!("Validator::validate: needs_val_of={:?}", a);
-            let o = {
-                self.0
-                    .opts
-                    .iter()
-                    .find(|o| o.b.name == a)
-                    .expect(INTERNAL_ERROR_MSG)
-                    .clone()
-            };
-            self.validate_required(matcher)?;
-            reqs_validated = true;
-            let should_err = if let Some(v) = matcher.0.args.get(&*o.b.name) {
-                v.vals.is_empty() && !(o.v.min_vals.is_some() && o.v.min_vals.unwrap() == 0)
-            } else {
-                true
-            };
-            if should_err {
-                return Err(Error::empty_value(
-                    &o,
-                    &*usage::create_error_usage(self.0, matcher, None),
-                    self.0.color(),
-                ));
-            }
-        }
-
-        if matcher.is_empty()
-            && matcher.subcommand_name().is_none()
-            && self.0.is_set(AS::ArgRequiredElseHelp)
-        {
-            let mut out = vec![];
-            self.0.write_help_err(&mut out)?;
-            return Err(Error {
-                message: String::from_utf8_lossy(&*out).into_owned(),
-                kind: ErrorKind::MissingArgumentOrSubcommand,
-                info: None,
-            });
-        }
-        self.validate_blacklist(matcher)?;
-        if !(self.0.is_set(AS::SubcommandsNegateReqs) && subcmd_name.is_some()) && !reqs_validated {
-            self.validate_required(matcher)?;
-        }
-        self.validate_matched_args(matcher)?;
-        matcher.usage(usage::create_usage_with_title(self.0, &[]));
-
-        Ok(())
-    }
-
-    fn validate_arg_values<A>(
-        &self,
-        arg: &A,
-        ma: &MatchedArg,
-        matcher: &ArgMatcher<'a>,
-    ) -> ClapResult<()>
-    where
-        A: AnyArg<'a, 'b> + Display,
-    {
-        debugln!("Validator::validate_arg_values: arg={:?}", arg.name());
-        for val in &ma.vals {
-            if self.0.is_set(AS::StrictUtf8) && val.to_str().is_none() {
-                debugln!(
-                    "Validator::validate_arg_values: invalid UTF-8 found in val {:?}",
-                    val
-                );
-                return Err(Error::invalid_utf8(
-                    &*usage::create_error_usage(self.0, matcher, None),
-                    self.0.color(),
-                ));
-            }
-            if let Some(p_vals) = arg.possible_vals() {
-                debugln!("Validator::validate_arg_values: possible_vals={:?}", p_vals);
-                let val_str = val.to_string_lossy();
-                let ok = if arg.is_set(ArgSettings::CaseInsensitive) {
-                    p_vals.iter().any(|pv| pv.eq_ignore_ascii_case(&*val_str))
-                } else {
-                    p_vals.contains(&&*val_str)
-                };
-                if !ok {
-                    return Err(Error::invalid_value(
-                        val_str,
-                        p_vals,
-                        arg,
-                        &*usage::create_error_usage(self.0, matcher, None),
-                        self.0.color(),
-                    ));
-                }
-            }
-            if !arg.is_set(ArgSettings::EmptyValues)
-                && val.is_empty()
-                && matcher.contains(&*arg.name())
-            {
-                debugln!("Validator::validate_arg_values: illegal empty val found");
-                return Err(Error::empty_value(
-                    arg,
-                    &*usage::create_error_usage(self.0, matcher, None),
-                    self.0.color(),
-                ));
-            }
-            if let Some(vtor) = arg.validator() {
-                debug!("Validator::validate_arg_values: checking validator...");
-                if let Err(e) = vtor(val.to_string_lossy().into_owned()) {
-                    sdebugln!("error");
-                    return Err(Error::value_validation(Some(arg), e, self.0.color()));
-                } else {
-                    sdebugln!("good");
-                }
-            }
-            if let Some(vtor) = arg.validator_os() {
-                debug!("Validator::validate_arg_values: checking validator_os...");
-                if let Err(e) = vtor(val) {
-                    sdebugln!("error");
-                    return Err(Error::value_validation(
-                        Some(arg),
-                        (*e).to_string_lossy().to_string(),
-                        self.0.color(),
-                    ));
-                } else {
-                    sdebugln!("good");
-                }
-            }
-        }
-        Ok(())
-    }
-
-    fn build_err(&self, name: &str, matcher: &ArgMatcher) -> ClapResult<()> {
-        debugln!("build_err!: name={}", name);
-        let mut c_with = find_from!(self.0, &name, blacklist, matcher);
-        c_with = c_with.or(self
-            .0
-            .find_any_arg(name)
-            .map_or(None, |aa| aa.blacklist())
-            .map_or(None, |bl| bl.iter().find(|arg| matcher.contains(arg)))
-            .map_or(None, |an| self.0.find_any_arg(an))
-            .map_or(None, |aa| Some(format!("{}", aa))));
-        debugln!("build_err!: '{:?}' conflicts with '{}'", c_with, &name);
-        //        matcher.remove(&name);
-        let usg = usage::create_error_usage(self.0, matcher, None);
-        if let Some(f) = find_by_name!(self.0, name, flags, iter) {
-            debugln!("build_err!: It was a flag...");
-            Err(Error::argument_conflict(f, c_with, &*usg, self.0.color()))
-        } else if let Some(o) = find_by_name!(self.0, name, opts, iter) {
-            debugln!("build_err!: It was an option...");
-            Err(Error::argument_conflict(o, c_with, &*usg, self.0.color()))
-        } else {
-            match find_by_name!(self.0, name, positionals, values) {
-                Some(p) => {
-                    debugln!("build_err!: It was a positional...");
-                    Err(Error::argument_conflict(p, c_with, &*usg, self.0.color()))
-                }
-                None => panic!(INTERNAL_ERROR_MSG),
-            }
-        }
-    }
-
-    fn validate_blacklist(&self, matcher: &mut ArgMatcher) -> ClapResult<()> {
-        debugln!("Validator::validate_blacklist;");
-        let mut conflicts: Vec<&str> = vec![];
-        for (&name, _) in matcher.iter() {
-            debugln!("Validator::validate_blacklist:iter:{};", name);
-            if let Some(grps) = self.0.groups_for_arg(name) {
-                for grp in &grps {
-                    if let Some(g) = self.0.groups.iter().find(|g| &g.name == grp) {
-                        if !g.multiple {
-                            for arg in &g.args {
-                                if arg == &name {
-                                    continue;
-                                }
-                                conflicts.push(arg);
-                            }
-                        }
-                        if let Some(ref gc) = g.conflicts {
-                            conflicts.extend(&*gc);
-                        }
-                    }
-                }
-            }
-            if let Some(arg) = find_any_by_name!(self.0, name) {
-                if let Some(bl) = arg.blacklist() {
-                    for conf in bl {
-                        if matcher.get(conf).is_some() {
-                            conflicts.push(conf);
-                        }
-                    }
-                }
-            } else {
-                debugln!("Validator::validate_blacklist:iter:{}:group;", name);
-                let args = self.0.arg_names_in_group(name);
-                for arg in &args {
-                    debugln!(
-                        "Validator::validate_blacklist:iter:{}:group:iter:{};",
-                        name,
-                        arg
-                    );
-                    if let Some(bl) = find_any_by_name!(self.0, *arg).unwrap().blacklist() {
-                        for conf in bl {
-                            if matcher.get(conf).is_some() {
-                                conflicts.push(conf);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        for name in &conflicts {
-            debugln!(
-                "Validator::validate_blacklist:iter:{}: Checking blacklisted arg",
-                name
-            );
-            let mut should_err = false;
-            if self.0.groups.iter().any(|g| &g.name == name) {
-                debugln!(
-                    "Validator::validate_blacklist:iter:{}: groups contains it...",
-                    name
-                );
-                for n in self.0.arg_names_in_group(name) {
-                    debugln!(
-                        "Validator::validate_blacklist:iter:{}:iter:{}: looking in group...",
-                        name,
-                        n
-                    );
-                    if matcher.contains(n) {
-                        debugln!(
-                            "Validator::validate_blacklist:iter:{}:iter:{}: matcher contains it...",
-                            name,
-                            n
-                        );
-                        return self.build_err(n, matcher);
-                    }
-                }
-            } else if let Some(ma) = matcher.get(name) {
-                debugln!(
-                    "Validator::validate_blacklist:iter:{}: matcher contains it...",
-                    name
-                );
-                should_err = ma.occurs > 0;
-            }
-            if should_err {
-                return self.build_err(*name, matcher);
-            }
-        }
-        Ok(())
-    }
-
-    fn validate_matched_args(&self, matcher: &mut ArgMatcher<'a>) -> ClapResult<()> {
-        debugln!("Validator::validate_matched_args;");
-        for (name, ma) in matcher.iter() {
-            debugln!(
-                "Validator::validate_matched_args:iter:{}: vals={:#?}",
-                name,
-                ma.vals
-            );
-            if let Some(opt) = find_by_name!(self.0, *name, opts, iter) {
-                self.validate_arg_num_vals(opt, ma, matcher)?;
-                self.validate_arg_values(opt, ma, matcher)?;
-                self.validate_arg_requires(opt, ma, matcher)?;
-                self.validate_arg_num_occurs(opt, ma, matcher)?;
-            } else if let Some(flag) = find_by_name!(self.0, *name, flags, iter) {
-                self.validate_arg_requires(flag, ma, matcher)?;
-                self.validate_arg_num_occurs(flag, ma, matcher)?;
-            } else if let Some(pos) = find_by_name!(self.0, *name, positionals, values) {
-                self.validate_arg_num_vals(pos, ma, matcher)?;
-                self.validate_arg_num_occurs(pos, ma, matcher)?;
-                self.validate_arg_values(pos, ma, matcher)?;
-                self.validate_arg_requires(pos, ma, matcher)?;
-            } else {
-                let grp = self
-                    .0
-                    .groups
-                    .iter()
-                    .find(|g| &g.name == name)
-                    .expect(INTERNAL_ERROR_MSG);
-                if let Some(ref g_reqs) = grp.requires {
-                    if g_reqs.iter().any(|&n| !matcher.contains(n)) {
-                        return self.missing_required_error(matcher, None);
-                    }
-                }
-            }
-        }
-        Ok(())
-    }
-
-    fn validate_arg_num_occurs<A>(
-        &self,
-        a: &A,
-        ma: &MatchedArg,
-        matcher: &ArgMatcher,
-    ) -> ClapResult<()>
-    where
-        A: AnyArg<'a, 'b> + Display,
-    {
-        debugln!("Validator::validate_arg_num_occurs: a={};", a.name());
-        if ma.occurs > 1 && !a.is_set(ArgSettings::Multiple) {
-            // Not the first time, and we don't allow multiples
-            return Err(Error::unexpected_multiple_usage(
-                a,
-                &*usage::create_error_usage(self.0, matcher, None),
-                self.0.color(),
-            ));
-        }
-        Ok(())
-    }
-
-    fn validate_arg_num_vals<A>(
-        &self,
-        a: &A,
-        ma: &MatchedArg,
-        matcher: &ArgMatcher,
-    ) -> ClapResult<()>
-    where
-        A: AnyArg<'a, 'b> + Display,
-    {
-        debugln!("Validator::validate_arg_num_vals:{}", a.name());
-        if let Some(num) = a.num_vals() {
-            debugln!("Validator::validate_arg_num_vals: num_vals set...{}", num);
-            let should_err = if a.is_set(ArgSettings::Multiple) {
-                ((ma.vals.len() as u64) % num) != 0
-            } else {
-                num != (ma.vals.len() as u64)
-            };
-            if should_err {
-                debugln!("Validator::validate_arg_num_vals: Sending error WrongNumberOfValues");
-                return Err(Error::wrong_number_of_values(
-                    a,
-                    num,
-                    if a.is_set(ArgSettings::Multiple) {
-                        (ma.vals.len() % num as usize)
-                    } else {
-                        ma.vals.len()
-                    },
-                    if ma.vals.len() == 1
-                        || (a.is_set(ArgSettings::Multiple) && (ma.vals.len() % num as usize) == 1)
-                    {
-                        "as"
-                    } else {
-                        "ere"
-                    },
-                    &*usage::create_error_usage(self.0, matcher, None),
-                    self.0.color(),
-                ));
-            }
-        }
-        if let Some(num) = a.max_vals() {
-            debugln!("Validator::validate_arg_num_vals: max_vals set...{}", num);
-            if (ma.vals.len() as u64) > num {
-                debugln!("Validator::validate_arg_num_vals: Sending error TooManyValues");
-                return Err(Error::too_many_values(
-                    ma.vals
-                        .iter()
-                        .last()
-                        .expect(INTERNAL_ERROR_MSG)
-                        .to_str()
-                        .expect(INVALID_UTF8),
-                    a,
-                    &*usage::create_error_usage(self.0, matcher, None),
-                    self.0.color(),
-                ));
-            }
-        }
-        let min_vals_zero = if let Some(num) = a.min_vals() {
-            debugln!("Validator::validate_arg_num_vals: min_vals set: {}", num);
-            if (ma.vals.len() as u64) < num && num != 0 {
-                debugln!("Validator::validate_arg_num_vals: Sending error TooFewValues");
-                return Err(Error::too_few_values(
-                    a,
-                    num,
-                    ma.vals.len(),
-                    &*usage::create_error_usage(self.0, matcher, None),
-                    self.0.color(),
-                ));
-            }
-            num == 0
-        } else {
-            false
-        };
-        // Issue 665 (https://github.com/clap-rs/clap/issues/665)
-        // Issue 1105 (https://github.com/clap-rs/clap/issues/1105)
-        if a.takes_value() && !min_vals_zero && ma.vals.is_empty() {
-            return Err(Error::empty_value(
-                a,
-                &*usage::create_error_usage(self.0, matcher, None),
-                self.0.color(),
-            ));
-        }
-        Ok(())
-    }
-
-    fn validate_arg_requires<A>(
-        &self,
-        a: &A,
-        ma: &MatchedArg,
-        matcher: &ArgMatcher,
-    ) -> ClapResult<()>
-    where
-        A: AnyArg<'a, 'b> + Display,
-    {
-        debugln!("Validator::validate_arg_requires:{};", a.name());
-        if let Some(a_reqs) = a.requires() {
-            for &(val, name) in a_reqs.iter().filter(|&&(val, _)| val.is_some()) {
-                let missing_req =
-                    |v| v == val.expect(INTERNAL_ERROR_MSG) && !matcher.contains(name);
-                if ma.vals.iter().any(missing_req) {
-                    return self.missing_required_error(matcher, None);
-                }
-            }
-            for &(_, name) in a_reqs.iter().filter(|&&(val, _)| val.is_none()) {
-                if !matcher.contains(name) {
-                    return self.missing_required_error(matcher, Some(name));
-                }
-            }
-        }
-        Ok(())
-    }
-
-    fn validate_required(&mut self, matcher: &ArgMatcher) -> ClapResult<()> {
-        debugln!(
-            "Validator::validate_required: required={:?};",
-            self.0.required
-        );
-
-        let mut should_err = false;
-        let mut to_rem = Vec::new();
-        for name in &self.0.required {
-            debugln!("Validator::validate_required:iter:{}:", name);
-            if matcher.contains(name) {
-                continue;
-            }
-            if to_rem.contains(name) {
-                continue;
-            } else if let Some(a) = find_any_by_name!(self.0, *name) {
-                if self.is_missing_required_ok(a, matcher) {
-                    to_rem.push(a.name());
-                    if let Some(reqs) = a.requires() {
-                        for r in reqs
-                            .iter()
-                            .filter(|&&(val, _)| val.is_none())
-                            .map(|&(_, name)| name)
-                        {
-                            to_rem.push(r);
-                        }
-                    }
-                    continue;
-                }
-            }
-            should_err = true;
-            break;
-        }
-        if should_err {
-            for r in &to_rem {
-                'inner: for i in (0..self.0.required.len()).rev() {
-                    if &self.0.required[i] == r {
-                        self.0.required.swap_remove(i);
-                        break 'inner;
-                    }
-                }
-            }
-            return self.missing_required_error(matcher, None);
-        }
-
-        // Validate the conditionally required args
-        for &(a, v, r) in &self.0.r_ifs {
-            if let Some(ma) = matcher.get(a) {
-                if matcher.get(r).is_none() && ma.vals.iter().any(|val| val == v) {
-                    return self.missing_required_error(matcher, Some(r));
-                }
-            }
-        }
-        Ok(())
-    }
-
-    fn validate_arg_conflicts(&self, a: &AnyArg, matcher: &ArgMatcher) -> Option<bool> {
-        debugln!("Validator::validate_arg_conflicts: a={:?};", a.name());
-        a.blacklist().map(|bl| {
-            bl.iter().any(|conf| {
-                matcher.contains(conf)
-                    || self
-                        .0
-                        .groups
-                        .iter()
-                        .find(|g| &g.name == conf)
-                        .map_or(false, |g| g.args.iter().any(|arg| matcher.contains(arg)))
-            })
-        })
-    }
-
-    fn validate_required_unless(&self, a: &AnyArg, matcher: &ArgMatcher) -> Option<bool> {
-        debugln!("Validator::validate_required_unless: a={:?};", a.name());
-        macro_rules! check {
-            ($how:ident, $_self:expr, $a:ident, $m:ident) => {{
-                $a.required_unless().map(|ru| {
-                    ru.iter().$how(|n| {
-                        $m.contains(n) || {
-                            if let Some(grp) = $_self.groups.iter().find(|g| &g.name == n) {
-                                grp.args.iter().any(|arg| $m.contains(arg))
-                            } else {
-                                false
-                            }
-                        }
-                    })
-                })
-            }};
-        }
-        if a.is_set(ArgSettings::RequiredUnlessAll) {
-            check!(all, self.0, a, matcher)
-        } else {
-            check!(any, self.0, a, matcher)
-        }
-    }
-
-    fn missing_required_error(&self, matcher: &ArgMatcher, extra: Option<&str>) -> ClapResult<()> {
-        debugln!("Validator::missing_required_error: extra={:?}", extra);
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: self.0.color(),
-        });
-        let mut reqs = self.0.required.iter().map(|&r| &*r).collect::<Vec<_>>();
-        if let Some(r) = extra {
-            reqs.push(r);
-        }
-        reqs.retain(|n| !matcher.contains(n));
-        reqs.dedup();
-        debugln!("Validator::missing_required_error: reqs={:#?}", reqs);
-        let req_args =
-            usage::get_required_usage_from(self.0, &reqs[..], Some(matcher), extra, true)
-                .iter()
-                .fold(String::new(), |acc, s| {
-                    acc + &format!("\n    {}", c.error(s))[..]
-                });
-        debugln!(
-            "Validator::missing_required_error: req_args={:#?}",
-            req_args
-        );
-        Err(Error::missing_required_argument(
-            &*req_args,
-            &*usage::create_error_usage(self.0, matcher, extra),
-            self.0.color(),
-        ))
-    }
-
-    #[inline]
-    fn is_missing_required_ok(&self, a: &AnyArg, matcher: &ArgMatcher) -> bool {
-        debugln!("Validator::is_missing_required_ok: a={}", a.name());
-        self.validate_arg_conflicts(a, matcher).unwrap_or(false)
-            || self.validate_required_unless(a, matcher).unwrap_or(false)
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/any_arg.rs b/third_party/rust/clap/v2/crate/src/args/any_arg.rs
deleted file mode 100644
index 46aa763..0000000
--- a/third_party/rust/clap/v2/crate/src/args/any_arg.rs
+++ /dev/null
@@ -1,131 +0,0 @@
-// Std
-use std::ffi::{OsStr, OsString};
-use std::fmt as std_fmt;
-use std::rc::Rc;
-
-// Internal
-use args::settings::ArgSettings;
-use map::{self, VecMap};
-use INTERNAL_ERROR_MSG;
-
-#[doc(hidden)]
-pub trait AnyArg<'n, 'e>: std_fmt::Display {
-    fn name(&self) -> &'n str;
-    fn overrides(&self) -> Option<&[&'e str]>;
-    fn aliases(&self) -> Option<Vec<&'e str>>;
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]>;
-    fn blacklist(&self) -> Option<&[&'e str]>;
-    fn required_unless(&self) -> Option<&[&'e str]>;
-    fn is_set(&self, ArgSettings) -> bool;
-    fn set(&mut self, ArgSettings);
-    fn has_switch(&self) -> bool;
-    fn max_vals(&self) -> Option<u64>;
-    fn min_vals(&self) -> Option<u64>;
-    fn num_vals(&self) -> Option<u64>;
-    fn possible_vals(&self) -> Option<&[&'e str]>;
-    fn validator(&self) -> Option<&Rc<Fn(String) -> Result<(), String>>>;
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> Result<(), OsString>>>;
-    fn short(&self) -> Option<char>;
-    fn long(&self) -> Option<&'e str>;
-    fn val_delim(&self) -> Option<char>;
-    fn takes_value(&self) -> bool;
-    fn val_names(&self) -> Option<&VecMap<&'e str>>;
-    fn help(&self) -> Option<&'e str>;
-    fn long_help(&self) -> Option<&'e str>;
-    fn default_val(&self) -> Option<&'e OsStr>;
-    fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>>;
-    fn env<'s>(&'s self) -> Option<(&'n OsStr, Option<&'s OsString>)>;
-    fn longest_filter(&self) -> bool;
-    fn val_terminator(&self) -> Option<&'e str>;
-}
-
-pub trait DispOrder {
-    fn disp_ord(&self) -> usize;
-}
-
-impl<'n, 'e, 'z, T: ?Sized> AnyArg<'n, 'e> for &'z T
-where
-    T: AnyArg<'n, 'e> + 'z,
-{
-    fn name(&self) -> &'n str {
-        (*self).name()
-    }
-    fn overrides(&self) -> Option<&[&'e str]> {
-        (*self).overrides()
-    }
-    fn aliases(&self) -> Option<Vec<&'e str>> {
-        (*self).aliases()
-    }
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]> {
-        (*self).requires()
-    }
-    fn blacklist(&self) -> Option<&[&'e str]> {
-        (*self).blacklist()
-    }
-    fn required_unless(&self) -> Option<&[&'e str]> {
-        (*self).required_unless()
-    }
-    fn is_set(&self, a: ArgSettings) -> bool {
-        (*self).is_set(a)
-    }
-    fn set(&mut self, _: ArgSettings) {
-        panic!(INTERNAL_ERROR_MSG)
-    }
-    fn has_switch(&self) -> bool {
-        (*self).has_switch()
-    }
-    fn max_vals(&self) -> Option<u64> {
-        (*self).max_vals()
-    }
-    fn min_vals(&self) -> Option<u64> {
-        (*self).min_vals()
-    }
-    fn num_vals(&self) -> Option<u64> {
-        (*self).num_vals()
-    }
-    fn possible_vals(&self) -> Option<&[&'e str]> {
-        (*self).possible_vals()
-    }
-    fn validator(&self) -> Option<&Rc<Fn(String) -> Result<(), String>>> {
-        (*self).validator()
-    }
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> Result<(), OsString>>> {
-        (*self).validator_os()
-    }
-    fn short(&self) -> Option<char> {
-        (*self).short()
-    }
-    fn long(&self) -> Option<&'e str> {
-        (*self).long()
-    }
-    fn val_delim(&self) -> Option<char> {
-        (*self).val_delim()
-    }
-    fn takes_value(&self) -> bool {
-        (*self).takes_value()
-    }
-    fn val_names(&self) -> Option<&VecMap<&'e str>> {
-        (*self).val_names()
-    }
-    fn help(&self) -> Option<&'e str> {
-        (*self).help()
-    }
-    fn long_help(&self) -> Option<&'e str> {
-        (*self).long_help()
-    }
-    fn default_val(&self) -> Option<&'e OsStr> {
-        (*self).default_val()
-    }
-    fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
-        (*self).default_vals_ifs()
-    }
-    fn env<'s>(&'s self) -> Option<(&'n OsStr, Option<&'s OsString>)> {
-        (*self).env()
-    }
-    fn longest_filter(&self) -> bool {
-        (*self).longest_filter()
-    }
-    fn val_terminator(&self) -> Option<&'e str> {
-        (*self).val_terminator()
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/arg.rs b/third_party/rust/clap/v2/crate/src/args/arg.rs
deleted file mode 100644
index ce578e0a..0000000
--- a/third_party/rust/clap/v2/crate/src/args/arg.rs
+++ /dev/null
@@ -1,3959 +0,0 @@
-#[cfg(any(target_os = "windows", target_arch = "wasm32"))]
-use osstringext::OsStrExt3;
-#[cfg(feature = "yaml")]
-use std::collections::BTreeMap;
-use std::env;
-use std::ffi::{OsStr, OsString};
-#[cfg(not(any(target_os = "windows", target_arch = "wasm32")))]
-use std::os::unix::ffi::OsStrExt;
-use std::rc::Rc;
-
-use map::VecMap;
-#[cfg(feature = "yaml")]
-use yaml_rust::Yaml;
-
-use args::arg_builder::{Base, Switched, Valued};
-use args::settings::ArgSettings;
-use usage_parser::UsageParser;
-
-/// The abstract representation of a command line argument. Used to set all the options and
-/// relationships that define a valid argument for the program.
-///
-/// There are two methods for constructing [`Arg`]s, using the builder pattern and setting options
-/// manually, or using a usage string which is far less verbose but has fewer options. You can also
-/// use a combination of the two methods to achieve the best of both worlds.
-///
-/// # Examples
-///
-/// ```rust
-/// # use clap::Arg;
-/// // Using the traditional builder pattern and setting each option manually
-/// let cfg = Arg::with_name("config")
-///       .short("c")
-///       .long("config")
-///       .takes_value(true)
-///       .value_name("FILE")
-///       .help("Provides a config file to myprog");
-/// // Using a usage string (setting a similar argument to the one above)
-/// let input = Arg::from_usage("-i, --input=[FILE] 'Provides an input file to the program'");
-/// ```
-/// [`Arg`]: ./struct.Arg.html
-#[allow(missing_debug_implementations)]
-#[derive(Default, Clone)]
-pub struct Arg<'a, 'b>
-where
-    'a: 'b,
-{
-    #[doc(hidden)]
-    pub b: Base<'a, 'b>,
-    #[doc(hidden)]
-    pub s: Switched<'b>,
-    #[doc(hidden)]
-    pub v: Valued<'a, 'b>,
-    #[doc(hidden)]
-    pub index: Option<u64>,
-    #[doc(hidden)]
-    pub r_ifs: Option<Vec<(&'a str, &'b str)>>,
-}
-
-impl<'a, 'b> Arg<'a, 'b> {
-    /// Creates a new instance of [`Arg`] using a unique string name. The name will be used to get
-    /// information about whether or not the argument was used at runtime, get values, set
-    /// relationships with other args, etc..
-    ///
-    /// **NOTE:** In the case of arguments that take values (i.e. [`Arg::takes_value(true)`])
-    /// and positional arguments (i.e. those without a preceding `-` or `--`) the name will also
-    /// be displayed when the user prints the usage/help information of the program.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    /// # ;
-    /// ```
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`Arg`]: ./struct.Arg.html
-    pub fn with_name(n: &'a str) -> Self {
-        Arg {
-            b: Base::new(n),
-            ..Default::default()
-        }
-    }
-
-    /// Creates a new instance of [`Arg`] from a .yml (YAML) file.
-    ///
-    /// # Examples
-    ///
-    /// ```ignore
-    /// # #[macro_use]
-    /// # extern crate clap;
-    /// # use clap::Arg;
-    /// # fn main() {
-    /// let yml = load_yaml!("arg.yml");
-    /// let arg = Arg::from_yaml(yml);
-    /// # }
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    #[cfg(feature = "yaml")]
-    pub fn from_yaml(y: &BTreeMap<Yaml, Yaml>) -> Arg {
-        // We WANT this to panic on error...so expect() is good.
-        let name_yml = y.keys().nth(0).unwrap();
-        let name_str = name_yml.as_str().unwrap();
-        let mut a = Arg::with_name(name_str);
-        let arg_settings = y.get(name_yml).unwrap().as_hash().unwrap();
-
-        for (k, v) in arg_settings.iter() {
-            a = match k.as_str().unwrap() {
-                "short" => yaml_to_str!(a, v, short),
-                "long" => yaml_to_str!(a, v, long),
-                "aliases" => yaml_vec_or_str!(v, a, alias),
-                "help" => yaml_to_str!(a, v, help),
-                "long_help" => yaml_to_str!(a, v, long_help),
-                "required" => yaml_to_bool!(a, v, required),
-                "required_if" => yaml_tuple2!(a, v, required_if),
-                "required_ifs" => yaml_tuple2!(a, v, required_if),
-                "takes_value" => yaml_to_bool!(a, v, takes_value),
-                "index" => yaml_to_u64!(a, v, index),
-                "global" => yaml_to_bool!(a, v, global),
-                "multiple" => yaml_to_bool!(a, v, multiple),
-                "hidden" => yaml_to_bool!(a, v, hidden),
-                "next_line_help" => yaml_to_bool!(a, v, next_line_help),
-                "empty_values" => yaml_to_bool!(a, v, empty_values),
-                "group" => yaml_to_str!(a, v, group),
-                "number_of_values" => yaml_to_u64!(a, v, number_of_values),
-                "max_values" => yaml_to_u64!(a, v, max_values),
-                "min_values" => yaml_to_u64!(a, v, min_values),
-                "value_name" => yaml_to_str!(a, v, value_name),
-                "use_delimiter" => yaml_to_bool!(a, v, use_delimiter),
-                "allow_hyphen_values" => yaml_to_bool!(a, v, allow_hyphen_values),
-                "last" => yaml_to_bool!(a, v, last),
-                "require_delimiter" => yaml_to_bool!(a, v, require_delimiter),
-                "value_delimiter" => yaml_to_str!(a, v, value_delimiter),
-                "required_unless" => yaml_to_str!(a, v, required_unless),
-                "display_order" => yaml_to_usize!(a, v, display_order),
-                "default_value" => yaml_to_str!(a, v, default_value),
-                "default_value_if" => yaml_tuple3!(a, v, default_value_if),
-                "default_value_ifs" => yaml_tuple3!(a, v, default_value_if),
-                "env" => yaml_to_str!(a, v, env),
-                "value_names" => yaml_vec_or_str!(v, a, value_name),
-                "groups" => yaml_vec_or_str!(v, a, group),
-                "requires" => yaml_vec_or_str!(v, a, requires),
-                "requires_if" => yaml_tuple2!(a, v, requires_if),
-                "requires_ifs" => yaml_tuple2!(a, v, requires_if),
-                "conflicts_with" => yaml_vec_or_str!(v, a, conflicts_with),
-                "overrides_with" => yaml_vec_or_str!(v, a, overrides_with),
-                "possible_values" => yaml_vec_or_str!(v, a, possible_value),
-                "case_insensitive" => yaml_to_bool!(a, v, case_insensitive),
-                "required_unless_one" => yaml_vec_or_str!(v, a, required_unless),
-                "required_unless_all" => {
-                    a = yaml_vec_or_str!(v, a, required_unless);
-                    a.setb(ArgSettings::RequiredUnlessAll);
-                    a
-                }
-                s => panic!(
-                    "Unknown Arg setting '{}' in YAML file for arg '{}'",
-                    s, name_str
-                ),
-            }
-        }
-
-        a
-    }
-
-    /// Creates a new instance of [`Arg`] from a usage string. Allows creation of basic settings
-    /// for the [`Arg`]. The syntax is flexible, but there are some rules to follow.
-    ///
-    /// **NOTE**: Not all settings may be set using the usage string method. Some properties are
-    /// only available via the builder pattern.
-    ///
-    /// **NOTE**: Only ASCII values are officially supported in [`Arg::from_usage`] strings. Some
-    /// UTF-8 codepoints may work just fine, but this is not guaranteed.
-    ///
-    /// # Syntax
-    ///
-    /// Usage strings typically following the form:
-    ///
-    /// ```notrust
-    /// [explicit name] [short] [long] [value names] [help string]
-    /// ```
-    ///
-    /// This is not a hard rule as the attributes can appear in other orders. There are also
-    /// several additional sigils which denote additional settings. Below are the details of each
-    /// portion of the string.
-    ///
-    /// ### Explicit Name
-    ///
-    /// This is an optional field, if it's omitted the argument will use one of the additional
-    /// fields as the name using the following priority order:
-    ///
-    ///  * Explicit Name (This always takes precedence when present)
-    ///  * Long
-    ///  * Short
-    ///  * Value Name
-    ///
-    /// `clap` determines explicit names as the first string of characters between either `[]` or
-    /// `<>` where `[]` has the dual notation of meaning the argument is optional, and `<>` meaning
-    /// the argument is required.
-    ///
-    /// Explicit names may be followed by:
-    ///  * The multiple denotation `...`
-    ///
-    /// Example explicit names as follows (`ename` for an optional argument, and `rname` for a
-    /// required argument):
-    ///
-    /// ```notrust
-    /// [ename] -s, --long 'some flag'
-    /// <rname> -r, --longer 'some other flag'
-    /// ```
-    ///
-    /// ### Short
-    ///
-    /// This is set by placing a single character after a leading `-`.
-    ///
-    /// Shorts may be followed by
-    ///  * The multiple denotation `...`
-    ///  * An optional comma `,` which is cosmetic only
-    ///  * Value notation
-    ///
-    /// Example shorts are as follows (`-s`, and `-r`):
-    ///
-    /// ```notrust
-    /// -s, --long 'some flag'
-    /// <rname> -r [val], --longer 'some option'
-    /// ```
-    ///
-    /// ### Long
-    ///
-    /// This is set by placing a word (no spaces) after a leading `--`.
-    ///
-    /// Shorts may be followed by
-    ///  * The multiple denotation `...`
-    ///  * Value notation
-    ///
-    /// Example longs are as follows (`--some`, and `--rapid`):
-    ///
-    /// ```notrust
-    /// -s, --some 'some flag'
-    /// --rapid=[FILE] 'some option'
-    /// ```
-    ///
-    /// ### Values (Value Notation)
-    ///
-    /// This is set by placing a word(s) between `[]` or `<>` optionally after `=` (although this
-    /// is cosmetic only and does not affect functionality). If an explicit name has **not** been
-    /// set, using `<>` will denote a required argument, and `[]` will denote an optional argument
-    ///
-    /// Values may be followed by
-    ///  * The multiple denotation `...`
-    ///  * More Value notation
-    ///
-    /// More than one value will also implicitly set the arguments number of values, i.e. having
-    /// two values, `--option [val1] [val2]` specifies that in order for option to be satisified it
-    /// must receive exactly two values
-    ///
-    /// Example values are as follows (`FILE`, and `SPEED`):
-    ///
-    /// ```notrust
-    /// -s, --some [FILE] 'some option'
-    /// --rapid=<SPEED>... 'some required multiple option'
-    /// ```
-    ///
-    /// ### Help String
-    ///
-    /// The help string is denoted between a pair of single quotes `''` and may contain any
-    /// characters.
-    ///
-    /// Example help strings are as follows:
-    ///
-    /// ```notrust
-    /// -s, --some [FILE] 'some option'
-    /// --rapid=<SPEED>... 'some required multiple option'
-    /// ```
-    ///
-    /// ### Additional Sigils
-    ///
-    /// Multiple notation `...` (three consecutive dots/periods) specifies that this argument may
-    /// be used multiple times. Do not confuse multiple occurrences (`...`) with multiple values.
-    /// `--option val1 val2` is a single occurrence with multiple values. `--flag --flag` is
-    /// multiple occurrences (and then you can obviously have instances of both as well)
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// App::new("prog")
-    ///     .args(&[
-    ///         Arg::from_usage("--config <FILE> 'a required file for the configuration and no short'"),
-    ///         Arg::from_usage("-d, --debug... 'turns on debugging information and allows multiples'"),
-    ///         Arg::from_usage("[input] 'an optional input file to use'")
-    /// ])
-    /// # ;
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    /// [`Arg::from_usage`]: ./struct.Arg.html#method.from_usage
-    pub fn from_usage(u: &'a str) -> Self {
-        let parser = UsageParser::from_usage(u);
-        parser.parse()
-    }
-
-    /// Sets the short version of the argument without the preceding `-`.
-    ///
-    /// By default `clap` automatically assigns `V` and `h` to the auto-generated `version` and
-    /// `help` arguments respectively. You may use the uppercase `V` or lowercase `h` for your own
-    /// arguments, in which case `clap` simply will not assign those to the auto-generated
-    /// `version` or `help` arguments.
-    ///
-    /// **NOTE:** Any leading `-` characters will be stripped, and only the first
-    /// non `-` character will be used as the [`short`] version
-    ///
-    /// # Examples
-    ///
-    /// To set [`short`] use a single valid UTF-8 code point. If you supply a leading `-` such as
-    /// `-c`, the `-` will be stripped.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .short("c")
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`short`] allows using the argument via a single hyphen (`-`) such as `-c`
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("config")
-    ///         .short("c"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-c"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("config"));
-    /// ```
-    /// [`short`]: ./struct.Arg.html#method.short
-    pub fn short<S: AsRef<str>>(mut self, s: S) -> Self {
-        self.s.short = s.as_ref().trim_left_matches(|c| c == '-').chars().nth(0);
-        self
-    }
-
-    /// Sets the long version of the argument without the preceding `--`.
-    ///
-    /// By default `clap` automatically assigns `version` and `help` to the auto-generated
-    /// `version` and `help` arguments respectively. You may use the word `version` or `help` for
-    /// the long form of your own arguments, in which case `clap` simply will not assign those to
-    /// the auto-generated `version` or `help` arguments.
-    ///
-    /// **NOTE:** Any leading `-` characters will be stripped
-    ///
-    /// # Examples
-    ///
-    /// To set `long` use a word containing valid UTF-8 codepoints. If you supply a double leading
-    /// `--` such as `--config` they will be stripped. Hyphens in the middle of the word, however,
-    /// will *not* be stripped (i.e. `config-file` is allowed)
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("cfg")
-    ///     .long("config")
-    /// # ;
-    /// ```
-    ///
-    /// Setting `long` allows using the argument via a double hyphen (`--`) such as `--config`
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--config"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("cfg"));
-    /// ```
-    pub fn long(mut self, l: &'b str) -> Self {
-        self.s.long = Some(l.trim_left_matches(|c| c == '-'));
-        self
-    }
-
-    /// Allows adding a [`Arg`] alias, which function as "hidden" arguments that
-    /// automatically dispatch as if this argument was used. This is more efficient, and easier
-    /// than creating multiple hidden arguments as one only needs to check for the existence of
-    /// this command, and not all variants.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///             .arg(Arg::with_name("test")
-    ///             .long("test")
-    ///             .alias("alias")
-    ///             .takes_value(true))
-    ///        .get_matches_from(vec![
-    ///             "prog", "--alias", "cool"
-    ///         ]);
-    /// assert!(m.is_present("test"));
-    /// assert_eq!(m.value_of("test"), Some("cool"));
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    pub fn alias<S: Into<&'b str>>(mut self, name: S) -> Self {
-        if let Some(ref mut als) = self.s.aliases {
-            als.push((name.into(), false));
-        } else {
-            self.s.aliases = Some(vec![(name.into(), false)]);
-        }
-        self
-    }
-
-    /// Allows adding [`Arg`] aliases, which function as "hidden" arguments that
-    /// automatically dispatch as if this argument was used. This is more efficient, and easier
-    /// than creating multiple hidden subcommands as one only needs to check for the existence of
-    /// this command, and not all variants.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///             .arg(Arg::with_name("test")
-    ///                     .long("test")
-    ///                     .aliases(&["do-stuff", "do-tests", "tests"])
-    ///                     .help("the file to add")
-    ///                     .required(false))
-    ///             .get_matches_from(vec![
-    ///                 "prog", "--do-tests"
-    ///             ]);
-    /// assert!(m.is_present("test"));
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    pub fn aliases(mut self, names: &[&'b str]) -> Self {
-        if let Some(ref mut als) = self.s.aliases {
-            for n in names {
-                als.push((n, false));
-            }
-        } else {
-            self.s.aliases = Some(names.iter().map(|n| (*n, false)).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Allows adding a [`Arg`] alias that functions exactly like those defined with
-    /// [`Arg::alias`], except that they are visible inside the help message.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///             .arg(Arg::with_name("test")
-    ///                 .visible_alias("something-awesome")
-    ///                 .long("test")
-    ///                 .takes_value(true))
-    ///        .get_matches_from(vec![
-    ///             "prog", "--something-awesome", "coffee"
-    ///         ]);
-    /// assert!(m.is_present("test"));
-    /// assert_eq!(m.value_of("test"), Some("coffee"));
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    /// [`App::alias`]: ./struct.Arg.html#method.alias
-    pub fn visible_alias<S: Into<&'b str>>(mut self, name: S) -> Self {
-        if let Some(ref mut als) = self.s.aliases {
-            als.push((name.into(), true));
-        } else {
-            self.s.aliases = Some(vec![(name.into(), true)]);
-        }
-        self
-    }
-
-    /// Allows adding multiple [`Arg`] aliases that functions exactly like those defined
-    /// with [`Arg::aliases`], except that they are visible inside the help message.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///             .arg(Arg::with_name("test")
-    ///                 .long("test")
-    ///                 .visible_aliases(&["something", "awesome", "cool"]))
-    ///        .get_matches_from(vec![
-    ///             "prog", "--awesome"
-    ///         ]);
-    /// assert!(m.is_present("test"));
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    /// [`App::aliases`]: ./struct.Arg.html#method.aliases
-    pub fn visible_aliases(mut self, names: &[&'b str]) -> Self {
-        if let Some(ref mut als) = self.s.aliases {
-            for n in names {
-                als.push((n, true));
-            }
-        } else {
-            self.s.aliases = Some(names.iter().map(|n| (*n, true)).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Sets the short help text of the argument that will be displayed to the user when they print
-    /// the help information with `-h`. Typically, this is a short (one line) description of the
-    /// arg.
-    ///
-    /// **NOTE:** If only `Arg::help` is provided, and not [`Arg::long_help`] but the user requests
-    /// `--help` clap will still display the contents of `help` appropriately
-    ///
-    /// **NOTE:** Only `Arg::help` is used in completion script generation in order to be concise
-    ///
-    /// # Examples
-    ///
-    /// Any valid UTF-8 is allowed in the help text. The one exception is when one wishes to
-    /// include a newline in the help text and have the following text be properly aligned with all
-    /// the other help text.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .help("The config file used by the myprog")
-    /// # ;
-    /// ```
-    ///
-    /// Setting `help` displays a short message to the side of the argument when the user passes
-    /// `-h` or `--help` (by default).
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .help("Some help text describing the --config arg"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays
-    ///
-    /// ```notrust
-    /// helptest
-    ///
-    /// USAGE:
-    ///    helptest [FLAGS]
-    ///
-    /// FLAGS:
-    ///     --config     Some help text describing the --config arg
-    /// -h, --help       Prints help information
-    /// -V, --version    Prints version information
-    /// ```
-    /// [`Arg::long_help`]: ./struct.Arg.html#method.long_help
-    pub fn help(mut self, h: &'b str) -> Self {
-        self.b.help = Some(h);
-        self
-    }
-
-    /// Sets the long help text of the argument that will be displayed to the user when they print
-    /// the help information with `--help`. Typically this a more detailed (multi-line) message
-    /// that describes the arg.
-    ///
-    /// **NOTE:** If only `long_help` is provided, and not [`Arg::help`] but the user requests `-h`
-    /// clap will still display the contents of `long_help` appropriately
-    ///
-    /// **NOTE:** Only [`Arg::help`] is used in completion script generation in order to be concise
-    ///
-    /// # Examples
-    ///
-    /// Any valid UTF-8 is allowed in the help text. The one exception is when one wishes to
-    /// include a newline in the help text and have the following text be properly aligned with all
-    /// the other help text.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .long_help(
-    /// "The config file used by the myprog must be in JSON format
-    /// with only valid keys and may not contain other nonsense
-    /// that cannot be read by this program. Obviously I'm going on
-    /// and on, so I'll stop now.")
-    /// # ;
-    /// ```
-    ///
-    /// Setting `help` displays a short message to the side of the argument when the user passes
-    /// `-h` or `--help` (by default).
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .long_help(
-    /// "The config file used by the myprog must be in JSON format
-    /// with only valid keys and may not contain other nonsense
-    /// that cannot be read by this program. Obviously I'm going on
-    /// and on, so I'll stop now."))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays
-    ///
-    /// ```notrust
-    /// helptest
-    ///
-    /// USAGE:
-    ///    helptest [FLAGS]
-    ///
-    /// FLAGS:
-    ///    --config
-    ///         The config file used by the myprog must be in JSON format
-    ///         with only valid keys and may not contain other nonsense
-    ///         that cannot be read by this program. Obviously I'm going on
-    ///         and on, so I'll stop now.
-    ///
-    /// -h, --help
-    ///         Prints help information
-    ///
-    /// -V, --version
-    ///         Prints version information
-    /// ```
-    /// [`Arg::help`]: ./struct.Arg.html#method.help
-    pub fn long_help(mut self, h: &'b str) -> Self {
-        self.b.long_help = Some(h);
-        self
-    }
-
-    /// Specifies that this arg is the last, or final, positional argument (i.e. has the highest
-    /// index) and is *only* able to be accessed via the `--` syntax (i.e. `$ prog args --
-    /// last_arg`). Even, if no other arguments are left to parse, if the user omits the `--` syntax
-    /// they will receive an [`UnknownArgument`] error. Setting an argument to `.last(true)` also
-    /// allows one to access this arg early using the `--` syntax. Accessing an arg early, even with
-    /// the `--` syntax is otherwise not possible.
-    ///
-    /// **NOTE:** This will change the usage string to look like `$ prog [FLAGS] [-- <ARG>]` if
-    /// `ARG` is marked as `.last(true)`.
-    ///
-    /// **NOTE:** This setting will imply [`AppSettings::DontCollapseArgsInUsage`] because failing
-    /// to set this can make the usage string very confusing.
-    ///
-    /// **NOTE**: This setting only applies to positional arguments, and has no affect on FLAGS /
-    /// OPTIONS
-    ///
-    /// **CAUTION:** Setting an argument to `.last(true)` *and* having child subcommands is not
-    /// recommended with the exception of *also* using [`AppSettings::ArgsNegateSubcommands`]
-    /// (or [`AppSettings::SubcommandsNegateReqs`] if the argument marked `.last(true)` is also
-    /// marked [`.required(true)`])
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("args")
-    ///     .last(true)
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::last(true)`] ensures the arg has the highest [index] of all positional args
-    /// and requires that the `--` syntax be used to access it early.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("first"))
-    ///     .arg(Arg::with_name("second"))
-    ///     .arg(Arg::with_name("third").last(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "one", "--", "three"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// let m = res.unwrap();
-    /// assert_eq!(m.value_of("third"), Some("three"));
-    /// assert!(m.value_of("second").is_none());
-    /// ```
-    ///
-    /// Even if the positional argument marked `.last(true)` is the only argument left to parse,
-    /// failing to use the `--` syntax results in an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("first"))
-    ///     .arg(Arg::with_name("second"))
-    ///     .arg(Arg::with_name("third").last(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "one", "two", "three"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// [`Arg::last(true)`]: ./struct.Arg.html#method.last
-    /// [index]: ./struct.Arg.html#method.index
-    /// [`AppSettings::DontCollapseArgsInUsage`]: ./enum.AppSettings.html#variant.DontCollapseArgsInUsage
-    /// [`AppSettings::ArgsNegateSubcommands`]: ./enum.AppSettings.html#variant.ArgsNegateSubcommands
-    /// [`AppSettings::SubcommandsNegateReqs`]: ./enum.AppSettings.html#variant.SubcommandsNegateReqs
-    /// [`.required(true)`]: ./struct.Arg.html#method.required
-    /// [`UnknownArgument`]: ./enum.ErrorKind.html#variant.UnknownArgument
-    pub fn last(self, l: bool) -> Self {
-        if l {
-            self.set(ArgSettings::Last)
-        } else {
-            self.unset(ArgSettings::Last)
-        }
-    }
-
-    /// Sets whether or not the argument is required by default. Required by default means it is
-    /// required, when no other conflicting rules have been evaluated. Conflicting rules take
-    /// precedence over being required. **Default:** `false`
-    ///
-    /// **NOTE:** Flags (i.e. not positional, or arguments that take values) cannot be required by
-    /// default. This is simply because if a flag should be required, it should simply be implied
-    /// as no additional information is required from user. Flags by their very nature are simply
-    /// yes/no, or true/false.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required(true)
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required(true)`] requires that the argument be used at runtime.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required(true)
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "file.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// ```
-    ///
-    /// Setting [`Arg::required(true)`] and *not* supplying that argument is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required(true)
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::required(true)`]: ./struct.Arg.html#method.required
-    pub fn required(self, r: bool) -> Self {
-        if r {
-            self.set(ArgSettings::Required)
-        } else {
-            self.unset(ArgSettings::Required)
-        }
-    }
-
-    /// Requires that options use the `--option=val` syntax (i.e. an equals between the option and
-    /// associated value) **Default:** `false`
-    ///
-    /// **NOTE:** This setting also removes the default of allowing empty values and implies
-    /// [`Arg::empty_values(false)`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .long("config")
-    ///     .takes_value(true)
-    ///     .require_equals(true)
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::require_equals(true)`] requires that the option have an equals sign between
-    /// it and the associated value.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .require_equals(true)
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config=file.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// ```
-    ///
-    /// Setting [`Arg::require_equals(true)`] and *not* supplying the equals will cause an error
-    /// unless [`Arg::empty_values(true)`] is set.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .require_equals(true)
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "file.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::EmptyValue);
-    /// ```
-    /// [`Arg::require_equals(true)`]: ./struct.Arg.html#method.require_equals
-    /// [`Arg::empty_values(true)`]: ./struct.Arg.html#method.empty_values
-    /// [`Arg::empty_values(false)`]: ./struct.Arg.html#method.empty_values
-    pub fn require_equals(mut self, r: bool) -> Self {
-        if r {
-            self.unsetb(ArgSettings::EmptyValues);
-            self.set(ArgSettings::RequireEquals)
-        } else {
-            self.unset(ArgSettings::RequireEquals)
-        }
-    }
-
-    /// Allows values which start with a leading hyphen (`-`)
-    ///
-    /// **WARNING**: Take caution when using this setting combined with [`Arg::multiple(true)`], as
-    /// this becomes ambiguous `$ prog --arg -- -- val`. All three `--, --, val` will be values
-    /// when the user may have thought the second `--` would constitute the normal, "Only
-    /// positional args follow" idiom. To fix this, consider using [`Arg::number_of_values(1)`]
-    ///
-    /// **WARNING**: When building your CLIs, consider the effects of allowing leading hyphens and
-    /// the user passing in a value that matches a valid short. For example `prog -opt -F` where
-    /// `-F` is supposed to be a value, yet `-F` is *also* a valid short for another arg. Care should
-    /// should be taken when designing these args. This is compounded by the ability to "stack"
-    /// short args. I.e. if `-val` is supposed to be a value, but `-v`, `-a`, and `-l` are all valid
-    /// shorts.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("pattern")
-    ///     .allow_hyphen_values(true)
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("pat")
-    ///         .allow_hyphen_values(true)
-    ///         .takes_value(true)
-    ///         .long("pattern"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--pattern", "-file"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("pat"), Some("-file"));
-    /// ```
-    ///
-    /// Not setting [`Arg::allow_hyphen_values(true)`] and supplying a value which starts with a
-    /// hyphen is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("pat")
-    ///         .takes_value(true)
-    ///         .long("pattern"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--pattern", "-file"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// [`Arg::allow_hyphen_values(true)`]: ./struct.Arg.html#method.allow_hyphen_values
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    /// [`Arg::number_of_values(1)`]: ./struct.Arg.html#method.number_of_values
-    pub fn allow_hyphen_values(self, a: bool) -> Self {
-        if a {
-            self.set(ArgSettings::AllowLeadingHyphen)
-        } else {
-            self.unset(ArgSettings::AllowLeadingHyphen)
-        }
-    }
-    /// Sets an arg that override this arg's required setting. (i.e. this arg will be required
-    /// unless this other argument is present).
-    ///
-    /// **Pro Tip:** Using [`Arg::required_unless`] implies [`Arg::required`] and is therefore not
-    /// mandatory to also set.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required_unless("debug")
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless(name)`] requires that the argument be used at runtime
-    /// *unless* `name` is present. In the following example, the required argument is *not*
-    /// provided, but it's not an error because the `unless` arg has been supplied.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless("dbg")
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--debug"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless(name)`] and *not* supplying `name` or this arg is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless("dbg")
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::required_unless`]: ./struct.Arg.html#method.required_unless
-    /// [`Arg::required`]: ./struct.Arg.html#method.required
-    /// [`Arg::required_unless(name)`]: ./struct.Arg.html#method.required_unless
-    pub fn required_unless(mut self, name: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.r_unless {
-            vec.push(name);
-        } else {
-            self.b.r_unless = Some(vec![name]);
-        }
-        self.required(true)
-    }
-
-    /// Sets args that override this arg's required setting. (i.e. this arg will be required unless
-    /// all these other arguments are present).
-    ///
-    /// **NOTE:** If you wish for this argument to only be required if *one of* these args are
-    /// present see [`Arg::required_unless_one`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required_unless_all(&["cfg", "dbg"])
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless_all(names)`] requires that the argument be used at runtime
-    /// *unless* *all* the args in `names` are present. In the following example, the required
-    /// argument is *not* provided, but it's not an error because all the `unless` args have been
-    /// supplied.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless_all(&["dbg", "infile"])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .arg(Arg::with_name("infile")
-    ///         .short("i")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--debug", "-i", "file"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless_all(names)`] and *not* supplying *all* of `names` or this
-    /// arg is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless_all(&["dbg", "infile"])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .arg(Arg::with_name("infile")
-    ///         .short("i")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::required_unless_one`]: ./struct.Arg.html#method.required_unless_one
-    /// [`Arg::required_unless_all(names)`]: ./struct.Arg.html#method.required_unless_all
-    pub fn required_unless_all(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.r_unless {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.b.r_unless = Some(names.iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self.setb(ArgSettings::RequiredUnlessAll);
-        self.required(true)
-    }
-
-    /// Sets args that override this arg's [required] setting. (i.e. this arg will be required
-    /// unless *at least one of* these other arguments are present).
-    ///
-    /// **NOTE:** If you wish for this argument to only be required if *all of* these args are
-    /// present see [`Arg::required_unless_all`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required_unless_all(&["cfg", "dbg"])
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless_one(names)`] requires that the argument be used at runtime
-    /// *unless* *at least one of* the args in `names` are present. In the following example, the
-    /// required argument is *not* provided, but it's not an error because one the `unless` args
-    /// have been supplied.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless_one(&["dbg", "infile"])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .arg(Arg::with_name("infile")
-    ///         .short("i")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--debug"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// ```
-    ///
-    /// Setting [`Arg::required_unless_one(names)`] and *not* supplying *at least one of* `names`
-    /// or this arg is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_unless_one(&["dbg", "infile"])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("dbg")
-    ///         .long("debug"))
-    ///     .arg(Arg::with_name("infile")
-    ///         .short("i")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [required]: ./struct.Arg.html#method.required
-    /// [`Arg::required_unless_one(names)`]: ./struct.Arg.html#method.required_unless_one
-    /// [`Arg::required_unless_all`]: ./struct.Arg.html#method.required_unless_all
-    pub fn required_unless_one(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.r_unless {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.b.r_unless = Some(names.iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self.required(true)
-    }
-
-    /// Sets a conflicting argument by name. I.e. when using this argument,
-    /// the following argument can't be present and vice versa.
-    ///
-    /// **NOTE:** Conflicting rules take precedence over being required by default. Conflict rules
-    /// only need to be set for one of the two arguments, they do not need to be set for each.
-    ///
-    /// **NOTE:** Defining a conflict is two-way, but does *not* need to defined for both arguments
-    /// (i.e. if A conflicts with B, defining A.conflicts_with(B) is sufficient. You do not need
-    /// need to also do B.conflicts_with(A))
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .conflicts_with("debug")
-    /// # ;
-    /// ```
-    ///
-    /// Setting conflicting argument, and having both arguments present at runtime is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .conflicts_with("debug")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--debug", "--config", "file.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::ArgumentConflict);
-    /// ```
-    pub fn conflicts_with(mut self, name: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.blacklist {
-            vec.push(name);
-        } else {
-            self.b.blacklist = Some(vec![name]);
-        }
-        self
-    }
-
-    /// The same as [`Arg::conflicts_with`] but allows specifying multiple two-way conlicts per
-    /// argument.
-    ///
-    /// **NOTE:** Conflicting rules take precedence over being required by default. Conflict rules
-    /// only need to be set for one of the two arguments, they do not need to be set for each.
-    ///
-    /// **NOTE:** Defining a conflict is two-way, but does *not* need to defined for both arguments
-    /// (i.e. if A conflicts with B, defining A.conflicts_with(B) is sufficient. You do not need
-    /// need to also do B.conflicts_with(A))
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .conflicts_with_all(&["debug", "input"])
-    /// # ;
-    /// ```
-    ///
-    /// Setting conflicting argument, and having any of the arguments present at runtime with a
-    /// conflicting argument is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .conflicts_with_all(&["debug", "input"])
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug"))
-    ///     .arg(Arg::with_name("input")
-    ///         .index(1))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "file.conf", "file.txt"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::ArgumentConflict);
-    /// ```
-    /// [`Arg::conflicts_with`]: ./struct.Arg.html#method.conflicts_with
-    pub fn conflicts_with_all(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.blacklist {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.b.blacklist = Some(names.iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Sets a overridable argument by name. I.e. this argument and the following argument
-    /// will override each other in POSIX style (whichever argument was specified at runtime
-    /// **last** "wins")
-    ///
-    /// **NOTE:** When an argument is overridden it is essentially as if it never was used, any
-    /// conflicts, requirements, etc. are evaluated **after** all "overrides" have been removed
-    ///
-    /// **WARNING:** Positional arguments cannot override themselves (or we would never be able
-    /// to advance to the next positional). If a positional agument lists itself as an override,
-    /// it is simply ignored.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::from_usage("-f, --flag 'some flag'")
-    ///         .conflicts_with("debug"))
-    ///     .arg(Arg::from_usage("-d, --debug 'other flag'"))
-    ///     .arg(Arg::from_usage("-c, --color 'third flag'")
-    ///         .overrides_with("flag"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-f", "-d", "-c"]);
-    ///             //    ^~~~~~~~~~~~^~~~~ flag is overridden by color
-    ///
-    /// assert!(m.is_present("color"));
-    /// assert!(m.is_present("debug")); // even though flag conflicts with debug, it's as if flag
-    ///                                 // was never used because it was overridden with color
-    /// assert!(!m.is_present("flag"));
-    /// ```
-    /// Care must be taken when using this setting, and having an arg override with itself. This
-    /// is common practice when supporting things like shell aliases, config files, etc.
-    /// However, when combined with multiple values, it can get dicy.
-    /// Here is how clap handles such situations:
-    ///
-    /// When a flag overrides itself, it's as if the flag was only ever used once (essentially
-    /// preventing a "Unexpected multiple usage" error):
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("posix")
-    ///             .arg(Arg::from_usage("--flag  'some flag'").overrides_with("flag"))
-    ///             .get_matches_from(vec!["posix", "--flag", "--flag"]);
-    /// assert!(m.is_present("flag"));
-    /// assert_eq!(m.occurrences_of("flag"), 1);
-    /// ```
-    /// Making a arg `multiple(true)` and override itself is essentially meaningless. Therefore
-    /// clap ignores an override of self if it's a flag and it already accepts multiple occurrences.
-    ///
-    /// ```
-    /// # use clap::{App, Arg};
-    /// let m = App::new("posix")
-    ///             .arg(Arg::from_usage("--flag...  'some flag'").overrides_with("flag"))
-    ///             .get_matches_from(vec!["", "--flag", "--flag", "--flag", "--flag"]);
-    /// assert!(m.is_present("flag"));
-    /// assert_eq!(m.occurrences_of("flag"), 4);
-    /// ```
-    /// Now notice with options (which *do not* set `multiple(true)`), it's as if only the last
-    /// occurrence happened.
-    ///
-    /// ```
-    /// # use clap::{App, Arg};
-    /// let m = App::new("posix")
-    ///             .arg(Arg::from_usage("--opt [val] 'some option'").overrides_with("opt"))
-    ///             .get_matches_from(vec!["", "--opt=some", "--opt=other"]);
-    /// assert!(m.is_present("opt"));
-    /// assert_eq!(m.occurrences_of("opt"), 1);
-    /// assert_eq!(m.value_of("opt"), Some("other"));
-    /// ```
-    ///
-    /// Just like flags, options with `multiple(true)` set, will ignore the "override self" setting.
-    ///
-    /// ```
-    /// # use clap::{App, Arg};
-    /// let m = App::new("posix")
-    ///             .arg(Arg::from_usage("--opt [val]... 'some option'")
-    ///                 .overrides_with("opt"))
-    ///             .get_matches_from(vec!["", "--opt", "first", "over", "--opt", "other", "val"]);
-    /// assert!(m.is_present("opt"));
-    /// assert_eq!(m.occurrences_of("opt"), 2);
-    /// assert_eq!(m.values_of("opt").unwrap().collect::<Vec<_>>(), &["first", "over", "other", "val"]);
-    /// ```
-    ///
-    /// A safe thing to do if you'd like to support an option which supports multiple values, but
-    /// also is "overridable" by itself, is to use `use_delimiter(false)` and *not* use
-    /// `multiple(true)` while telling users to seperate values with a comma (i.e. `val1,val2`)
-    ///
-    /// ```
-    /// # use clap::{App, Arg};
-    /// let m = App::new("posix")
-    ///             .arg(Arg::from_usage("--opt [val] 'some option'")
-    ///                 .overrides_with("opt")
-    ///                 .use_delimiter(false))
-    ///             .get_matches_from(vec!["", "--opt=some,other", "--opt=one,two"]);
-    /// assert!(m.is_present("opt"));
-    /// assert_eq!(m.occurrences_of("opt"), 1);
-    /// assert_eq!(m.values_of("opt").unwrap().collect::<Vec<_>>(), &["one,two"]);
-    /// ```
-    pub fn overrides_with(mut self, name: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.overrides {
-            vec.push(name);
-        } else {
-            self.b.overrides = Some(vec![name]);
-        }
-        self
-    }
-
-    /// Sets multiple mutually overridable arguments by name. I.e. this argument and the following
-    /// argument will override each other in POSIX style (whichever argument was specified at
-    /// runtime **last** "wins")
-    ///
-    /// **NOTE:** When an argument is overridden it is essentially as if it never was used, any
-    /// conflicts, requirements, etc. are evaluated **after** all "overrides" have been removed
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::from_usage("-f, --flag 'some flag'")
-    ///         .conflicts_with("color"))
-    ///     .arg(Arg::from_usage("-d, --debug 'other flag'"))
-    ///     .arg(Arg::from_usage("-c, --color 'third flag'")
-    ///         .overrides_with_all(&["flag", "debug"]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-f", "-d", "-c"]);
-    ///             //    ^~~~~~^~~~~~~~~ flag and debug are overridden by color
-    ///
-    /// assert!(m.is_present("color")); // even though flag conflicts with color, it's as if flag
-    ///                                 // and debug were never used because they were overridden
-    ///                                 // with color
-    /// assert!(!m.is_present("debug"));
-    /// assert!(!m.is_present("flag"));
-    /// ```
-    pub fn overrides_with_all(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.overrides {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.b.overrides = Some(names.iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Sets an argument by name that is required when this one is present I.e. when
-    /// using this argument, the following argument *must* be present.
-    ///
-    /// **NOTE:** [Conflicting] rules and [override] rules take precedence over being required
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .requires("input")
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::requires(name)`] requires that the argument be used at runtime if the
-    /// defining argument is used. If the defining argument isn't used, the other argument isn't
-    /// required
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires("input")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("input")
-    ///         .index(1))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok()); // We didn't use cfg, so input wasn't required
-    /// ```
-    ///
-    /// Setting [`Arg::requires(name)`] and *not* supplying that argument is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires("input")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("input")
-    ///         .index(1))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "file.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::requires(name)`]: ./struct.Arg.html#method.requires
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [override]: ./struct.Arg.html#method.overrides_with
-    pub fn requires(mut self, name: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.requires {
-            vec.push((None, name));
-        } else {
-            let mut vec = vec![];
-            vec.push((None, name));
-            self.b.requires = Some(vec);
-        }
-        self
-    }
-
-    /// Allows a conditional requirement. The requirement will only become valid if this arg's value
-    /// equals `val`.
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows
-    ///
-    /// ```yaml
-    /// requires_if:
-    ///     - [val, arg]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .requires_if("val", "arg")
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::requires_if(val, arg)`] requires that the `arg` be used at runtime if the
-    /// defining argument's value is equal to `val`. If the defining argument is anything other than
-    /// `val`, the other argument isn't required.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires_if("my.cfg", "other")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("other"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "some.cfg"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok()); // We didn't use --config=my.cfg, so other wasn't required
-    /// ```
-    ///
-    /// Setting [`Arg::requires_if(val, arg)`] and setting the value to `val` but *not* supplying
-    /// `arg` is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires_if("my.cfg", "input")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("input"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "my.cfg"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::requires(name)`]: ./struct.Arg.html#method.requires
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [override]: ./struct.Arg.html#method.overrides_with
-    pub fn requires_if(mut self, val: &'b str, arg: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.requires {
-            vec.push((Some(val), arg));
-        } else {
-            self.b.requires = Some(vec![(Some(val), arg)]);
-        }
-        self
-    }
-
-    /// Allows multiple conditional requirements. The requirement will only become valid if this arg's value
-    /// equals `val`.
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows
-    ///
-    /// ```yaml
-    /// requires_if:
-    ///     - [val, arg]
-    ///     - [val2, arg2]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .requires_ifs(&[
-    ///         ("val", "arg"),
-    ///         ("other_val", "arg2"),
-    ///     ])
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::requires_ifs(&["val", "arg"])`] requires that the `arg` be used at runtime if the
-    /// defining argument's value is equal to `val`. If the defining argument's value is anything other
-    /// than `val`, `arg` isn't required.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires_ifs(&[
-    ///             ("special.conf", "opt"),
-    ///             ("other.conf", "other"),
-    ///         ])
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("option")
-    ///         .takes_value(true))
-    ///     .arg(Arg::with_name("other"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "special.conf"
-    ///     ]);
-    ///
-    /// assert!(res.is_err()); // We  used --config=special.conf so --option <val> is required
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::requires(name)`]: ./struct.Arg.html#method.requires
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [override]: ./struct.Arg.html#method.overrides_with
-    pub fn requires_ifs(mut self, ifs: &[(&'b str, &'a str)]) -> Self {
-        if let Some(ref mut vec) = self.b.requires {
-            for &(val, arg) in ifs {
-                vec.push((Some(val), arg));
-            }
-        } else {
-            let mut vec = vec![];
-            for &(val, arg) in ifs {
-                vec.push((Some(val), arg));
-            }
-            self.b.requires = Some(vec);
-        }
-        self
-    }
-
-    /// Allows specifying that an argument is [required] conditionally. The requirement will only
-    /// become valid if the specified `arg`'s value equals `val`.
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows
-    ///
-    /// ```yaml
-    /// required_if:
-    ///     - [arg, val]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required_if("other_arg", "value")
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required_if(arg, val)`] makes this arg required if the `arg` is used at
-    /// runtime and it's value is equal to `val`. If the `arg`'s value is anything other than `val`,
-    /// this argument isn't required.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .required_if("other", "special")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--other", "not-special"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok()); // We didn't use --other=special, so "cfg" wasn't required
-    /// ```
-    ///
-    /// Setting [`Arg::required_if(arg, val)`] and having `arg` used with a value of `val` but *not*
-    /// using this arg is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .required_if("other", "special")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--other", "special"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::requires(name)`]: ./struct.Arg.html#method.requires
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [required]: ./struct.Arg.html#method.required
-    pub fn required_if(mut self, arg: &'a str, val: &'b str) -> Self {
-        if let Some(ref mut vec) = self.r_ifs {
-            vec.push((arg, val));
-        } else {
-            self.r_ifs = Some(vec![(arg, val)]);
-        }
-        self
-    }
-
-    /// Allows specifying that an argument is [required] based on multiple conditions. The
-    /// conditions are set up in a `(arg, val)` style tuple. The requirement will only become valid
-    /// if one of the specified `arg`'s value equals it's corresponding `val`.
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows
-    ///
-    /// ```yaml
-    /// required_if:
-    ///     - [arg, val]
-    ///     - [arg2, val2]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .required_ifs(&[
-    ///         ("extra", "val"),
-    ///         ("option", "spec")
-    ///     ])
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::required_ifs(&[(arg, val)])`] makes this arg required if any of the `arg`s
-    /// are used at runtime and it's corresponding value is equal to `val`. If the `arg`'s value is
-    /// anything other than `val`, this argument isn't required.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_ifs(&[
-    ///             ("extra", "val"),
-    ///             ("option", "spec")
-    ///         ])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("extra")
-    ///         .takes_value(true)
-    ///         .long("extra"))
-    ///     .arg(Arg::with_name("option")
-    ///         .takes_value(true)
-    ///         .long("option"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--option", "other"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok()); // We didn't use --option=spec, or --extra=val so "cfg" isn't required
-    /// ```
-    ///
-    /// Setting [`Arg::required_ifs(&[(arg, val)])`] and having any of the `arg`s used with it's
-    /// value of `val` but *not* using this arg is an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .required_ifs(&[
-    ///             ("extra", "val"),
-    ///             ("option", "spec")
-    ///         ])
-    ///         .takes_value(true)
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("extra")
-    ///         .takes_value(true)
-    ///         .long("extra"))
-    ///     .arg(Arg::with_name("option")
-    ///         .takes_value(true)
-    ///         .long("option"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--option", "spec"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`Arg::requires(name)`]: ./struct.Arg.html#method.requires
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [required]: ./struct.Arg.html#method.required
-    pub fn required_ifs(mut self, ifs: &[(&'a str, &'b str)]) -> Self {
-        if let Some(ref mut vec) = self.r_ifs {
-            for r_if in ifs {
-                vec.push((r_if.0, r_if.1));
-            }
-        } else {
-            let mut vec = vec![];
-            for r_if in ifs {
-                vec.push((r_if.0, r_if.1));
-            }
-            self.r_ifs = Some(vec);
-        }
-        self
-    }
-
-    /// Sets multiple arguments by names that are required when this one is present I.e. when
-    /// using this argument, the following arguments *must* be present.
-    ///
-    /// **NOTE:** [Conflicting] rules and [override] rules take precedence over being required
-    /// by default.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::Arg;
-    /// Arg::with_name("config")
-    ///     .requires_all(&["input", "output"])
-    /// # ;
-    /// ```
-    ///
-    /// Setting [`Arg::requires_all(&[arg, arg2])`] requires that all the arguments be used at
-    /// runtime if the defining argument is used. If the defining argument isn't used, the other
-    /// argument isn't required
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires("input")
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("input")
-    ///         .index(1))
-    ///     .arg(Arg::with_name("output")
-    ///         .index(2))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok()); // We didn't use cfg, so input and output weren't required
-    /// ```
-    ///
-    /// Setting [`Arg::requires_all(&[arg, arg2])`] and *not* supplying all the arguments is an
-    /// error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .takes_value(true)
-    ///         .requires_all(&["input", "output"])
-    ///         .long("config"))
-    ///     .arg(Arg::with_name("input")
-    ///         .index(1))
-    ///     .arg(Arg::with_name("output")
-    ///         .index(2))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config", "file.conf", "in.txt"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// // We didn't use output
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [Conflicting]: ./struct.Arg.html#method.conflicts_with
-    /// [override]: ./struct.Arg.html#method.overrides_with
-    /// [`Arg::requires_all(&[arg, arg2])`]: ./struct.Arg.html#method.requires_all
-    pub fn requires_all(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.requires {
-            for s in names {
-                vec.push((None, s));
-            }
-        } else {
-            let mut vec = vec![];
-            for s in names {
-                vec.push((None, *s));
-            }
-            self.b.requires = Some(vec);
-        }
-        self
-    }
-
-    /// Specifies that the argument takes a value at run time.
-    ///
-    /// **NOTE:** values for arguments may be specified in any of the following methods
-    ///
-    /// * Using a space such as `-o value` or `--option value`
-    /// * Using an equals and no space such as `-o=value` or `--option=value`
-    /// * Use a short and no space such as `-ovalue`
-    ///
-    /// **NOTE:** By default, args which allow [multiple values] are delimited by commas, meaning
-    /// `--option=val1,val2,val3` is three values for the `--option` argument. If you wish to
-    /// change the delimiter to another character you can use [`Arg::value_delimiter(char)`],
-    /// alternatively you can turn delimiting values **OFF** by using [`Arg::use_delimiter(false)`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .takes_value(true)
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--mode", "fast"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("mode"));
-    /// assert_eq!(m.value_of("mode"), Some("fast"));
-    /// ```
-    /// [`Arg::value_delimiter(char)`]: ./struct.Arg.html#method.value_delimiter
-    /// [`Arg::use_delimiter(false)`]: ./struct.Arg.html#method.use_delimiter
-    /// [multiple values]: ./struct.Arg.html#method.multiple
-    pub fn takes_value(self, tv: bool) -> Self {
-        if tv {
-            self.set(ArgSettings::TakesValue)
-        } else {
-            self.unset(ArgSettings::TakesValue)
-        }
-    }
-
-    /// Specifies if the possible values of an argument should be displayed in the help text or
-    /// not. Defaults to `false` (i.e. show possible values)
-    ///
-    /// This is useful for args with many values, or ones which are explained elsewhere in the
-    /// help text.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .hide_possible_values(true)
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .possible_values(&["fast", "slow"])
-    ///         .takes_value(true)
-    ///         .hide_possible_values(true));
-    ///
-    /// ```
-    ///
-    /// If we were to run the above program with `--help` the `[values: fast, slow]` portion of
-    /// the help text would be omitted.
-    pub fn hide_possible_values(self, hide: bool) -> Self {
-        if hide {
-            self.set(ArgSettings::HidePossibleValues)
-        } else {
-            self.unset(ArgSettings::HidePossibleValues)
-        }
-    }
-
-    /// Specifies if the default value of an argument should be displayed in the help text or
-    /// not. Defaults to `false` (i.e. show default value)
-    ///
-    /// This is useful when default behavior of an arg is explained elsewhere in the help text.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .hide_default_value(true)
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("connect")
-    ///     .arg(Arg::with_name("host")
-    ///         .long("host")
-    ///         .default_value("localhost")
-    ///         .hide_default_value(true));
-    ///
-    /// ```
-    ///
-    /// If we were to run the above program with `--help` the `[default: localhost]` portion of
-    /// the help text would be omitted.
-    pub fn hide_default_value(self, hide: bool) -> Self {
-        if hide {
-            self.set(ArgSettings::HideDefaultValue)
-        } else {
-            self.unset(ArgSettings::HideDefaultValue)
-        }
-    }
-
-    /// Specifies the index of a positional argument **starting at** 1.
-    ///
-    /// **NOTE:** The index refers to position according to **other positional argument**. It does
-    /// not define position in the argument list as a whole.
-    ///
-    /// **NOTE:** If no [`Arg::short`], or [`Arg::long`] have been defined, you can optionally
-    /// leave off the `index` method, and the index will be assigned in order of evaluation.
-    /// Utilizing the `index` method allows for setting indexes out of order
-    ///
-    /// **NOTE:** When utilized with [`Arg::multiple(true)`], only the **last** positional argument
-    /// may be defined as multiple (i.e. with the highest index)
-    ///
-    /// # Panics
-    ///
-    /// Although not in this method directly, [`App`] will [`panic!`] if indexes are skipped (such
-    /// as defining `index(1)` and `index(3)` but not `index(2)`, or a positional argument is
-    /// defined as multiple and is not the highest index
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("config")
-    ///     .index(1)
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .index(1))
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--debug", "fast"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("mode"));
-    /// assert_eq!(m.value_of("mode"), Some("fast")); // notice index(1) means "first positional"
-    ///                                               // *not* first argument
-    /// ```
-    /// [`Arg::short`]: ./struct.Arg.html#method.short
-    /// [`Arg::long`]: ./struct.Arg.html#method.long
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    /// [`App`]: ./struct.App.html
-    /// [`panic!`]: https://doc.rust-lang.org/std/macro.panic!.html
-    pub fn index(mut self, idx: u64) -> Self {
-        self.index = Some(idx);
-        self
-    }
-
-    /// Specifies that the argument may appear more than once. For flags, this results
-    /// in the number of occurrences of the flag being recorded. For example `-ddd` or `-d -d -d`
-    /// would count as three occurrences. For options there is a distinct difference in multiple
-    /// occurrences vs multiple values.
-    ///
-    /// For example, `--opt val1 val2` is one occurrence, but two values. Whereas
-    /// `--opt val1 --opt val2` is two occurrences.
-    ///
-    /// **WARNING:**
-    ///
-    /// Setting `multiple(true)` for an [option] with no other details, allows multiple values
-    /// **and** multiple occurrences because it isn't possible to have more occurrences than values
-    /// for options. Because multiple values are allowed, `--option val1 val2 val3` is perfectly
-    /// valid, be careful when designing a CLI where positional arguments are expected after a
-    /// option which accepts multiple values, as `clap` will continue parsing *values* until it
-    /// reaches the max or specific number of values defined, or another flag or option.
-    ///
-    /// **Pro Tip**:
-    ///
-    /// It's possible to define an option which allows multiple occurrences, but only one value per
-    /// occurrence. To do this use [`Arg::number_of_values(1)`] in coordination with
-    /// [`Arg::multiple(true)`].
-    ///
-    /// **WARNING:**
-    ///
-    /// When using args with `multiple(true)` on [options] or [positionals] (i.e. those args that
-    /// accept values) and [subcommands], one needs to consider the possibility of an argument value
-    /// being the same as a valid subcommand. By default `clap` will parse the argument in question
-    /// as a value *only if* a value is possible at that moment. Otherwise it will be parsed as a
-    /// subcommand. In effect, this means using `multiple(true)` with no additional parameters and
-    /// a possible value that coincides with a subcommand name, the subcommand cannot be called
-    /// unless another argument is passed first.
-    ///
-    /// As an example, consider a CLI with an option `--ui-paths=<paths>...` and subcommand `signer`
-    ///
-    /// The following would be parsed as values to `--ui-paths`.
-    ///
-    /// ```notrust
-    /// $ program --ui-paths path1 path2 signer
-    /// ```
-    ///
-    /// This is because `--ui-paths` accepts multiple values. `clap` will continue parsing values
-    /// until another argument is reached and it knows `--ui-paths` is done.
-    ///
-    /// By adding additional parameters to `--ui-paths` we can solve this issue. Consider adding
-    /// [`Arg::number_of_values(1)`] as discussed above. The following are all valid, and `signer`
-    /// is parsed as both a subcommand and a value in the second case.
-    ///
-    /// ```notrust
-    /// $ program --ui-paths path1 signer
-    /// $ program --ui-paths path1 --ui-paths signer signer
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .short("d")
-    ///     .multiple(true)
-    /// # ;
-    /// ```
-    /// An example with flags
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("verbose")
-    ///         .multiple(true)
-    ///         .short("v"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-v", "-v", "-v"    // note, -vvv would have same result
-    ///     ]);
-    ///
-    /// assert!(m.is_present("verbose"));
-    /// assert_eq!(m.occurrences_of("verbose"), 3);
-    /// ```
-    ///
-    /// An example with options
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .multiple(true)
-    ///         .takes_value(true)
-    ///         .short("F"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-F", "file1", "file2", "file3"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("file"));
-    /// assert_eq!(m.occurrences_of("file"), 1); // notice only one occurrence
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3"]);
-    /// ```
-    /// This is functionally equivalent to the example above
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .multiple(true)
-    ///         .takes_value(true)
-    ///         .short("F"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-F", "file1", "-F", "file2", "-F", "file3"
-    ///     ]);
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3"]);
-    ///
-    /// assert!(m.is_present("file"));
-    /// assert_eq!(m.occurrences_of("file"), 3); // Notice 3 occurrences
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3"]);
-    /// ```
-    ///
-    /// A common mistake is to define an option which allows multiples, and a positional argument
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .multiple(true)
-    ///         .takes_value(true)
-    ///         .short("F"))
-    ///     .arg(Arg::with_name("word")
-    ///         .index(1))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-F", "file1", "file2", "file3", "word"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("file"));
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3", "word"]); // wait...what?!
-    /// assert!(!m.is_present("word")); // but we clearly used word!
-    /// ```
-    /// The problem is clap doesn't know when to stop parsing values for "files". This is further
-    /// compounded by if we'd said `word -F file1 file2` it would have worked fine, so it would
-    /// appear to only fail sometimes...not good!
-    ///
-    /// A solution for the example above is to specify that `-F` only accepts one value, but is
-    /// allowed to appear multiple times
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .multiple(true)
-    ///         .takes_value(true)
-    ///         .number_of_values(1)
-    ///         .short("F"))
-    ///     .arg(Arg::with_name("word")
-    ///         .index(1))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-F", "file1", "-F", "file2", "-F", "file3", "word"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("file"));
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3"]);
-    /// assert!(m.is_present("word"));
-    /// assert_eq!(m.value_of("word"), Some("word"));
-    /// ```
-    /// As a final example, notice if we define [`Arg::number_of_values(1)`] and try to run the
-    /// problem example above, it would have been a runtime error with a pretty message to the
-    /// user :)
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .multiple(true)
-    ///         .takes_value(true)
-    ///         .number_of_values(1)
-    ///         .short("F"))
-    ///     .arg(Arg::with_name("word")
-    ///         .index(1))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1", "file2", "file3", "word"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// [option]: ./struct.Arg.html#method.takes_value
-    /// [options]: ./struct.Arg.html#method.takes_value
-    /// [subcommands]: ./struct.SubCommand.html
-    /// [positionals]: ./struct.Arg.html#method.index
-    /// [`Arg::number_of_values(1)`]: ./struct.Arg.html#method.number_of_values
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    pub fn multiple(self, multi: bool) -> Self {
-        if multi {
-            self.set(ArgSettings::Multiple)
-        } else {
-            self.unset(ArgSettings::Multiple)
-        }
-    }
-
-    /// Specifies a value that *stops* parsing multiple values of a give argument. By default when
-    /// one sets [`multiple(true)`] on an argument, clap will continue parsing values for that
-    /// argument until it reaches another valid argument, or one of the other more specific settings
-    /// for multiple values is used (such as [`min_values`], [`max_values`] or
-    /// [`number_of_values`]).
-    ///
-    /// **NOTE:** This setting only applies to [options] and [positional arguments]
-    ///
-    /// **NOTE:** When the terminator is passed in on the command line, it is **not** stored as one
-    /// of the values
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("vals")
-    ///     .takes_value(true)
-    ///     .multiple(true)
-    ///     .value_terminator(";")
-    /// # ;
-    /// ```
-    /// The following example uses two arguments, a sequence of commands, and the location in which
-    /// to perform them
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cmds")
-    ///         .multiple(true)
-    ///         .allow_hyphen_values(true)
-    ///         .value_terminator(";"))
-    ///     .arg(Arg::with_name("location"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "find", "-type", "f", "-name", "special", ";", "/home/clap"
-    ///     ]);
-    /// let cmds: Vec<_> = m.values_of("cmds").unwrap().collect();
-    /// assert_eq!(&cmds, &["find", "-type", "f", "-name", "special"]);
-    /// assert_eq!(m.value_of("location"), Some("/home/clap"));
-    /// ```
-    /// [options]: ./struct.Arg.html#method.takes_value
-    /// [positional arguments]: ./struct.Arg.html#method.index
-    /// [`multiple(true)`]: ./struct.Arg.html#method.multiple
-    /// [`min_values`]: ./struct.Arg.html#method.min_values
-    /// [`number_of_values`]: ./struct.Arg.html#method.number_of_values
-    /// [`max_values`]: ./struct.Arg.html#method.max_values
-    pub fn value_terminator(mut self, term: &'b str) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        self.v.terminator = Some(term);
-        self
-    }
-
-    /// Specifies that an argument can be matched to all child [`SubCommand`]s.
-    ///
-    /// **NOTE:** Global arguments *only* propagate down, **not** up (to parent commands), however
-    /// their values once a user uses them will be propagated back up to parents. In effect, this
-    /// means one should *define* all global arguments at the top level, however it doesn't matter
-    /// where the user *uses* the global argument.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .short("d")
-    ///     .global(true)
-    /// # ;
-    /// ```
-    ///
-    /// For example, assume an application with two subcommands, and you'd like to define a
-    /// `--verbose` flag that can be called on any of the subcommands and parent, but you don't
-    /// want to clutter the source with three duplicate [`Arg`] definitions.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, SubCommand};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("verb")
-    ///         .long("verbose")
-    ///         .short("v")
-    ///         .global(true))
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .subcommand(SubCommand::with_name("do-stuff"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "do-stuff", "--verbose"
-    ///     ]);
-    ///
-    /// assert_eq!(m.subcommand_name(), Some("do-stuff"));
-    /// let sub_m = m.subcommand_matches("do-stuff").unwrap();
-    /// assert!(sub_m.is_present("verb"));
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [required]: ./struct.Arg.html#method.required
-    /// [`ArgMatches`]: ./struct.ArgMatches.html
-    /// [`ArgMatches::is_present("flag")`]: ./struct.ArgMatches.html#method.is_present
-    /// [`Arg`]: ./struct.Arg.html
-    pub fn global(self, g: bool) -> Self {
-        if g {
-            self.set(ArgSettings::Global)
-        } else {
-            self.unset(ArgSettings::Global)
-        }
-    }
-
-    /// Allows an argument to accept explicitly empty values. An empty value must be specified at
-    /// the command line with an explicit `""`, or `''`
-    ///
-    /// **NOTE:** Defaults to `true` (Explicitly empty values are allowed)
-    ///
-    /// **NOTE:** Implicitly sets [`Arg::takes_value(true)`] when set to `false`
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("file")
-    ///     .long("file")
-    ///     .empty_values(false)
-    /// # ;
-    /// ```
-    /// The default is to allow empty values, such as `--option ""` would be an empty value. But
-    /// we can change to make empty values become an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .short("v")
-    ///         .empty_values(false))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--config="
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::EmptyValue);
-    /// ```
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    pub fn empty_values(mut self, ev: bool) -> Self {
-        if ev {
-            self.set(ArgSettings::EmptyValues)
-        } else {
-            self = self.set(ArgSettings::TakesValue);
-            self.unset(ArgSettings::EmptyValues)
-        }
-    }
-
-    /// Hides an argument from help message output.
-    ///
-    /// **NOTE:** Implicitly sets [`Arg::hidden_short_help(true)`] and [`Arg::hidden_long_help(true)`]
-    /// when set to true
-    ///
-    /// **NOTE:** This does **not** hide the argument from usage strings on error
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .hidden(true)
-    /// # ;
-    /// ```
-    /// Setting `hidden(true)` will hide the argument when displaying help text
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .hidden(true)
-    ///         .help("Some help text describing the --config arg"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays
-    ///
-    /// ```notrust
-    /// helptest
-    ///
-    /// USAGE:
-    ///    helptest [FLAGS]
-    ///
-    /// FLAGS:
-    /// -h, --help       Prints help information
-    /// -V, --version    Prints version information
-    /// ```
-    /// [`Arg::hidden_short_help(true)`]: ./struct.Arg.html#method.hidden_short_help
-    /// [`Arg::hidden_long_help(true)`]: ./struct.Arg.html#method.hidden_long_help
-    pub fn hidden(self, h: bool) -> Self {
-        if h {
-            self.set(ArgSettings::Hidden)
-        } else {
-            self.unset(ArgSettings::Hidden)
-        }
-    }
-
-    /// Specifies a list of possible values for this argument. At runtime, `clap` verifies that
-    /// only one of the specified values was used, or fails with an error message.
-    ///
-    /// **NOTE:** This setting only applies to [options] and [positional arguments]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("mode")
-    ///     .takes_value(true)
-    ///     .possible_values(&["fast", "slow", "medium"])
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .takes_value(true)
-    ///         .possible_values(&["fast", "slow", "medium"]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--mode", "fast"
-    ///     ]);
-    /// assert!(m.is_present("mode"));
-    /// assert_eq!(m.value_of("mode"), Some("fast"));
-    /// ```
-    ///
-    /// The next example shows a failed parse from using a value which wasn't defined as one of the
-    /// possible values.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .takes_value(true)
-    ///         .possible_values(&["fast", "slow", "medium"]))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--mode", "wrong"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::InvalidValue);
-    /// ```
-    /// [options]: ./struct.Arg.html#method.takes_value
-    /// [positional arguments]: ./struct.Arg.html#method.index
-    pub fn possible_values(mut self, names: &[&'b str]) -> Self {
-        if let Some(ref mut vec) = self.v.possible_vals {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.v.possible_vals = Some(names.iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Specifies a possible value for this argument, one at a time. At runtime, `clap` verifies
-    /// that only one of the specified values was used, or fails with error message.
-    ///
-    /// **NOTE:** This setting only applies to [options] and [positional arguments]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("mode")
-    ///     .takes_value(true)
-    ///     .possible_value("fast")
-    ///     .possible_value("slow")
-    ///     .possible_value("medium")
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .takes_value(true)
-    ///         .possible_value("fast")
-    ///         .possible_value("slow")
-    ///         .possible_value("medium"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--mode", "fast"
-    ///     ]);
-    /// assert!(m.is_present("mode"));
-    /// assert_eq!(m.value_of("mode"), Some("fast"));
-    /// ```
-    ///
-    /// The next example shows a failed parse from using a value which wasn't defined as one of the
-    /// possible values.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("mode")
-    ///         .long("mode")
-    ///         .takes_value(true)
-    ///         .possible_value("fast")
-    ///         .possible_value("slow")
-    ///         .possible_value("medium"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "--mode", "wrong"
-    ///     ]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::InvalidValue);
-    /// ```
-    /// [options]: ./struct.Arg.html#method.takes_value
-    /// [positional arguments]: ./struct.Arg.html#method.index
-    pub fn possible_value(mut self, name: &'b str) -> Self {
-        if let Some(ref mut vec) = self.v.possible_vals {
-            vec.push(name);
-        } else {
-            self.v.possible_vals = Some(vec![name]);
-        }
-        self
-    }
-
-    /// When used with [`Arg::possible_values`] it allows the argument value to pass validation even if
-    /// the case differs from that of the specified `possible_value`.
-    ///
-    /// **Pro Tip:** Use this setting with [`arg_enum!`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// # use std::ascii::AsciiExt;
-    /// let m = App::new("pv")
-    ///     .arg(Arg::with_name("option")
-    ///         .long("--option")
-    ///         .takes_value(true)
-    ///         .possible_value("test123")
-    ///         .case_insensitive(true))
-    ///     .get_matches_from(vec![
-    ///         "pv", "--option", "TeSt123",
-    ///     ]);
-    ///
-    /// assert!(m.value_of("option").unwrap().eq_ignore_ascii_case("test123"));
-    /// ```
-    ///
-    /// This setting also works when multiple values can be defined:
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("pv")
-    ///     .arg(Arg::with_name("option")
-    ///         .short("-o")
-    ///         .long("--option")
-    ///         .takes_value(true)
-    ///         .possible_value("test123")
-    ///         .possible_value("test321")
-    ///         .multiple(true)
-    ///         .case_insensitive(true))
-    ///     .get_matches_from(vec![
-    ///         "pv", "--option", "TeSt123", "teST123", "tESt321"
-    ///     ]);
-    ///
-    /// let matched_vals = m.values_of("option").unwrap().collect::<Vec<_>>();
-    /// assert_eq!(&*matched_vals, &["TeSt123", "teST123", "tESt321"]);
-    /// ```
-    /// [`Arg::case_insensitive(true)`]: ./struct.Arg.html#method.possible_values
-    /// [`arg_enum!`]: ./macro.arg_enum.html
-    pub fn case_insensitive(self, ci: bool) -> Self {
-        if ci {
-            self.set(ArgSettings::CaseInsensitive)
-        } else {
-            self.unset(ArgSettings::CaseInsensitive)
-        }
-    }
-
-    /// Specifies the name of the [`ArgGroup`] the argument belongs to.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .long("debug")
-    ///     .group("mode")
-    /// # ;
-    /// ```
-    ///
-    /// Multiple arguments can be a member of a single group and then the group checked as if it
-    /// was one of said arguments.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug")
-    ///         .group("mode"))
-    ///     .arg(Arg::with_name("verbose")
-    ///         .long("verbose")
-    ///         .group("mode"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--debug"
-    ///     ]);
-    /// assert!(m.is_present("mode"));
-    /// ```
-    /// [`ArgGroup`]: ./struct.ArgGroup.html
-    pub fn group(mut self, name: &'a str) -> Self {
-        if let Some(ref mut vec) = self.b.groups {
-            vec.push(name);
-        } else {
-            self.b.groups = Some(vec![name]);
-        }
-        self
-    }
-
-    /// Specifies the names of multiple [`ArgGroup`]'s the argument belongs to.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .long("debug")
-    ///     .groups(&["mode", "verbosity"])
-    /// # ;
-    /// ```
-    ///
-    /// Arguments can be members of multiple groups and then the group checked as if it
-    /// was one of said arguments.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug")
-    ///         .groups(&["mode", "verbosity"]))
-    ///     .arg(Arg::with_name("verbose")
-    ///         .long("verbose")
-    ///         .groups(&["mode", "verbosity"]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--debug"
-    ///     ]);
-    /// assert!(m.is_present("mode"));
-    /// assert!(m.is_present("verbosity"));
-    /// ```
-    /// [`ArgGroup`]: ./struct.ArgGroup.html
-    pub fn groups(mut self, names: &[&'a str]) -> Self {
-        if let Some(ref mut vec) = self.b.groups {
-            for s in names {
-                vec.push(s);
-            }
-        } else {
-            self.b.groups = Some(names.into_iter().map(|s| *s).collect::<Vec<_>>());
-        }
-        self
-    }
-
-    /// Specifies how many values are required to satisfy this argument. For example, if you had a
-    /// `-f <file>` argument where you wanted exactly 3 'files' you would set
-    /// `.number_of_values(3)`, and this argument wouldn't be satisfied unless the user provided
-    /// 3 and only 3 values.
-    ///
-    /// **NOTE:** Does *not* require [`Arg::multiple(true)`] to be set. Setting
-    /// [`Arg::multiple(true)`] would allow `-f <file> <file> <file> -f <file> <file> <file>` where
-    /// as *not* setting [`Arg::multiple(true)`] would only allow one occurrence of this argument.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("file")
-    ///     .short("f")
-    ///     .number_of_values(3)
-    /// # ;
-    /// ```
-    ///
-    /// Not supplying the correct number of values is an error
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .takes_value(true)
-    ///         .number_of_values(2)
-    ///         .short("F"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::WrongNumberOfValues);
-    /// ```
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    pub fn number_of_values(mut self, qty: u64) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        self.v.num_vals = Some(qty);
-        self
-    }
-
-    /// Allows one to perform a custom validation on the argument value. You provide a closure
-    /// which accepts a [`String`] value, and return a [`Result`] where the [`Err(String)`] is a
-    /// message displayed to the user.
-    ///
-    /// **NOTE:** The error message does *not* need to contain the `error:` portion, only the
-    /// message as all errors will appear as
-    /// `error: Invalid value for '<arg>': <YOUR MESSAGE>` where `<arg>` is replaced by the actual
-    /// arg, and `<YOUR MESSAGE>` is the `String` you return as the error.
-    ///
-    /// **NOTE:** There is a small performance hit for using validators, as they are implemented
-    /// with [`Rc`] pointers. And the value to be checked will be allocated an extra time in order
-    /// to to be passed to the closure. This performance hit is extremely minimal in the grand
-    /// scheme of things.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// fn has_at(v: String) -> Result<(), String> {
-    ///     if v.contains("@") { return Ok(()); }
-    ///     Err(String::from("The value did not contain the required @ sigil"))
-    /// }
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .index(1)
-    ///         .validator(has_at))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "some@file"
-    ///     ]);
-    /// assert!(res.is_ok());
-    /// assert_eq!(res.unwrap().value_of("file"), Some("some@file"));
-    /// ```
-    /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
-    /// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
-    /// [`Err(String)`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
-    /// [`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html
-    pub fn validator<F>(mut self, f: F) -> Self
-    where
-        F: Fn(String) -> Result<(), String> + 'static,
-    {
-        self.v.validator = Some(Rc::new(f));
-        self
-    }
-
-    /// Works identically to Validator but is intended to be used with values that could
-    /// contain non UTF-8 formatted strings.
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc = " ```ignore")]
-    #[cfg_attr(unix, doc = " ```rust")]
-    /// # use clap::{App, Arg};
-    /// # use std::ffi::{OsStr, OsString};
-    /// # use std::os::unix::ffi::OsStrExt;
-    /// fn has_ampersand(v: &OsStr) -> Result<(), OsString> {
-    ///     if v.as_bytes().iter().any(|b| *b == b'&') { return Ok(()); }
-    ///     Err(OsString::from("The value did not contain the required & sigil"))
-    /// }
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .index(1)
-    ///         .validator_os(has_ampersand))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "Fish & chips"
-    ///     ]);
-    /// assert!(res.is_ok());
-    /// assert_eq!(res.unwrap().value_of("file"), Some("Fish & chips"));
-    /// ```
-    /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
-    /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
-    /// [`OsString`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html
-    /// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
-    /// [`Err(String)`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
-    /// [`Rc`]: https://doc.rust-lang.org/std/rc/struct.Rc.html
-    pub fn validator_os<F>(mut self, f: F) -> Self
-    where
-        F: Fn(&OsStr) -> Result<(), OsString> + 'static,
-    {
-        self.v.validator_os = Some(Rc::new(f));
-        self
-    }
-
-    /// Specifies the *maximum* number of values are for this argument. For example, if you had a
-    /// `-f <file>` argument where you wanted up to 3 'files' you would set `.max_values(3)`, and
-    /// this argument would be satisfied if the user provided, 1, 2, or 3 values.
-    ///
-    /// **NOTE:** This does *not* implicitly set [`Arg::multiple(true)`]. This is because
-    /// `-o val -o val` is multiple occurrences but a single value and `-o val1 val2` is a single
-    /// occurrence with multiple values. For positional arguments this **does** set
-    /// [`Arg::multiple(true)`] because there is no way to determine the difference between multiple
-    /// occurrences and multiple values.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("file")
-    ///     .short("f")
-    ///     .max_values(3)
-    /// # ;
-    /// ```
-    ///
-    /// Supplying less than the maximum number of values is allowed
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .takes_value(true)
-    ///         .max_values(3)
-    ///         .short("F"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1", "file2"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// let m = res.unwrap();
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2"]);
-    /// ```
-    ///
-    /// Supplying more than the maximum number of values is an error
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .takes_value(true)
-    ///         .max_values(2)
-    ///         .short("F"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1", "file2", "file3"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::TooManyValues);
-    /// ```
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    pub fn max_values(mut self, qty: u64) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        self.v.max_vals = Some(qty);
-        self
-    }
-
-    /// Specifies the *minimum* number of values for this argument. For example, if you had a
-    /// `-f <file>` argument where you wanted at least 2 'files' you would set
-    /// `.min_values(2)`, and this argument would be satisfied if the user provided, 2 or more
-    /// values.
-    ///
-    /// **NOTE:** This does not implicitly set [`Arg::multiple(true)`]. This is because
-    /// `-o val -o val` is multiple occurrences but a single value and `-o val1 val2` is a single
-    /// occurrence with multiple values. For positional arguments this **does** set
-    /// [`Arg::multiple(true)`] because there is no way to determine the difference between multiple
-    /// occurrences and multiple values.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("file")
-    ///     .short("f")
-    ///     .min_values(3)
-    /// # ;
-    /// ```
-    ///
-    /// Supplying more than the minimum number of values is allowed
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .takes_value(true)
-    ///         .min_values(2)
-    ///         .short("F"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1", "file2", "file3"
-    ///     ]);
-    ///
-    /// assert!(res.is_ok());
-    /// let m = res.unwrap();
-    /// let files: Vec<_> = m.values_of("file").unwrap().collect();
-    /// assert_eq!(files, ["file1", "file2", "file3"]);
-    /// ```
-    ///
-    /// Supplying less than the minimum number of values is an error
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("file")
-    ///         .takes_value(true)
-    ///         .min_values(2)
-    ///         .short("F"))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-F", "file1"
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::TooFewValues);
-    /// ```
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    pub fn min_values(mut self, qty: u64) -> Self {
-        self.v.min_vals = Some(qty);
-        self.set(ArgSettings::TakesValue)
-    }
-
-    /// Specifies whether or not an argument should allow grouping of multiple values via a
-    /// delimiter. I.e. should `--option=val1,val2,val3` be parsed as three values (`val1`, `val2`,
-    /// and `val3`) or as a single value (`val1,val2,val3`). Defaults to using `,` (comma) as the
-    /// value delimiter for all arguments that accept values (options and positional arguments)
-    ///
-    /// **NOTE:** The default is `false`. When set to `true` the default [`Arg::value_delimiter`]
-    /// is the comma `,`.
-    ///
-    /// # Examples
-    ///
-    /// The following example shows the default behavior.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let delims = App::new("prog")
-    ///     .arg(Arg::with_name("option")
-    ///         .long("option")
-    ///         .use_delimiter(true)
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--option=val1,val2,val3",
-    ///     ]);
-    ///
-    /// assert!(delims.is_present("option"));
-    /// assert_eq!(delims.occurrences_of("option"), 1);
-    /// assert_eq!(delims.values_of("option").unwrap().collect::<Vec<_>>(), ["val1", "val2", "val3"]);
-    /// ```
-    /// The next example shows the difference when turning delimiters off. This is the default
-    /// behavior
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let nodelims = App::new("prog")
-    ///     .arg(Arg::with_name("option")
-    ///         .long("option")
-    ///         .use_delimiter(false)
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--option=val1,val2,val3",
-    ///     ]);
-    ///
-    /// assert!(nodelims.is_present("option"));
-    /// assert_eq!(nodelims.occurrences_of("option"), 1);
-    /// assert_eq!(nodelims.value_of("option").unwrap(), "val1,val2,val3");
-    /// ```
-    /// [`Arg::value_delimiter`]: ./struct.Arg.html#method.value_delimiter
-    pub fn use_delimiter(mut self, d: bool) -> Self {
-        if d {
-            if self.v.val_delim.is_none() {
-                self.v.val_delim = Some(',');
-            }
-            self.setb(ArgSettings::TakesValue);
-            self.setb(ArgSettings::UseValueDelimiter);
-            self.unset(ArgSettings::ValueDelimiterNotSet)
-        } else {
-            self.v.val_delim = None;
-            self.unsetb(ArgSettings::UseValueDelimiter);
-            self.unset(ArgSettings::ValueDelimiterNotSet)
-        }
-    }
-
-    /// Specifies that *multiple values* may only be set using the delimiter. This means if an
-    /// if an option is encountered, and no delimiter is found, it automatically assumed that no
-    /// additional values for that option follow. This is unlike the default, where it is generally
-    /// assumed that more values will follow regardless of whether or not a delimiter is used.
-    ///
-    /// **NOTE:** The default is `false`.
-    ///
-    /// **NOTE:** Setting this to true implies [`Arg::use_delimiter(true)`]
-    ///
-    /// **NOTE:** It's a good idea to inform the user that use of a delimiter is required, either
-    /// through help text or other means.
-    ///
-    /// # Examples
-    ///
-    /// These examples demonstrate what happens when `require_delimiter(true)` is used. Notice
-    /// everything works in this first example, as we use a delimiter, as expected.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let delims = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .multiple(true)
-    ///         .require_delimiter(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-o", "val1,val2,val3",
-    ///     ]);
-    ///
-    /// assert!(delims.is_present("opt"));
-    /// assert_eq!(delims.values_of("opt").unwrap().collect::<Vec<_>>(), ["val1", "val2", "val3"]);
-    /// ```
-    /// In this next example, we will *not* use a delimiter. Notice it's now an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .multiple(true)
-    ///         .require_delimiter(true))
-    ///     .get_matches_from_safe(vec![
-    ///         "prog", "-o", "val1", "val2", "val3",
-    ///     ]);
-    ///
-    /// assert!(res.is_err());
-    /// let err = res.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::UnknownArgument);
-    /// ```
-    /// What's happening is `-o` is getting `val1`, and because delimiters are required yet none
-    /// were present, it stops parsing `-o`. At this point it reaches `val2` and because no
-    /// positional arguments have been defined, it's an error of an unexpected argument.
-    ///
-    /// In this final example, we contrast the above with `clap`'s default behavior where the above
-    /// is *not* an error.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let delims = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .multiple(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-o", "val1", "val2", "val3",
-    ///     ]);
-    ///
-    /// assert!(delims.is_present("opt"));
-    /// assert_eq!(delims.values_of("opt").unwrap().collect::<Vec<_>>(), ["val1", "val2", "val3"]);
-    /// ```
-    /// [`Arg::use_delimiter(true)`]: ./struct.Arg.html#method.use_delimiter
-    pub fn require_delimiter(mut self, d: bool) -> Self {
-        if d {
-            self = self.use_delimiter(true);
-            self.unsetb(ArgSettings::ValueDelimiterNotSet);
-            self.setb(ArgSettings::UseValueDelimiter);
-            self.set(ArgSettings::RequireDelimiter)
-        } else {
-            self = self.use_delimiter(false);
-            self.unsetb(ArgSettings::UseValueDelimiter);
-            self.unset(ArgSettings::RequireDelimiter)
-        }
-    }
-
-    /// Specifies the separator to use when values are clumped together, defaults to `,` (comma).
-    ///
-    /// **NOTE:** implicitly sets [`Arg::use_delimiter(true)`]
-    ///
-    /// **NOTE:** implicitly sets [`Arg::takes_value(true)`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("config")
-    ///         .short("c")
-    ///         .long("config")
-    ///         .value_delimiter(";"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--config=val1;val2;val3"
-    ///     ]);
-    ///
-    /// assert_eq!(m.values_of("config").unwrap().collect::<Vec<_>>(), ["val1", "val2", "val3"])
-    /// ```
-    /// [`Arg::use_delimiter(true)`]: ./struct.Arg.html#method.use_delimiter
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    pub fn value_delimiter(mut self, d: &str) -> Self {
-        self.unsetb(ArgSettings::ValueDelimiterNotSet);
-        self.setb(ArgSettings::TakesValue);
-        self.setb(ArgSettings::UseValueDelimiter);
-        self.v.val_delim = Some(
-            d.chars()
-                .nth(0)
-                .expect("Failed to get value_delimiter from arg"),
-        );
-        self
-    }
-
-    /// Specify multiple names for values of option arguments. These names are cosmetic only, used
-    /// for help and usage strings only. The names are **not** used to access arguments. The values
-    /// of the arguments are accessed in numeric order (i.e. if you specify two names `one` and
-    /// `two` `one` will be the first matched value, `two` will be the second).
-    ///
-    /// This setting can be very helpful when describing the type of input the user should be
-    /// using, such as `FILE`, `INTERFACE`, etc. Although not required, it's somewhat convention to
-    /// use all capital letters for the value name.
-    ///
-    /// **Pro Tip:** It may help to use [`Arg::next_line_help(true)`] if there are long, or
-    /// multiple value names in order to not throw off the help text alignment of all options.
-    ///
-    /// **NOTE:** This implicitly sets [`Arg::number_of_values`] if the number of value names is
-    /// greater than one. I.e. be aware that the number of "names" you set for the values, will be
-    /// the *exact* number of values required to satisfy this argument
-    ///
-    /// **NOTE:** implicitly sets [`Arg::takes_value(true)`]
-    ///
-    /// **NOTE:** Does *not* require or imply [`Arg::multiple(true)`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("speed")
-    ///     .short("s")
-    ///     .value_names(&["fast", "slow"])
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("io")
-    ///         .long("io-files")
-    ///         .value_names(&["INFILE", "OUTFILE"]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    /// Running the above program produces the following output
-    ///
-    /// ```notrust
-    /// valnames
-    ///
-    /// USAGE:
-    ///    valnames [FLAGS] [OPTIONS]
-    ///
-    /// FLAGS:
-    ///     -h, --help       Prints help information
-    ///     -V, --version    Prints version information
-    ///
-    /// OPTIONS:
-    ///     --io-files <INFILE> <OUTFILE>    Some help text
-    /// ```
-    /// [`Arg::next_line_help(true)`]: ./struct.Arg.html#method.next_line_help
-    /// [`Arg::number_of_values`]: ./struct.Arg.html#method.number_of_values
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    pub fn value_names(mut self, names: &[&'b str]) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        if self.is_set(ArgSettings::ValueDelimiterNotSet) {
-            self.unsetb(ArgSettings::ValueDelimiterNotSet);
-            self.setb(ArgSettings::UseValueDelimiter);
-        }
-        if let Some(ref mut vals) = self.v.val_names {
-            let mut l = vals.len();
-            for s in names {
-                vals.insert(l, s);
-                l += 1;
-            }
-        } else {
-            let mut vm = VecMap::new();
-            for (i, n) in names.iter().enumerate() {
-                vm.insert(i, *n);
-            }
-            self.v.val_names = Some(vm);
-        }
-        self
-    }
-
-    /// Specifies the name for value of [option] or [positional] arguments inside of help
-    /// documentation. This name is cosmetic only, the name is **not** used to access arguments.
-    /// This setting can be very helpful when describing the type of input the user should be
-    /// using, such as `FILE`, `INTERFACE`, etc. Although not required, it's somewhat convention to
-    /// use all capital letters for the value name.
-    ///
-    /// **NOTE:** implicitly sets [`Arg::takes_value(true)`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("cfg")
-    ///     .long("config")
-    ///     .value_name("FILE")
-    /// # ;
-    /// ```
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("config")
-    ///         .long("config")
-    ///         .value_name("FILE"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    /// Running the above program produces the following output
-    ///
-    /// ```notrust
-    /// valnames
-    ///
-    /// USAGE:
-    ///    valnames [FLAGS] [OPTIONS]
-    ///
-    /// FLAGS:
-    ///     -h, --help       Prints help information
-    ///     -V, --version    Prints version information
-    ///
-    /// OPTIONS:
-    ///     --config <FILE>     Some help text
-    /// ```
-    /// [option]: ./struct.Arg.html#method.takes_value
-    /// [positional]: ./struct.Arg.html#method.index
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    pub fn value_name(mut self, name: &'b str) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        if let Some(ref mut vals) = self.v.val_names {
-            let l = vals.len();
-            vals.insert(l, name);
-        } else {
-            let mut vm = VecMap::new();
-            vm.insert(0, name);
-            self.v.val_names = Some(vm);
-        }
-        self
-    }
-
-    /// Specifies the value of the argument when *not* specified at runtime.
-    ///
-    /// **NOTE:** If the user *does not* use this argument at runtime, [`ArgMatches::occurrences_of`]
-    /// will return `0` even though the [`ArgMatches::value_of`] will return the default specified.
-    ///
-    /// **NOTE:** If the user *does not* use this argument at runtime [`ArgMatches::is_present`] will
-    /// still return `true`. If you wish to determine whether the argument was used at runtime or
-    /// not, consider [`ArgMatches::occurrences_of`] which will return `0` if the argument was *not*
-    /// used at runtime.
-    ///
-    /// **NOTE:** This setting is perfectly compatible with [`Arg::default_value_if`] but slightly
-    /// different. `Arg::default_value` *only* takes affect when the user has not provided this arg
-    /// at runtime. `Arg::default_value_if` however only takes affect when the user has not provided
-    /// a value at runtime **and** these other conditions are met as well. If you have set
-    /// `Arg::default_value` and `Arg::default_value_if`, and the user **did not** provide a this
-    /// arg at runtime, nor did were the conditions met for `Arg::default_value_if`, the
-    /// `Arg::default_value` will be applied.
-    ///
-    /// **NOTE:** This implicitly sets [`Arg::takes_value(true)`].
-    ///
-    /// **NOTE:** This setting effectively disables `AppSettings::ArgRequiredElseHelp` if used in
-    /// conjunction as it ensures that some argument will always be present.
-    ///
-    /// # Examples
-    ///
-    /// First we use the default value without providing any value at runtime.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("myopt")
-    ///         .default_value("myval"))
-    ///     .get_matches_from(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("opt"), Some("myval"));
-    /// assert!(m.is_present("opt"));
-    /// assert_eq!(m.occurrences_of("opt"), 0);
-    /// ```
-    ///
-    /// Next we provide a value at runtime to override the default.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("myopt")
-    ///         .default_value("myval"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--myopt=non_default"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("opt"), Some("non_default"));
-    /// assert!(m.is_present("opt"));
-    /// assert_eq!(m.occurrences_of("opt"), 1);
-    /// ```
-    /// [`ArgMatches::occurrences_of`]: ./struct.ArgMatches.html#method.occurrences_of
-    /// [`ArgMatches::value_of`]: ./struct.ArgMatches.html#method.value_of
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`ArgMatches::is_present`]: ./struct.ArgMatches.html#method.is_present
-    /// [`Arg::default_value_if`]: ./struct.Arg.html#method.default_value_if
-    pub fn default_value(self, val: &'a str) -> Self {
-        self.default_value_os(OsStr::from_bytes(val.as_bytes()))
-    }
-
-    /// Provides a default value in the exact same manner as [`Arg::default_value`]
-    /// only using [`OsStr`]s instead.
-    /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
-    /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
-    pub fn default_value_os(mut self, val: &'a OsStr) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        self.v.default_val = Some(val);
-        self
-    }
-
-    /// Specifies the value of the argument if `arg` has been used at runtime. If `val` is set to
-    /// `None`, `arg` only needs to be present. If `val` is set to `"some-val"` then `arg` must be
-    /// present at runtime **and** have the value `val`.
-    ///
-    /// **NOTE:** This setting is perfectly compatible with [`Arg::default_value`] but slightly
-    /// different. `Arg::default_value` *only* takes affect when the user has not provided this arg
-    /// at runtime. This setting however only takes affect when the user has not provided a value at
-    /// runtime **and** these other conditions are met as well. If you have set `Arg::default_value`
-    /// and `Arg::default_value_if`, and the user **did not** provide a this arg at runtime, nor did
-    /// were the conditions met for `Arg::default_value_if`, the `Arg::default_value` will be
-    /// applied.
-    ///
-    /// **NOTE:** This implicitly sets [`Arg::takes_value(true)`].
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows (`None` can be represented
-    /// as `null` in YAML)
-    ///
-    /// ```yaml
-    /// default_value_if:
-    ///     - [arg, val, default]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// First we use the default value only if another arg is present at runtime.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_if("flag", None, "default"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--flag"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), Some("default"));
-    /// ```
-    ///
-    /// Next we run the same test, but without providing `--flag`.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_if("flag", None, "default"))
-    ///     .get_matches_from(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), None);
-    /// ```
-    ///
-    /// Now lets only use the default value if `--opt` contains the value `special`.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .takes_value(true)
-    ///         .long("opt"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_if("opt", Some("special"), "default"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--opt", "special"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), Some("default"));
-    /// ```
-    ///
-    /// We can run the same test and provide any value *other than* `special` and we won't get a
-    /// default value.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .takes_value(true)
-    ///         .long("opt"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_if("opt", Some("special"), "default"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--opt", "hahaha"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), None);
-    /// ```
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
-    pub fn default_value_if(self, arg: &'a str, val: Option<&'b str>, default: &'b str) -> Self {
-        self.default_value_if_os(
-            arg,
-            val.map(str::as_bytes).map(OsStr::from_bytes),
-            OsStr::from_bytes(default.as_bytes()),
-        )
-    }
-
-    /// Provides a conditional default value in the exact same manner as [`Arg::default_value_if`]
-    /// only using [`OsStr`]s instead.
-    /// [`Arg::default_value_if`]: ./struct.Arg.html#method.default_value_if
-    /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
-    pub fn default_value_if_os(
-        mut self,
-        arg: &'a str,
-        val: Option<&'b OsStr>,
-        default: &'b OsStr,
-    ) -> Self {
-        self.setb(ArgSettings::TakesValue);
-        if let Some(ref mut vm) = self.v.default_vals_ifs {
-            let l = vm.len();
-            vm.insert(l, (arg, val, default));
-        } else {
-            let mut vm = VecMap::new();
-            vm.insert(0, (arg, val, default));
-            self.v.default_vals_ifs = Some(vm);
-        }
-        self
-    }
-
-    /// Specifies multiple values and conditions in the same manner as [`Arg::default_value_if`].
-    /// The method takes a slice of tuples in the `(arg, Option<val>, default)` format.
-    ///
-    /// **NOTE**: The conditions are stored in order and evaluated in the same order. I.e. the first
-    /// if multiple conditions are true, the first one found will be applied and the ultimate value.
-    ///
-    /// **NOTE:** If using YAML the values should be laid out as follows
-    ///
-    /// ```yaml
-    /// default_value_if:
-    ///     - [arg, val, default]
-    ///     - [arg2, null, default2]
-    /// ```
-    ///
-    /// # Examples
-    ///
-    /// First we use the default value only if another arg is present at runtime.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag"))
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("opt")
-    ///         .takes_value(true))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_ifs(&[
-    ///             ("flag", None, "default"),
-    ///             ("opt", Some("channal"), "chan"),
-    ///         ]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--opt", "channal"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), Some("chan"));
-    /// ```
-    ///
-    /// Next we run the same test, but without providing `--flag`.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag"))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_ifs(&[
-    ///             ("flag", None, "default"),
-    ///             ("opt", Some("channal"), "chan"),
-    ///         ]))
-    ///     .get_matches_from(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), None);
-    /// ```
-    ///
-    /// We can also see that these values are applied in order, and if more than one condition is
-    /// true, only the first evaluated "wins"
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag"))
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("opt")
-    ///         .takes_value(true))
-    ///     .arg(Arg::with_name("other")
-    ///         .long("other")
-    ///         .default_value_ifs(&[
-    ///             ("flag", None, "default"),
-    ///             ("opt", Some("channal"), "chan"),
-    ///         ]))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--opt", "channal", "--flag"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("other"), Some("default"));
-    /// ```
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`Arg::default_value`]: ./struct.Arg.html#method.default_value
-    pub fn default_value_ifs(mut self, ifs: &[(&'a str, Option<&'b str>, &'b str)]) -> Self {
-        for &(arg, val, default) in ifs {
-            self = self.default_value_if_os(
-                arg,
-                val.map(str::as_bytes).map(OsStr::from_bytes),
-                OsStr::from_bytes(default.as_bytes()),
-            );
-        }
-        self
-    }
-
-    /// Provides multiple conditional default values in the exact same manner as
-    /// [`Arg::default_value_ifs`] only using [`OsStr`]s instead.
-    /// [`Arg::default_value_ifs`]: ./struct.Arg.html#method.default_value_ifs
-    /// [`OsStr`]: https://doc.rust-lang.org/std/ffi/struct.OsStr.html
-    #[cfg_attr(feature = "lints", allow(explicit_counter_loop))]
-    pub fn default_value_ifs_os(mut self, ifs: &[(&'a str, Option<&'b OsStr>, &'b OsStr)]) -> Self {
-        for &(arg, val, default) in ifs {
-            self = self.default_value_if_os(arg, val, default);
-        }
-        self
-    }
-
-    /// Specifies that if the value is not passed in as an argument, that it should be retrieved
-    /// from the environment, if available. If it is not present in the environment, then default
-    /// rules will apply.
-    ///
-    /// **NOTE:** If the user *does not* use this argument at runtime, [`ArgMatches::occurrences_of`]
-    /// will return `0` even though the [`ArgMatches::value_of`] will return the default specified.
-    ///
-    /// **NOTE:** If the user *does not* use this argument at runtime [`ArgMatches::is_present`] will
-    /// return `true` if the variable is present in the environment . If you wish to determine whether
-    /// the argument was used at runtime or not, consider [`ArgMatches::occurrences_of`] which will
-    /// return `0` if the argument was *not* used at runtime.
-    ///
-    /// **NOTE:** This implicitly sets [`Arg::takes_value(true)`].
-    ///
-    /// **NOTE:** If [`Arg::multiple(true)`] is set then [`Arg::use_delimiter(true)`] should also be
-    /// set. Otherwise, only a single argument will be returned from the environment variable. The
-    /// default delimiter is `,` and follows all the other delimiter rules.
-    ///
-    /// # Examples
-    ///
-    /// In this example, we show the variable coming from the environment:
-    ///
-    /// ```rust
-    /// # use std::env;
-    /// # use clap::{App, Arg};
-    ///
-    /// env::set_var("MY_FLAG", "env");
-    ///
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag")
-    ///         .env("MY_FLAG"))
-    ///     .get_matches_from(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("flag"), Some("env"));
-    /// ```
-    ///
-    /// In this example, we show the variable coming from an option on the CLI:
-    ///
-    /// ```rust
-    /// # use std::env;
-    /// # use clap::{App, Arg};
-    ///
-    /// env::set_var("MY_FLAG", "env");
-    ///
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag")
-    ///         .env("MY_FLAG"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--flag", "opt"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("flag"), Some("opt"));
-    /// ```
-    ///
-    /// In this example, we show the variable coming from the environment even with the
-    /// presence of a default:
-    ///
-    /// ```rust
-    /// # use std::env;
-    /// # use clap::{App, Arg};
-    ///
-    /// env::set_var("MY_FLAG", "env");
-    ///
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag")
-    ///         .env("MY_FLAG")
-    ///         .default_value("default"))
-    ///     .get_matches_from(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert_eq!(m.value_of("flag"), Some("env"));
-    /// ```
-    ///
-    /// In this example, we show the use of multiple values in a single environment variable:
-    ///
-    /// ```rust
-    /// # use std::env;
-    /// # use clap::{App, Arg};
-    ///
-    /// env::set_var("MY_FLAG_MULTI", "env1,env2");
-    ///
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .long("flag")
-    ///         .env("MY_FLAG_MULTI")
-    ///         .multiple(true)
-    ///         .use_delimiter(true))
-    ///     .get_matches_from(vec![
-    ///         "prog"
-    ///     ]);
-    ///
-    /// assert_eq!(m.values_of("flag").unwrap().collect::<Vec<_>>(), vec!["env1", "env2"]);
-    /// ```
-    /// [`ArgMatches::occurrences_of`]: ./struct.ArgMatches.html#method.occurrences_of
-    /// [`ArgMatches::value_of`]: ./struct.ArgMatches.html#method.value_of
-    /// [`ArgMatches::is_present`]: ./struct.ArgMatches.html#method.is_present
-    /// [`Arg::takes_value(true)`]: ./struct.Arg.html#method.takes_value
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    /// [`Arg::use_delimiter(true)`]: ./struct.Arg.html#method.use_delimiter
-    pub fn env(self, name: &'a str) -> Self {
-        self.env_os(OsStr::new(name))
-    }
-
-    /// Specifies that if the value is not passed in as an argument, that it should be retrieved
-    /// from the environment if available in the exact same manner as [`Arg::env`] only using
-    /// [`OsStr`]s instead.
-    pub fn env_os(mut self, name: &'a OsStr) -> Self {
-        self.setb(ArgSettings::TakesValue);
-
-        self.v.env = Some((name, env::var_os(name)));
-        self
-    }
-
-    /// @TODO @p2 @docs @release: write docs
-    pub fn hide_env_values(self, hide: bool) -> Self {
-        if hide {
-            self.set(ArgSettings::HideEnvValues)
-        } else {
-            self.unset(ArgSettings::HideEnvValues)
-        }
-    }
-
-    /// When set to `true` the help string will be displayed on the line after the argument and
-    /// indented once. This can be helpful for arguments with very long or complex help messages.
-    /// This can also be helpful for arguments with very long flag names, or many/long value names.
-    ///
-    /// **NOTE:** To apply this setting to all arguments consider using
-    /// [`AppSettings::NextLineHelp`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("opt")
-    ///         .long("long-option-flag")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .value_names(&["value1", "value2"])
-    ///         .help("Some really long help and complex\n\
-    ///                help that makes more sense to be\n\
-    ///                on a line after the option")
-    ///         .next_line_help(true))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays the following help message
-    ///
-    /// ```notrust
-    /// nlh
-    ///
-    /// USAGE:
-    ///     nlh [FLAGS] [OPTIONS]
-    ///
-    /// FLAGS:
-    ///     -h, --help       Prints help information
-    ///     -V, --version    Prints version information
-    ///
-    /// OPTIONS:
-    ///     -o, --long-option-flag <value1> <value2>
-    ///         Some really long help and complex
-    ///         help that makes more sense to be
-    ///         on a line after the option
-    /// ```
-    /// [`AppSettings::NextLineHelp`]: ./enum.AppSettings.html#variant.NextLineHelp
-    pub fn next_line_help(mut self, nlh: bool) -> Self {
-        if nlh {
-            self.setb(ArgSettings::NextLineHelp);
-        } else {
-            self.unsetb(ArgSettings::NextLineHelp);
-        }
-        self
-    }
-
-    /// Allows custom ordering of args within the help message. Args with a lower value will be
-    /// displayed first in the help message. This is helpful when one would like to emphasise
-    /// frequently used args, or prioritize those towards the top of the list. Duplicate values
-    /// **are** allowed. Args with duplicate display orders will be displayed in alphabetical
-    /// order.
-    ///
-    /// **NOTE:** The default is 999 for all arguments.
-    ///
-    /// **NOTE:** This setting is ignored for [positional arguments] which are always displayed in
-    /// [index] order.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("a") // Typically args are grouped alphabetically by name.
-    ///                              // Args without a display_order have a value of 999 and are
-    ///                              // displayed alphabetically with all other 999 valued args.
-    ///         .long("long-option")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .help("Some help and text"))
-    ///     .arg(Arg::with_name("b")
-    ///         .long("other-option")
-    ///         .short("O")
-    ///         .takes_value(true)
-    ///         .display_order(1)   // In order to force this arg to appear *first*
-    ///                             // all we have to do is give it a value lower than 999.
-    ///                             // Any other args with a value of 1 will be displayed
-    ///                             // alphabetically with this one...then 2 values, then 3, etc.
-    ///         .help("I should be first!"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays the following help message
-    ///
-    /// ```notrust
-    /// cust-ord
-    ///
-    /// USAGE:
-    ///     cust-ord [FLAGS] [OPTIONS]
-    ///
-    /// FLAGS:
-    ///     -h, --help       Prints help information
-    ///     -V, --version    Prints version information
-    ///
-    /// OPTIONS:
-    ///     -O, --other-option <b>    I should be first!
-    ///     -o, --long-option <a>     Some help and text
-    /// ```
-    /// [positional arguments]: ./struct.Arg.html#method.index
-    /// [index]: ./struct.Arg.html#method.index
-    pub fn display_order(mut self, ord: usize) -> Self {
-        self.s.disp_ord = ord;
-        self
-    }
-
-    /// Indicates that all parameters passed after this should not be parsed
-    /// individually, but rather passed in their entirety. It is worth noting
-    /// that setting this requires all values to come after a `--` to indicate they
-    /// should all be captured. For example:
-    ///
-    /// ```notrust
-    /// --foo something -- -v -v -v -b -b -b --baz -q -u -x
-    /// ```
-    /// Will result in everything after `--` to be considered one raw argument. This behavior
-    /// may not be exactly what you are expecting and using [`AppSettings::TrailingVarArg`]
-    /// may be more appropriate.
-    ///
-    /// **NOTE:** Implicitly sets [`Arg::multiple(true)`], [`Arg::allow_hyphen_values(true)`], and
-    /// [`Arg::last(true)`] when set to `true`
-    ///
-    /// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-    /// [`Arg::allow_hyphen_values(true)`]: ./struct.Arg.html#method.allow_hyphen_values
-    /// [`Arg::last(true)`]: ./struct.Arg.html#method.last
-    /// [`AppSettings::TrailingVarArg`]: ./enum.AppSettings.html#variant.TrailingVarArg
-    pub fn raw(self, raw: bool) -> Self {
-        self.multiple(raw).allow_hyphen_values(raw).last(raw)
-    }
-
-    /// Hides an argument from short help message output.
-    ///
-    /// **NOTE:** This does **not** hide the argument from usage strings on error
-    ///
-    /// **NOTE:** Setting this option will cause next-line-help output style to be used
-    /// when long help (`--help`) is called.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .hidden_short_help(true)
-    /// # ;
-    /// ```
-    /// Setting `hidden_short_help(true)` will hide the argument when displaying short help text
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .hidden_short_help(true)
-    ///         .help("Some help text describing the --config arg"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-h"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays
-    ///
-    /// ```notrust
-    /// helptest
-    ///
-    /// USAGE:
-    ///    helptest [FLAGS]
-    ///
-    /// FLAGS:
-    /// -h, --help       Prints help information
-    /// -V, --version    Prints version information
-    /// ```
-    ///
-    /// However, when --help is called
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .hidden_short_help(true)
-    ///         .help("Some help text describing the --config arg"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// Then the following would be displayed
-    ///
-    /// ```notrust
-    /// helptest
-    ///
-    /// USAGE:
-    ///    helptest [FLAGS]
-    ///
-    /// FLAGS:
-    ///     --config     Some help text describing the --config arg
-    /// -h, --help       Prints help information
-    /// -V, --version    Prints version information
-    /// ```
-    pub fn hidden_short_help(self, hide: bool) -> Self {
-        if hide {
-            self.set(ArgSettings::HiddenShortHelp)
-        } else {
-            self.unset(ArgSettings::HiddenShortHelp)
-        }
-    }
-
-    /// Hides an argument from long help message output.
-    ///
-    /// **NOTE:** This does **not** hide the argument from usage strings on error
-    ///
-    /// **NOTE:** Setting this option will cause next-line-help output style to be used
-    /// when long help (`--help`) is called.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// Arg::with_name("debug")
-    ///     .hidden_long_help(true)
-    /// # ;
-    /// ```
-    /// Setting `hidden_long_help(true)` will hide the argument when displaying long help text
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .hidden_long_help(true)
-    ///         .help("Some help text describing the --config arg"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "--help"
-    ///     ]);
-    /// ```
-    ///
-    /// The above example displays
-    ///
-    /// ```notrust
-    /// helptest
-    ///
-    /// USAGE:
-    ///    helptest [FLAGS]
-    ///
-    /// FLAGS:
-    /// -h, --help       Prints help information
-    /// -V, --version    Prints version information
-    /// ```
-    ///
-    /// However, when -h is called
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("prog")
-    ///     .arg(Arg::with_name("cfg")
-    ///         .long("config")
-    ///         .hidden_long_help(true)
-    ///         .help("Some help text describing the --config arg"))
-    ///     .get_matches_from(vec![
-    ///         "prog", "-h"
-    ///     ]);
-    /// ```
-    ///
-    /// Then the following would be displayed
-    ///
-    /// ```notrust
-    /// helptest
-    ///
-    /// USAGE:
-    ///    helptest [FLAGS]
-    ///
-    /// FLAGS:
-    ///     --config     Some help text describing the --config arg
-    /// -h, --help       Prints help information
-    /// -V, --version    Prints version information
-    /// ```
-    pub fn hidden_long_help(self, hide: bool) -> Self {
-        if hide {
-            self.set(ArgSettings::HiddenLongHelp)
-        } else {
-            self.unset(ArgSettings::HiddenLongHelp)
-        }
-    }
-
-    /// Checks if one of the [`ArgSettings`] settings is set for the argument.
-    ///
-    /// [`ArgSettings`]: ./enum.ArgSettings.html
-    pub fn is_set(&self, s: ArgSettings) -> bool {
-        self.b.is_set(s)
-    }
-
-    /// Sets one of the [`ArgSettings`] settings for the argument.
-    ///
-    /// [`ArgSettings`]: ./enum.ArgSettings.html
-    pub fn set(mut self, s: ArgSettings) -> Self {
-        self.setb(s);
-        self
-    }
-
-    /// Unsets one of the [`ArgSettings`] settings for the argument.
-    ///
-    /// [`ArgSettings`]: ./enum.ArgSettings.html
-    pub fn unset(mut self, s: ArgSettings) -> Self {
-        self.unsetb(s);
-        self
-    }
-
-    #[doc(hidden)]
-    pub fn setb(&mut self, s: ArgSettings) {
-        self.b.set(s);
-    }
-
-    #[doc(hidden)]
-    pub fn unsetb(&mut self, s: ArgSettings) {
-        self.b.unset(s);
-    }
-}
-
-impl<'a, 'b, 'z> From<&'z Arg<'a, 'b>> for Arg<'a, 'b> {
-    fn from(a: &'z Arg<'a, 'b>) -> Self {
-        Arg {
-            b: a.b.clone(),
-            v: a.v.clone(),
-            s: a.s.clone(),
-            index: a.index,
-            r_ifs: a.r_ifs.clone(),
-        }
-    }
-}
-
-impl<'n, 'e> PartialEq for Arg<'n, 'e> {
-    fn eq(&self, other: &Arg<'n, 'e>) -> bool {
-        self.b == other.b
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/arg_builder/base.rs b/third_party/rust/clap/v2/crate/src/args/arg_builder/base.rs
deleted file mode 100644
index cc8de728..0000000
--- a/third_party/rust/clap/v2/crate/src/args/arg_builder/base.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-use args::{Arg, ArgFlags, ArgSettings};
-
-#[derive(Debug, Clone, Default)]
-pub struct Base<'a, 'b>
-where
-    'a: 'b,
-{
-    pub name: &'a str,
-    pub help: Option<&'b str>,
-    pub long_help: Option<&'b str>,
-    pub blacklist: Option<Vec<&'a str>>,
-    pub settings: ArgFlags,
-    pub r_unless: Option<Vec<&'a str>>,
-    pub overrides: Option<Vec<&'a str>>,
-    pub groups: Option<Vec<&'a str>>,
-    pub requires: Option<Vec<(Option<&'b str>, &'a str)>>,
-}
-
-impl<'n, 'e> Base<'n, 'e> {
-    pub fn new(name: &'n str) -> Self {
-        Base {
-            name: name,
-            ..Default::default()
-        }
-    }
-
-    pub fn set(&mut self, s: ArgSettings) {
-        self.settings.set(s);
-    }
-    pub fn unset(&mut self, s: ArgSettings) {
-        self.settings.unset(s);
-    }
-    pub fn is_set(&self, s: ArgSettings) -> bool {
-        self.settings.is_set(s)
-    }
-}
-
-impl<'n, 'e, 'z> From<&'z Arg<'n, 'e>> for Base<'n, 'e> {
-    fn from(a: &'z Arg<'n, 'e>) -> Self {
-        a.b.clone()
-    }
-}
-
-impl<'n, 'e> PartialEq for Base<'n, 'e> {
-    fn eq(&self, other: &Base<'n, 'e>) -> bool {
-        self.name == other.name
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/arg_builder/flag.rs b/third_party/rust/clap/v2/crate/src/args/arg_builder/flag.rs
deleted file mode 100644
index 4b922312..0000000
--- a/third_party/rust/clap/v2/crate/src/args/arg_builder/flag.rs
+++ /dev/null
@@ -1,211 +0,0 @@
-// Std
-use std::convert::From;
-use std::ffi::{OsStr, OsString};
-use std::fmt::{Display, Formatter, Result};
-use std::mem;
-use std::rc::Rc;
-use std::result::Result as StdResult;
-
-// Internal
-use args::{AnyArg, ArgSettings, Base, DispOrder, Switched};
-use map::{self, VecMap};
-use Arg;
-
-#[derive(Default, Clone, Debug)]
-#[doc(hidden)]
-pub struct FlagBuilder<'n, 'e>
-where
-    'n: 'e,
-{
-    pub b: Base<'n, 'e>,
-    pub s: Switched<'e>,
-}
-
-impl<'n, 'e> FlagBuilder<'n, 'e> {
-    pub fn new(name: &'n str) -> Self {
-        FlagBuilder {
-            b: Base::new(name),
-            ..Default::default()
-        }
-    }
-}
-
-impl<'a, 'b, 'z> From<&'z Arg<'a, 'b>> for FlagBuilder<'a, 'b> {
-    fn from(a: &'z Arg<'a, 'b>) -> Self {
-        FlagBuilder {
-            b: Base::from(a),
-            s: Switched::from(a),
-        }
-    }
-}
-
-impl<'a, 'b> From<Arg<'a, 'b>> for FlagBuilder<'a, 'b> {
-    fn from(mut a: Arg<'a, 'b>) -> Self {
-        FlagBuilder {
-            b: mem::replace(&mut a.b, Base::default()),
-            s: mem::replace(&mut a.s, Switched::default()),
-        }
-    }
-}
-
-impl<'n, 'e> Display for FlagBuilder<'n, 'e> {
-    fn fmt(&self, f: &mut Formatter) -> Result {
-        if let Some(l) = self.s.long {
-            write!(f, "--{}", l)?;
-        } else {
-            write!(f, "-{}", self.s.short.unwrap())?;
-        }
-
-        Ok(())
-    }
-}
-
-impl<'n, 'e> AnyArg<'n, 'e> for FlagBuilder<'n, 'e> {
-    fn name(&self) -> &'n str {
-        self.b.name
-    }
-    fn overrides(&self) -> Option<&[&'e str]> {
-        self.b.overrides.as_ref().map(|o| &o[..])
-    }
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]> {
-        self.b.requires.as_ref().map(|o| &o[..])
-    }
-    fn blacklist(&self) -> Option<&[&'e str]> {
-        self.b.blacklist.as_ref().map(|o| &o[..])
-    }
-    fn required_unless(&self) -> Option<&[&'e str]> {
-        self.b.r_unless.as_ref().map(|o| &o[..])
-    }
-    fn is_set(&self, s: ArgSettings) -> bool {
-        self.b.settings.is_set(s)
-    }
-    fn has_switch(&self) -> bool {
-        true
-    }
-    fn takes_value(&self) -> bool {
-        false
-    }
-    fn set(&mut self, s: ArgSettings) {
-        self.b.settings.set(s)
-    }
-    fn max_vals(&self) -> Option<u64> {
-        None
-    }
-    fn val_names(&self) -> Option<&VecMap<&'e str>> {
-        None
-    }
-    fn num_vals(&self) -> Option<u64> {
-        None
-    }
-    fn possible_vals(&self) -> Option<&[&'e str]> {
-        None
-    }
-    fn validator(&self) -> Option<&Rc<Fn(String) -> StdResult<(), String>>> {
-        None
-    }
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> StdResult<(), OsString>>> {
-        None
-    }
-    fn min_vals(&self) -> Option<u64> {
-        None
-    }
-    fn short(&self) -> Option<char> {
-        self.s.short
-    }
-    fn long(&self) -> Option<&'e str> {
-        self.s.long
-    }
-    fn val_delim(&self) -> Option<char> {
-        None
-    }
-    fn help(&self) -> Option<&'e str> {
-        self.b.help
-    }
-    fn long_help(&self) -> Option<&'e str> {
-        self.b.long_help
-    }
-    fn val_terminator(&self) -> Option<&'e str> {
-        None
-    }
-    fn default_val(&self) -> Option<&'e OsStr> {
-        None
-    }
-    fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
-        None
-    }
-    fn env<'s>(&'s self) -> Option<(&'n OsStr, Option<&'s OsString>)> {
-        None
-    }
-    fn longest_filter(&self) -> bool {
-        self.s.long.is_some()
-    }
-    fn aliases(&self) -> Option<Vec<&'e str>> {
-        if let Some(ref aliases) = self.s.aliases {
-            let vis_aliases: Vec<_> = aliases
-                .iter()
-                .filter_map(|&(n, v)| if v { Some(n) } else { None })
-                .collect();
-            if vis_aliases.is_empty() {
-                None
-            } else {
-                Some(vis_aliases)
-            }
-        } else {
-            None
-        }
-    }
-}
-
-impl<'n, 'e> DispOrder for FlagBuilder<'n, 'e> {
-    fn disp_ord(&self) -> usize {
-        self.s.disp_ord
-    }
-}
-
-impl<'n, 'e> PartialEq for FlagBuilder<'n, 'e> {
-    fn eq(&self, other: &FlagBuilder<'n, 'e>) -> bool {
-        self.b == other.b
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::FlagBuilder;
-    use args::settings::ArgSettings;
-
-    #[test]
-    fn flagbuilder_display() {
-        let mut f = FlagBuilder::new("flg");
-        f.b.settings.set(ArgSettings::Multiple);
-        f.s.long = Some("flag");
-
-        assert_eq!(&*format!("{}", f), "--flag");
-
-        let mut f2 = FlagBuilder::new("flg");
-        f2.s.short = Some('f');
-
-        assert_eq!(&*format!("{}", f2), "-f");
-    }
-
-    #[test]
-    fn flagbuilder_display_single_alias() {
-        let mut f = FlagBuilder::new("flg");
-        f.s.long = Some("flag");
-        f.s.aliases = Some(vec![("als", true)]);
-
-        assert_eq!(&*format!("{}", f), "--flag");
-    }
-
-    #[test]
-    fn flagbuilder_display_multiple_aliases() {
-        let mut f = FlagBuilder::new("flg");
-        f.s.short = Some('f');
-        f.s.aliases = Some(vec![
-            ("alias_not_visible", false),
-            ("f2", true),
-            ("f3", true),
-            ("f4", true),
-        ]);
-        assert_eq!(&*format!("{}", f), "-f");
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/arg_builder/mod.rs b/third_party/rust/clap/v2/crate/src/args/arg_builder/mod.rs
deleted file mode 100644
index 2d79208..0000000
--- a/third_party/rust/clap/v2/crate/src/args/arg_builder/mod.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-pub use self::base::Base;
-pub use self::flag::FlagBuilder;
-pub use self::option::OptBuilder;
-pub use self::positional::PosBuilder;
-pub use self::switched::Switched;
-pub use self::valued::Valued;
-
-mod base;
-mod flag;
-mod option;
-mod positional;
-mod switched;
-mod valued;
diff --git a/third_party/rust/clap/v2/crate/src/args/arg_builder/option.rs b/third_party/rust/clap/v2/crate/src/args/arg_builder/option.rs
deleted file mode 100644
index 45d41fa..0000000
--- a/third_party/rust/clap/v2/crate/src/args/arg_builder/option.rs
+++ /dev/null
@@ -1,290 +0,0 @@
-// Std
-use std::ffi::{OsStr, OsString};
-use std::fmt::{Display, Formatter, Result};
-use std::mem;
-use std::rc::Rc;
-use std::result::Result as StdResult;
-
-// Internal
-use args::{AnyArg, Arg, ArgSettings, Base, DispOrder, Switched, Valued};
-use map::{self, VecMap};
-use INTERNAL_ERROR_MSG;
-
-#[allow(missing_debug_implementations)]
-#[doc(hidden)]
-#[derive(Default, Clone)]
-pub struct OptBuilder<'n, 'e>
-where
-    'n: 'e,
-{
-    pub b: Base<'n, 'e>,
-    pub s: Switched<'e>,
-    pub v: Valued<'n, 'e>,
-}
-
-impl<'n, 'e> OptBuilder<'n, 'e> {
-    pub fn new(name: &'n str) -> Self {
-        OptBuilder {
-            b: Base::new(name),
-            ..Default::default()
-        }
-    }
-}
-
-impl<'n, 'e, 'z> From<&'z Arg<'n, 'e>> for OptBuilder<'n, 'e> {
-    fn from(a: &'z Arg<'n, 'e>) -> Self {
-        OptBuilder {
-            b: Base::from(a),
-            s: Switched::from(a),
-            v: Valued::from(a),
-        }
-    }
-}
-
-impl<'n, 'e> From<Arg<'n, 'e>> for OptBuilder<'n, 'e> {
-    fn from(mut a: Arg<'n, 'e>) -> Self {
-        a.v.fill_in();
-        OptBuilder {
-            b: mem::replace(&mut a.b, Base::default()),
-            s: mem::replace(&mut a.s, Switched::default()),
-            v: mem::replace(&mut a.v, Valued::default()),
-        }
-    }
-}
-
-impl<'n, 'e> Display for OptBuilder<'n, 'e> {
-    fn fmt(&self, f: &mut Formatter) -> Result {
-        debugln!("OptBuilder::fmt:{}", self.b.name);
-        let sep = if self.b.is_set(ArgSettings::RequireEquals) {
-            "="
-        } else {
-            " "
-        };
-        // Write the name such --long or -l
-        if let Some(l) = self.s.long {
-            write!(f, "--{}{}", l, sep)?;
-        } else {
-            write!(f, "-{}{}", self.s.short.unwrap(), sep)?;
-        }
-        let delim = if self.is_set(ArgSettings::RequireDelimiter) {
-            self.v.val_delim.expect(INTERNAL_ERROR_MSG)
-        } else {
-            ' '
-        };
-
-        // Write the values such as <name1> <name2>
-        if let Some(ref vec) = self.v.val_names {
-            let mut it = vec.iter().peekable();
-            while let Some((_, val)) = it.next() {
-                write!(f, "<{}>", val)?;
-                if it.peek().is_some() {
-                    write!(f, "{}", delim)?;
-                }
-            }
-            let num = vec.len();
-            if self.is_set(ArgSettings::Multiple) && num == 1 {
-                write!(f, "...")?;
-            }
-        } else if let Some(num) = self.v.num_vals {
-            let mut it = (0..num).peekable();
-            while let Some(_) = it.next() {
-                write!(f, "<{}>", self.b.name)?;
-                if it.peek().is_some() {
-                    write!(f, "{}", delim)?;
-                }
-            }
-            if self.is_set(ArgSettings::Multiple) && num == 1 {
-                write!(f, "...")?;
-            }
-        } else {
-            write!(
-                f,
-                "<{}>{}",
-                self.b.name,
-                if self.is_set(ArgSettings::Multiple) {
-                    "..."
-                } else {
-                    ""
-                }
-            )?;
-        }
-
-        Ok(())
-    }
-}
-
-impl<'n, 'e> AnyArg<'n, 'e> for OptBuilder<'n, 'e> {
-    fn name(&self) -> &'n str {
-        self.b.name
-    }
-    fn overrides(&self) -> Option<&[&'e str]> {
-        self.b.overrides.as_ref().map(|o| &o[..])
-    }
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]> {
-        self.b.requires.as_ref().map(|o| &o[..])
-    }
-    fn blacklist(&self) -> Option<&[&'e str]> {
-        self.b.blacklist.as_ref().map(|o| &o[..])
-    }
-    fn required_unless(&self) -> Option<&[&'e str]> {
-        self.b.r_unless.as_ref().map(|o| &o[..])
-    }
-    fn val_names(&self) -> Option<&VecMap<&'e str>> {
-        self.v.val_names.as_ref()
-    }
-    fn is_set(&self, s: ArgSettings) -> bool {
-        self.b.settings.is_set(s)
-    }
-    fn has_switch(&self) -> bool {
-        true
-    }
-    fn set(&mut self, s: ArgSettings) {
-        self.b.settings.set(s)
-    }
-    fn max_vals(&self) -> Option<u64> {
-        self.v.max_vals
-    }
-    fn val_terminator(&self) -> Option<&'e str> {
-        self.v.terminator
-    }
-    fn num_vals(&self) -> Option<u64> {
-        self.v.num_vals
-    }
-    fn possible_vals(&self) -> Option<&[&'e str]> {
-        self.v.possible_vals.as_ref().map(|o| &o[..])
-    }
-    fn validator(&self) -> Option<&Rc<Fn(String) -> StdResult<(), String>>> {
-        self.v.validator.as_ref()
-    }
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> StdResult<(), OsString>>> {
-        self.v.validator_os.as_ref()
-    }
-    fn min_vals(&self) -> Option<u64> {
-        self.v.min_vals
-    }
-    fn short(&self) -> Option<char> {
-        self.s.short
-    }
-    fn long(&self) -> Option<&'e str> {
-        self.s.long
-    }
-    fn val_delim(&self) -> Option<char> {
-        self.v.val_delim
-    }
-    fn takes_value(&self) -> bool {
-        true
-    }
-    fn help(&self) -> Option<&'e str> {
-        self.b.help
-    }
-    fn long_help(&self) -> Option<&'e str> {
-        self.b.long_help
-    }
-    fn default_val(&self) -> Option<&'e OsStr> {
-        self.v.default_val
-    }
-    fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
-        self.v.default_vals_ifs.as_ref().map(|vm| vm.values())
-    }
-    fn env<'s>(&'s self) -> Option<(&'n OsStr, Option<&'s OsString>)> {
-        self.v
-            .env
-            .as_ref()
-            .map(|&(key, ref value)| (key, value.as_ref()))
-    }
-    fn longest_filter(&self) -> bool {
-        true
-    }
-    fn aliases(&self) -> Option<Vec<&'e str>> {
-        if let Some(ref aliases) = self.s.aliases {
-            let vis_aliases: Vec<_> = aliases
-                .iter()
-                .filter_map(|&(n, v)| if v { Some(n) } else { None })
-                .collect();
-            if vis_aliases.is_empty() {
-                None
-            } else {
-                Some(vis_aliases)
-            }
-        } else {
-            None
-        }
-    }
-}
-
-impl<'n, 'e> DispOrder for OptBuilder<'n, 'e> {
-    fn disp_ord(&self) -> usize {
-        self.s.disp_ord
-    }
-}
-
-impl<'n, 'e> PartialEq for OptBuilder<'n, 'e> {
-    fn eq(&self, other: &OptBuilder<'n, 'e>) -> bool {
-        self.b == other.b
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::OptBuilder;
-    use args::settings::ArgSettings;
-    use map::VecMap;
-
-    #[test]
-    fn optbuilder_display1() {
-        let mut o = OptBuilder::new("opt");
-        o.s.long = Some("option");
-        o.b.settings.set(ArgSettings::Multiple);
-
-        assert_eq!(&*format!("{}", o), "--option <opt>...");
-    }
-
-    #[test]
-    fn optbuilder_display2() {
-        let mut v_names = VecMap::new();
-        v_names.insert(0, "file");
-        v_names.insert(1, "name");
-
-        let mut o2 = OptBuilder::new("opt");
-        o2.s.short = Some('o');
-        o2.v.val_names = Some(v_names);
-
-        assert_eq!(&*format!("{}", o2), "-o <file> <name>");
-    }
-
-    #[test]
-    fn optbuilder_display3() {
-        let mut v_names = VecMap::new();
-        v_names.insert(0, "file");
-        v_names.insert(1, "name");
-
-        let mut o2 = OptBuilder::new("opt");
-        o2.s.short = Some('o');
-        o2.v.val_names = Some(v_names);
-        o2.b.settings.set(ArgSettings::Multiple);
-
-        assert_eq!(&*format!("{}", o2), "-o <file> <name>");
-    }
-
-    #[test]
-    fn optbuilder_display_single_alias() {
-        let mut o = OptBuilder::new("opt");
-        o.s.long = Some("option");
-        o.s.aliases = Some(vec![("als", true)]);
-
-        assert_eq!(&*format!("{}", o), "--option <opt>");
-    }
-
-    #[test]
-    fn optbuilder_display_multiple_aliases() {
-        let mut o = OptBuilder::new("opt");
-        o.s.long = Some("option");
-        o.s.aliases = Some(vec![
-            ("als_not_visible", false),
-            ("als2", true),
-            ("als3", true),
-            ("als4", true),
-        ]);
-        assert_eq!(&*format!("{}", o), "--option <opt>");
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/arg_builder/positional.rs b/third_party/rust/clap/v2/crate/src/args/arg_builder/positional.rs
deleted file mode 100644
index 6d8c1fe..0000000
--- a/third_party/rust/clap/v2/crate/src/args/arg_builder/positional.rs
+++ /dev/null
@@ -1,280 +0,0 @@
-// Std
-use std::borrow::Cow;
-use std::ffi::{OsStr, OsString};
-use std::fmt::{Display, Formatter, Result};
-use std::mem;
-use std::rc::Rc;
-use std::result::Result as StdResult;
-
-// Internal
-use args::{AnyArg, ArgSettings, Base, DispOrder, Valued};
-use map::{self, VecMap};
-use Arg;
-use INTERNAL_ERROR_MSG;
-
-#[allow(missing_debug_implementations)]
-#[doc(hidden)]
-#[derive(Clone, Default)]
-pub struct PosBuilder<'n, 'e>
-where
-    'n: 'e,
-{
-    pub b: Base<'n, 'e>,
-    pub v: Valued<'n, 'e>,
-    pub index: u64,
-}
-
-impl<'n, 'e> PosBuilder<'n, 'e> {
-    pub fn new(name: &'n str, idx: u64) -> Self {
-        PosBuilder {
-            b: Base::new(name),
-            index: idx,
-            ..Default::default()
-        }
-    }
-
-    pub fn from_arg_ref(a: &Arg<'n, 'e>, idx: u64) -> Self {
-        let mut pb = PosBuilder {
-            b: Base::from(a),
-            v: Valued::from(a),
-            index: idx,
-        };
-        if a.v.max_vals.is_some()
-            || a.v.min_vals.is_some()
-            || (a.v.num_vals.is_some() && a.v.num_vals.unwrap() > 1)
-        {
-            pb.b.settings.set(ArgSettings::Multiple);
-        }
-        pb
-    }
-
-    pub fn from_arg(mut a: Arg<'n, 'e>, idx: u64) -> Self {
-        if a.v.max_vals.is_some()
-            || a.v.min_vals.is_some()
-            || (a.v.num_vals.is_some() && a.v.num_vals.unwrap() > 1)
-        {
-            a.b.settings.set(ArgSettings::Multiple);
-        }
-        PosBuilder {
-            b: mem::replace(&mut a.b, Base::default()),
-            v: mem::replace(&mut a.v, Valued::default()),
-            index: idx,
-        }
-    }
-
-    pub fn multiple_str(&self) -> &str {
-        let mult_vals = self
-            .v
-            .val_names
-            .as_ref()
-            .map_or(true, |names| names.len() < 2);
-        if self.is_set(ArgSettings::Multiple) && mult_vals {
-            "..."
-        } else {
-            ""
-        }
-    }
-
-    pub fn name_no_brackets(&self) -> Cow<str> {
-        debugln!("PosBuilder::name_no_brackets;");
-        let mut delim = String::new();
-        delim.push(if self.is_set(ArgSettings::RequireDelimiter) {
-            self.v.val_delim.expect(INTERNAL_ERROR_MSG)
-        } else {
-            ' '
-        });
-        if let Some(ref names) = self.v.val_names {
-            debugln!("PosBuilder:name_no_brackets: val_names={:#?}", names);
-            if names.len() > 1 {
-                Cow::Owned(
-                    names
-                        .values()
-                        .map(|n| format!("<{}>", n))
-                        .collect::<Vec<_>>()
-                        .join(&*delim),
-                )
-            } else {
-                Cow::Borrowed(names.values().next().expect(INTERNAL_ERROR_MSG))
-            }
-        } else {
-            debugln!("PosBuilder:name_no_brackets: just name");
-            Cow::Borrowed(self.b.name)
-        }
-    }
-}
-
-impl<'n, 'e> Display for PosBuilder<'n, 'e> {
-    fn fmt(&self, f: &mut Formatter) -> Result {
-        let mut delim = String::new();
-        delim.push(if self.is_set(ArgSettings::RequireDelimiter) {
-            self.v.val_delim.expect(INTERNAL_ERROR_MSG)
-        } else {
-            ' '
-        });
-        if let Some(ref names) = self.v.val_names {
-            write!(
-                f,
-                "{}",
-                names
-                    .values()
-                    .map(|n| format!("<{}>", n))
-                    .collect::<Vec<_>>()
-                    .join(&*delim)
-            )?;
-        } else {
-            write!(f, "<{}>", self.b.name)?;
-        }
-        if self.b.settings.is_set(ArgSettings::Multiple)
-            && (self.v.val_names.is_none() || self.v.val_names.as_ref().unwrap().len() == 1)
-        {
-            write!(f, "...")?;
-        }
-
-        Ok(())
-    }
-}
-
-impl<'n, 'e> AnyArg<'n, 'e> for PosBuilder<'n, 'e> {
-    fn name(&self) -> &'n str {
-        self.b.name
-    }
-    fn overrides(&self) -> Option<&[&'e str]> {
-        self.b.overrides.as_ref().map(|o| &o[..])
-    }
-    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]> {
-        self.b.requires.as_ref().map(|o| &o[..])
-    }
-    fn blacklist(&self) -> Option<&[&'e str]> {
-        self.b.blacklist.as_ref().map(|o| &o[..])
-    }
-    fn required_unless(&self) -> Option<&[&'e str]> {
-        self.b.r_unless.as_ref().map(|o| &o[..])
-    }
-    fn val_names(&self) -> Option<&VecMap<&'e str>> {
-        self.v.val_names.as_ref()
-    }
-    fn is_set(&self, s: ArgSettings) -> bool {
-        self.b.settings.is_set(s)
-    }
-    fn set(&mut self, s: ArgSettings) {
-        self.b.settings.set(s)
-    }
-    fn has_switch(&self) -> bool {
-        false
-    }
-    fn max_vals(&self) -> Option<u64> {
-        self.v.max_vals
-    }
-    fn val_terminator(&self) -> Option<&'e str> {
-        self.v.terminator
-    }
-    fn num_vals(&self) -> Option<u64> {
-        self.v.num_vals
-    }
-    fn possible_vals(&self) -> Option<&[&'e str]> {
-        self.v.possible_vals.as_ref().map(|o| &o[..])
-    }
-    fn validator(&self) -> Option<&Rc<Fn(String) -> StdResult<(), String>>> {
-        self.v.validator.as_ref()
-    }
-    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> StdResult<(), OsString>>> {
-        self.v.validator_os.as_ref()
-    }
-    fn min_vals(&self) -> Option<u64> {
-        self.v.min_vals
-    }
-    fn short(&self) -> Option<char> {
-        None
-    }
-    fn long(&self) -> Option<&'e str> {
-        None
-    }
-    fn val_delim(&self) -> Option<char> {
-        self.v.val_delim
-    }
-    fn takes_value(&self) -> bool {
-        true
-    }
-    fn help(&self) -> Option<&'e str> {
-        self.b.help
-    }
-    fn long_help(&self) -> Option<&'e str> {
-        self.b.long_help
-    }
-    fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
-        self.v.default_vals_ifs.as_ref().map(|vm| vm.values())
-    }
-    fn default_val(&self) -> Option<&'e OsStr> {
-        self.v.default_val
-    }
-    fn env<'s>(&'s self) -> Option<(&'n OsStr, Option<&'s OsString>)> {
-        self.v
-            .env
-            .as_ref()
-            .map(|&(key, ref value)| (key, value.as_ref()))
-    }
-    fn longest_filter(&self) -> bool {
-        true
-    }
-    fn aliases(&self) -> Option<Vec<&'e str>> {
-        None
-    }
-}
-
-impl<'n, 'e> DispOrder for PosBuilder<'n, 'e> {
-    fn disp_ord(&self) -> usize {
-        self.index as usize
-    }
-}
-
-impl<'n, 'e> PartialEq for PosBuilder<'n, 'e> {
-    fn eq(&self, other: &PosBuilder<'n, 'e>) -> bool {
-        self.b == other.b
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::PosBuilder;
-    use args::settings::ArgSettings;
-    use map::VecMap;
-
-    #[test]
-    fn display_mult() {
-        let mut p = PosBuilder::new("pos", 1);
-        p.b.settings.set(ArgSettings::Multiple);
-
-        assert_eq!(&*format!("{}", p), "<pos>...");
-    }
-
-    #[test]
-    fn display_required() {
-        let mut p2 = PosBuilder::new("pos", 1);
-        p2.b.settings.set(ArgSettings::Required);
-
-        assert_eq!(&*format!("{}", p2), "<pos>");
-    }
-
-    #[test]
-    fn display_val_names() {
-        let mut p2 = PosBuilder::new("pos", 1);
-        let mut vm = VecMap::new();
-        vm.insert(0, "file1");
-        vm.insert(1, "file2");
-        p2.v.val_names = Some(vm);
-
-        assert_eq!(&*format!("{}", p2), "<file1> <file2>");
-    }
-
-    #[test]
-    fn display_val_names_req() {
-        let mut p2 = PosBuilder::new("pos", 1);
-        p2.b.settings.set(ArgSettings::Required);
-        let mut vm = VecMap::new();
-        vm.insert(0, "file1");
-        vm.insert(1, "file2");
-        p2.v.val_names = Some(vm);
-
-        assert_eq!(&*format!("{}", p2), "<file1> <file2>");
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/arg_builder/switched.rs b/third_party/rust/clap/v2/crate/src/args/arg_builder/switched.rs
deleted file mode 100644
index 777ff1d..0000000
--- a/third_party/rust/clap/v2/crate/src/args/arg_builder/switched.rs
+++ /dev/null
@@ -1,40 +0,0 @@
-use Arg;
-
-#[derive(Debug)]
-pub struct Switched<'b> {
-    pub short: Option<char>,
-    pub long: Option<&'b str>,
-    pub aliases: Option<Vec<(&'b str, bool)>>, // (name, visible)
-    pub disp_ord: usize,
-    pub unified_ord: usize,
-}
-
-impl<'e> Default for Switched<'e> {
-    fn default() -> Self {
-        Switched {
-            short: None,
-            long: None,
-            aliases: None,
-            disp_ord: 999,
-            unified_ord: 999,
-        }
-    }
-}
-
-impl<'n, 'e, 'z> From<&'z Arg<'n, 'e>> for Switched<'e> {
-    fn from(a: &'z Arg<'n, 'e>) -> Self {
-        a.s.clone()
-    }
-}
-
-impl<'e> Clone for Switched<'e> {
-    fn clone(&self) -> Self {
-        Switched {
-            short: self.short,
-            long: self.long,
-            aliases: self.aliases.clone(),
-            disp_ord: self.disp_ord,
-            unified_ord: self.unified_ord,
-        }
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/arg_builder/valued.rs b/third_party/rust/clap/v2/crate/src/args/arg_builder/valued.rs
deleted file mode 100644
index 82e148754..0000000
--- a/third_party/rust/clap/v2/crate/src/args/arg_builder/valued.rs
+++ /dev/null
@@ -1,67 +0,0 @@
-use std::ffi::{OsStr, OsString};
-use std::rc::Rc;
-
-use map::VecMap;
-
-use Arg;
-
-#[allow(missing_debug_implementations)]
-#[derive(Clone)]
-pub struct Valued<'a, 'b>
-where
-    'a: 'b,
-{
-    pub possible_vals: Option<Vec<&'b str>>,
-    pub val_names: Option<VecMap<&'b str>>,
-    pub num_vals: Option<u64>,
-    pub max_vals: Option<u64>,
-    pub min_vals: Option<u64>,
-    pub validator: Option<Rc<Fn(String) -> Result<(), String>>>,
-    pub validator_os: Option<Rc<Fn(&OsStr) -> Result<(), OsString>>>,
-    pub val_delim: Option<char>,
-    pub default_val: Option<&'b OsStr>,
-    pub default_vals_ifs: Option<VecMap<(&'a str, Option<&'b OsStr>, &'b OsStr)>>,
-    pub env: Option<(&'a OsStr, Option<OsString>)>,
-    pub terminator: Option<&'b str>,
-}
-
-impl<'n, 'e> Default for Valued<'n, 'e> {
-    fn default() -> Self {
-        Valued {
-            possible_vals: None,
-            num_vals: None,
-            min_vals: None,
-            max_vals: None,
-            val_names: None,
-            validator: None,
-            validator_os: None,
-            val_delim: None,
-            default_val: None,
-            default_vals_ifs: None,
-            env: None,
-            terminator: None,
-        }
-    }
-}
-
-impl<'n, 'e> Valued<'n, 'e> {
-    pub fn fill_in(&mut self) {
-        if let Some(ref vec) = self.val_names {
-            if vec.len() > 1 {
-                self.num_vals = Some(vec.len() as u64);
-            }
-        }
-    }
-}
-
-impl<'n, 'e, 'z> From<&'z Arg<'n, 'e>> for Valued<'n, 'e> {
-    fn from(a: &'z Arg<'n, 'e>) -> Self {
-        let mut v = a.v.clone();
-        if let Some(ref vec) = a.v.val_names {
-            if vec.len() > 1 {
-                v.num_vals = Some(vec.len() as u64);
-            }
-        }
-        v
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/arg_matcher.rs b/third_party/rust/clap/v2/crate/src/args/arg_matcher.rs
deleted file mode 100644
index 1a0a149..0000000
--- a/third_party/rust/clap/v2/crate/src/args/arg_matcher.rs
+++ /dev/null
@@ -1,269 +0,0 @@
-// Std
-use std::collections::hash_map::{Entry, Iter};
-use std::collections::HashMap;
-use std::ffi::OsStr;
-use std::mem;
-use std::ops::Deref;
-
-// Internal
-use args::settings::ArgSettings;
-use args::AnyArg;
-use args::{ArgMatches, MatchedArg, SubCommand};
-
-#[doc(hidden)]
-#[allow(missing_debug_implementations)]
-pub struct ArgMatcher<'a>(pub ArgMatches<'a>);
-
-impl<'a> Default for ArgMatcher<'a> {
-    fn default() -> Self {
-        ArgMatcher(ArgMatches::default())
-    }
-}
-
-impl<'a> ArgMatcher<'a> {
-    pub fn new() -> Self {
-        ArgMatcher::default()
-    }
-
-    pub fn process_arg_overrides<'b>(
-        &mut self,
-        a: Option<&AnyArg<'a, 'b>>,
-        overrides: &mut Vec<(&'b str, &'a str)>,
-        required: &mut Vec<&'a str>,
-        check_all: bool,
-    ) {
-        debugln!(
-            "ArgMatcher::process_arg_overrides:{:?};",
-            a.map_or(None, |a| Some(a.name()))
-        );
-        if let Some(aa) = a {
-            let mut self_done = false;
-            if let Some(a_overrides) = aa.overrides() {
-                for overr in a_overrides {
-                    debugln!("ArgMatcher::process_arg_overrides:iter:{};", overr);
-                    if overr == &aa.name() {
-                        self_done = true;
-                        self.handle_self_overrides(a);
-                    } else if self.is_present(overr) {
-                        debugln!(
-                            "ArgMatcher::process_arg_overrides:iter:{}: removing from matches;",
-                            overr
-                        );
-                        self.remove(overr);
-                        for i in (0..required.len()).rev() {
-                            if &required[i] == overr {
-                                debugln!(
-                                    "ArgMatcher::process_arg_overrides:iter:{}: removing required;",
-                                    overr
-                                );
-                                required.swap_remove(i);
-                                break;
-                            }
-                        }
-                        overrides.push((overr, aa.name()));
-                    } else {
-                        overrides.push((overr, aa.name()));
-                    }
-                }
-            }
-            if check_all && !self_done {
-                self.handle_self_overrides(a);
-            }
-        }
-    }
-
-    pub fn handle_self_overrides<'b>(&mut self, a: Option<&AnyArg<'a, 'b>>) {
-        debugln!(
-            "ArgMatcher::handle_self_overrides:{:?};",
-            a.map_or(None, |a| Some(a.name()))
-        );
-        if let Some(aa) = a {
-            if !aa.has_switch() || aa.is_set(ArgSettings::Multiple) {
-                // positional args can't override self or else we would never advance to the next
-
-                // Also flags with --multiple set are ignored otherwise we could never have more
-                // than one
-                return;
-            }
-            if let Some(ma) = self.get_mut(aa.name()) {
-                if ma.vals.len() > 1 {
-                    // swap_remove(0) would be O(1) but does not preserve order, which
-                    // we need
-                    ma.vals.remove(0);
-                    ma.occurs = 1;
-                } else if !aa.takes_value() && ma.occurs > 1 {
-                    ma.occurs = 1;
-                }
-            }
-        }
-    }
-
-    pub fn is_present(&self, name: &str) -> bool {
-        self.0.is_present(name)
-    }
-
-    pub fn propagate_globals(&mut self, global_arg_vec: &[&'a str]) {
-        debugln!(
-            "ArgMatcher::get_global_values: global_arg_vec={:?}",
-            global_arg_vec
-        );
-        let mut vals_map = HashMap::new();
-        self.fill_in_global_values(global_arg_vec, &mut vals_map);
-    }
-
-    fn fill_in_global_values(
-        &mut self,
-        global_arg_vec: &[&'a str],
-        vals_map: &mut HashMap<&'a str, MatchedArg>,
-    ) {
-        for global_arg in global_arg_vec {
-            if let Some(ma) = self.get(global_arg) {
-                // We have to check if the parent's global arg wasn't used but still exists
-                // such as from a default value.
-                //
-                // For example, `myprog subcommand --global-arg=value` where --global-arg defines
-                // a default value of `other` myprog would have an existing MatchedArg for
-                // --global-arg where the value is `other`, however the occurs will be 0.
-                let to_update = if let Some(parent_ma) = vals_map.get(global_arg) {
-                    if parent_ma.occurs > 0 && ma.occurs == 0 {
-                        parent_ma.clone()
-                    } else {
-                        ma.clone()
-                    }
-                } else {
-                    ma.clone()
-                };
-                vals_map.insert(global_arg, to_update);
-            }
-        }
-        if let Some(ref mut sc) = self.0.subcommand {
-            let mut am = ArgMatcher(mem::replace(&mut sc.matches, ArgMatches::new()));
-            am.fill_in_global_values(global_arg_vec, vals_map);
-            mem::swap(&mut am.0, &mut sc.matches);
-        }
-
-        for (name, matched_arg) in vals_map.into_iter() {
-            self.0.args.insert(name, matched_arg.clone());
-        }
-    }
-
-    pub fn get_mut(&mut self, arg: &str) -> Option<&mut MatchedArg> {
-        self.0.args.get_mut(arg)
-    }
-
-    pub fn get(&self, arg: &str) -> Option<&MatchedArg> {
-        self.0.args.get(arg)
-    }
-
-    pub fn remove(&mut self, arg: &str) {
-        self.0.args.remove(arg);
-    }
-
-    pub fn remove_all(&mut self, args: &[&str]) {
-        for &arg in args {
-            self.0.args.remove(arg);
-        }
-    }
-
-    pub fn insert(&mut self, name: &'a str) {
-        self.0.args.insert(name, MatchedArg::new());
-    }
-
-    pub fn contains(&self, arg: &str) -> bool {
-        self.0.args.contains_key(arg)
-    }
-
-    pub fn is_empty(&self) -> bool {
-        self.0.args.is_empty()
-    }
-
-    pub fn usage(&mut self, usage: String) {
-        self.0.usage = Some(usage);
-    }
-
-    pub fn arg_names(&'a self) -> Vec<&'a str> {
-        self.0.args.keys().map(Deref::deref).collect()
-    }
-
-    pub fn entry(&mut self, arg: &'a str) -> Entry<&'a str, MatchedArg> {
-        self.0.args.entry(arg)
-    }
-
-    pub fn subcommand(&mut self, sc: SubCommand<'a>) {
-        self.0.subcommand = Some(Box::new(sc));
-    }
-
-    pub fn subcommand_name(&self) -> Option<&str> {
-        self.0.subcommand_name()
-    }
-
-    pub fn iter(&self) -> Iter<&str, MatchedArg> {
-        self.0.args.iter()
-    }
-
-    pub fn inc_occurrence_of(&mut self, arg: &'a str) {
-        debugln!("ArgMatcher::inc_occurrence_of: arg={}", arg);
-        if let Some(a) = self.get_mut(arg) {
-            a.occurs += 1;
-            return;
-        }
-        debugln!("ArgMatcher::inc_occurrence_of: first instance");
-        self.insert(arg);
-    }
-
-    pub fn inc_occurrences_of(&mut self, args: &[&'a str]) {
-        debugln!("ArgMatcher::inc_occurrences_of: args={:?}", args);
-        for arg in args {
-            self.inc_occurrence_of(arg);
-        }
-    }
-
-    pub fn add_val_to(&mut self, arg: &'a str, val: &OsStr) {
-        let ma = self.entry(arg).or_insert(MatchedArg {
-            occurs: 0,
-            indices: Vec::with_capacity(1),
-            vals: Vec::with_capacity(1),
-        });
-        ma.vals.push(val.to_owned());
-    }
-
-    pub fn add_index_to(&mut self, arg: &'a str, idx: usize) {
-        let ma = self.entry(arg).or_insert(MatchedArg {
-            occurs: 0,
-            indices: Vec::with_capacity(1),
-            vals: Vec::new(),
-        });
-        ma.indices.push(idx);
-    }
-
-    pub fn needs_more_vals<'b, A>(&self, o: &A) -> bool
-    where
-        A: AnyArg<'a, 'b>,
-    {
-        debugln!("ArgMatcher::needs_more_vals: o={}", o.name());
-        if let Some(ma) = self.get(o.name()) {
-            if let Some(num) = o.num_vals() {
-                debugln!("ArgMatcher::needs_more_vals: num_vals...{}", num);
-                return if o.is_set(ArgSettings::Multiple) {
-                    ((ma.vals.len() as u64) % num) != 0
-                } else {
-                    num != (ma.vals.len() as u64)
-                };
-            } else if let Some(num) = o.max_vals() {
-                debugln!("ArgMatcher::needs_more_vals: max_vals...{}", num);
-                return !((ma.vals.len() as u64) > num);
-            } else if o.min_vals().is_some() {
-                debugln!("ArgMatcher::needs_more_vals: min_vals...true");
-                return true;
-            }
-            return o.is_set(ArgSettings::Multiple);
-        }
-        true
-    }
-}
-
-impl<'a> Into<ArgMatches<'a>> for ArgMatcher<'a> {
-    fn into(self) -> ArgMatches<'a> {
-        self.0
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/arg_matches.rs b/third_party/rust/clap/v2/crate/src/args/arg_matches.rs
deleted file mode 100644
index f017c4e..0000000
--- a/third_party/rust/clap/v2/crate/src/args/arg_matches.rs
+++ /dev/null
@@ -1,998 +0,0 @@
-// Std
-use std::borrow::Cow;
-use std::collections::HashMap;
-use std::ffi::{OsStr, OsString};
-use std::iter::Map;
-use std::slice::Iter;
-
-// Internal
-use args::MatchedArg;
-use args::SubCommand;
-use INVALID_UTF8;
-
-/// Used to get information about the arguments that were supplied to the program at runtime by
-/// the user. New instances of this struct are obtained by using the [`App::get_matches`] family of
-/// methods.
-///
-/// # Examples
-///
-/// ```no_run
-/// # use clap::{App, Arg};
-/// let matches = App::new("MyApp")
-///     .arg(Arg::with_name("out")
-///         .long("output")
-///         .required(true)
-///         .takes_value(true))
-///     .arg(Arg::with_name("debug")
-///         .short("d")
-///         .multiple(true))
-///     .arg(Arg::with_name("cfg")
-///         .short("c")
-///         .takes_value(true))
-///     .get_matches(); // builds the instance of ArgMatches
-///
-/// // to get information about the "cfg" argument we created, such as the value supplied we use
-/// // various ArgMatches methods, such as ArgMatches::value_of
-/// if let Some(c) = matches.value_of("cfg") {
-///     println!("Value for -c: {}", c);
-/// }
-///
-/// // The ArgMatches::value_of method returns an Option because the user may not have supplied
-/// // that argument at runtime. But if we specified that the argument was "required" as we did
-/// // with the "out" argument, we can safely unwrap because `clap` verifies that was actually
-/// // used at runtime.
-/// println!("Value for --output: {}", matches.value_of("out").unwrap());
-///
-/// // You can check the presence of an argument
-/// if matches.is_present("out") {
-///     // Another way to check if an argument was present, or if it occurred multiple times is to
-///     // use occurrences_of() which returns 0 if an argument isn't found at runtime, or the
-///     // number of times that it occurred, if it was. To allow an argument to appear more than
-///     // once, you must use the .multiple(true) method, otherwise it will only return 1 or 0.
-///     if matches.occurrences_of("debug") > 2 {
-///         println!("Debug mode is REALLY on, don't be crazy");
-///     } else {
-///         println!("Debug mode kind of on");
-///     }
-/// }
-/// ```
-/// [`App::get_matches`]: ./struct.App.html#method.get_matches
-#[derive(Debug, Clone)]
-pub struct ArgMatches<'a> {
-    #[doc(hidden)]
-    pub args: HashMap<&'a str, MatchedArg>,
-    #[doc(hidden)]
-    pub subcommand: Option<Box<SubCommand<'a>>>,
-    #[doc(hidden)]
-    pub usage: Option<String>,
-}
-
-impl<'a> Default for ArgMatches<'a> {
-    fn default() -> Self {
-        ArgMatches {
-            args: HashMap::new(),
-            subcommand: None,
-            usage: None,
-        }
-    }
-}
-
-impl<'a> ArgMatches<'a> {
-    #[doc(hidden)]
-    pub fn new() -> Self {
-        ArgMatches {
-            ..Default::default()
-        }
-    }
-
-    /// Gets the value of a specific [option] or [positional] argument (i.e. an argument that takes
-    /// an additional value at runtime). If the option wasn't present at runtime
-    /// it returns `None`.
-    ///
-    /// *NOTE:* If getting a value for an option or positional argument that allows multiples,
-    /// prefer [`ArgMatches::values_of`] as `ArgMatches::value_of` will only return the *first*
-    /// value.
-    ///
-    /// # Panics
-    ///
-    /// This method will [`panic!`] if the value contains invalid UTF-8 code points.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myapp")
-    ///     .arg(Arg::with_name("output")
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec!["myapp", "something"]);
-    ///
-    /// assert_eq!(m.value_of("output"), Some("something"));
-    /// ```
-    /// [option]: ./struct.Arg.html#method.takes_value
-    /// [positional]: ./struct.Arg.html#method.index
-    /// [`ArgMatches::values_of`]: ./struct.ArgMatches.html#method.values_of
-    /// [`panic!`]: https://doc.rust-lang.org/std/macro.panic!.html
-    pub fn value_of<S: AsRef<str>>(&self, name: S) -> Option<&str> {
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            if let Some(v) = arg.vals.get(0) {
-                return Some(v.to_str().expect(INVALID_UTF8));
-            }
-        }
-        None
-    }
-
-    /// Gets the lossy value of a specific argument. If the argument wasn't present at runtime
-    /// it returns `None`. A lossy value is one which contains invalid UTF-8 code points, those
-    /// invalid points will be replaced with `\u{FFFD}`
-    ///
-    /// *NOTE:* If getting a value for an option or positional argument that allows multiples,
-    /// prefer [`Arg::values_of_lossy`] as `value_of_lossy()` will only return the *first* value.
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc = " ```ignore")]
-    #[cfg_attr(unix, doc = " ```")]
-    /// # use clap::{App, Arg};
-    /// use std::ffi::OsString;
-    /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
-    ///
-    /// let m = App::new("utf8")
-    ///     .arg(Arg::from_usage("<arg> 'some arg'"))
-    ///     .get_matches_from(vec![OsString::from("myprog"),
-    ///                             // "Hi {0xe9}!"
-    ///                             OsString::from_vec(vec![b'H', b'i', b' ', 0xe9, b'!'])]);
-    /// assert_eq!(&*m.value_of_lossy("arg").unwrap(), "Hi \u{FFFD}!");
-    /// ```
-    /// [`Arg::values_of_lossy`]: ./struct.ArgMatches.html#method.values_of_lossy
-    pub fn value_of_lossy<S: AsRef<str>>(&'a self, name: S) -> Option<Cow<'a, str>> {
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            if let Some(v) = arg.vals.get(0) {
-                return Some(v.to_string_lossy());
-            }
-        }
-        None
-    }
-
-    /// Gets the OS version of a string value of a specific argument. If the option wasn't present
-    /// at runtime it returns `None`. An OS value on Unix-like systems is any series of bytes,
-    /// regardless of whether or not they contain valid UTF-8 code points. Since [`String`]s in
-    /// Rust are guaranteed to be valid UTF-8, a valid filename on a Unix system as an argument
-    /// value may contain invalid UTF-8 code points.
-    ///
-    /// *NOTE:* If getting a value for an option or positional argument that allows multiples,
-    /// prefer [`ArgMatches::values_of_os`] as `Arg::value_of_os` will only return the *first*
-    /// value.
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc = " ```ignore")]
-    #[cfg_attr(unix, doc = " ```")]
-    /// # use clap::{App, Arg};
-    /// use std::ffi::OsString;
-    /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
-    ///
-    /// let m = App::new("utf8")
-    ///     .arg(Arg::from_usage("<arg> 'some arg'"))
-    ///     .get_matches_from(vec![OsString::from("myprog"),
-    ///                             // "Hi {0xe9}!"
-    ///                             OsString::from_vec(vec![b'H', b'i', b' ', 0xe9, b'!'])]);
-    /// assert_eq!(&*m.value_of_os("arg").unwrap().as_bytes(), [b'H', b'i', b' ', 0xe9, b'!']);
-    /// ```
-    /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
-    /// [`ArgMatches::values_of_os`]: ./struct.ArgMatches.html#method.values_of_os
-    pub fn value_of_os<S: AsRef<str>>(&self, name: S) -> Option<&OsStr> {
-        self.args
-            .get(name.as_ref())
-            .and_then(|arg| arg.vals.get(0).map(|v| v.as_os_str()))
-    }
-
-    /// Gets a [`Values`] struct which implements [`Iterator`] for values of a specific argument
-    /// (i.e. an argument that takes multiple values at runtime). If the option wasn't present at
-    /// runtime it returns `None`
-    ///
-    /// # Panics
-    ///
-    /// This method will panic if any of the values contain invalid UTF-8 code points.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("output")
-    ///         .multiple(true)
-    ///         .short("o")
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "-o", "val1", "val2", "val3"
-    ///     ]);
-    /// let vals: Vec<&str> = m.values_of("output").unwrap().collect();
-    /// assert_eq!(vals, ["val1", "val2", "val3"]);
-    /// ```
-    /// [`Values`]: ./struct.Values.html
-    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
-    pub fn values_of<S: AsRef<str>>(&'a self, name: S) -> Option<Values<'a>> {
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            fn to_str_slice(o: &OsString) -> &str {
-                o.to_str().expect(INVALID_UTF8)
-            }
-            let to_str_slice: fn(&OsString) -> &str = to_str_slice; // coerce to fn pointer
-            return Some(Values {
-                iter: arg.vals.iter().map(to_str_slice),
-            });
-        }
-        None
-    }
-
-    /// Gets the lossy values of a specific argument. If the option wasn't present at runtime
-    /// it returns `None`. A lossy value is one where if it contains invalid UTF-8 code points,
-    /// those invalid points will be replaced with `\u{FFFD}`
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc = " ```ignore")]
-    #[cfg_attr(unix, doc = " ```")]
-    /// # use clap::{App, Arg};
-    /// use std::ffi::OsString;
-    /// use std::os::unix::ffi::OsStringExt;
-    ///
-    /// let m = App::new("utf8")
-    ///     .arg(Arg::from_usage("<arg>... 'some arg'"))
-    ///     .get_matches_from(vec![OsString::from("myprog"),
-    ///                             // "Hi"
-    ///                             OsString::from_vec(vec![b'H', b'i']),
-    ///                             // "{0xe9}!"
-    ///                             OsString::from_vec(vec![0xe9, b'!'])]);
-    /// let mut itr = m.values_of_lossy("arg").unwrap().into_iter();
-    /// assert_eq!(&itr.next().unwrap()[..], "Hi");
-    /// assert_eq!(&itr.next().unwrap()[..], "\u{FFFD}!");
-    /// assert_eq!(itr.next(), None);
-    /// ```
-    pub fn values_of_lossy<S: AsRef<str>>(&'a self, name: S) -> Option<Vec<String>> {
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            return Some(
-                arg.vals
-                    .iter()
-                    .map(|v| v.to_string_lossy().into_owned())
-                    .collect(),
-            );
-        }
-        None
-    }
-
-    /// Gets a [`OsValues`] struct which is implements [`Iterator`] for [`OsString`] values of a
-    /// specific argument. If the option wasn't present at runtime it returns `None`. An OS value
-    /// on Unix-like systems is any series of bytes, regardless of whether or not they contain
-    /// valid UTF-8 code points. Since [`String`]s in Rust are guaranteed to be valid UTF-8, a valid
-    /// filename as an argument value on Linux (for example) may contain invalid UTF-8 code points.
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc = " ```ignore")]
-    #[cfg_attr(unix, doc = " ```")]
-    /// # use clap::{App, Arg};
-    /// use std::ffi::{OsStr,OsString};
-    /// use std::os::unix::ffi::{OsStrExt,OsStringExt};
-    ///
-    /// let m = App::new("utf8")
-    ///     .arg(Arg::from_usage("<arg>... 'some arg'"))
-    ///     .get_matches_from(vec![OsString::from("myprog"),
-    ///                                 // "Hi"
-    ///                                 OsString::from_vec(vec![b'H', b'i']),
-    ///                                 // "{0xe9}!"
-    ///                                 OsString::from_vec(vec![0xe9, b'!'])]);
-    ///
-    /// let mut itr = m.values_of_os("arg").unwrap().into_iter();
-    /// assert_eq!(itr.next(), Some(OsStr::new("Hi")));
-    /// assert_eq!(itr.next(), Some(OsStr::from_bytes(&[0xe9, b'!'])));
-    /// assert_eq!(itr.next(), None);
-    /// ```
-    /// [`OsValues`]: ./struct.OsValues.html
-    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
-    /// [`OsString`]: https://doc.rust-lang.org/std/ffi/struct.OsString.html
-    /// [`String`]: https://doc.rust-lang.org/std/string/struct.String.html
-    pub fn values_of_os<S: AsRef<str>>(&'a self, name: S) -> Option<OsValues<'a>> {
-        fn to_str_slice(o: &OsString) -> &OsStr {
-            &*o
-        }
-        let to_str_slice: fn(&'a OsString) -> &'a OsStr = to_str_slice; // coerce to fn pointer
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            return Some(OsValues {
-                iter: arg.vals.iter().map(to_str_slice),
-            });
-        }
-        None
-    }
-
-    /// Returns `true` if an argument was present at runtime, otherwise `false`.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "-d"
-    ///     ]);
-    ///
-    /// assert!(m.is_present("debug"));
-    /// ```
-    pub fn is_present<S: AsRef<str>>(&self, name: S) -> bool {
-        if let Some(ref sc) = self.subcommand {
-            if sc.name == name.as_ref() {
-                return true;
-            }
-        }
-        self.args.contains_key(name.as_ref())
-    }
-
-    /// Returns the number of times an argument was used at runtime. If an argument isn't present
-    /// it will return `0`.
-    ///
-    /// **NOTE:** This returns the number of times the argument was used, *not* the number of
-    /// values. For example, `-o val1 val2 val3 -o val4` would return `2` (2 occurrences, but 4
-    /// values).
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d")
-    ///         .multiple(true))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "-d", "-d", "-d"
-    ///     ]);
-    ///
-    /// assert_eq!(m.occurrences_of("debug"), 3);
-    /// ```
-    ///
-    /// This next example shows that counts actual uses of the argument, not just `-`'s
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d")
-    ///         .multiple(true))
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "-ddfd"
-    ///     ]);
-    ///
-    /// assert_eq!(m.occurrences_of("debug"), 3);
-    /// assert_eq!(m.occurrences_of("flag"), 1);
-    /// ```
-    pub fn occurrences_of<S: AsRef<str>>(&self, name: S) -> u64 {
-        self.args.get(name.as_ref()).map_or(0, |a| a.occurs)
-    }
-
-    /// Gets the starting index of the argument in respect to all other arguments. Indices are
-    /// similar to argv indices, but are not exactly 1:1.
-    ///
-    /// For flags (i.e. those arguments which don't have an associated value), indices refer
-    /// to occurrence of the switch, such as `-f`, or `--flag`. However, for options the indices
-    /// refer to the *values* `-o val` would therefore not represent two distinct indices, only the
-    /// index for `val` would be recorded. This is by design.
-    ///
-    /// Besides the flag/option descrepancy, the primary difference between an argv index and clap
-    /// index, is that clap continues counting once all arguments have properly seperated, whereas
-    /// an argv index does not.
-    ///
-    /// The examples should clear this up.
-    ///
-    /// *NOTE:* If an argument is allowed multiple times, this method will only give the *first*
-    /// index.
-    ///
-    /// # Examples
-    ///
-    /// The argv indices are listed in the comments below. See how they correspond to the clap
-    /// indices. Note that if it's not listed in a clap index, this is becuase it's not saved in
-    /// in an `ArgMatches` struct for querying.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myapp")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("option")
-    ///         .short("o")
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec!["myapp", "-f", "-o", "val"]);
-    ///             // ARGV idices: ^0       ^1    ^2    ^3
-    ///             // clap idices:          ^1          ^3
-    ///
-    /// assert_eq!(m.index_of("flag"), Some(1));
-    /// assert_eq!(m.index_of("option"), Some(3));
-    /// ```
-    ///
-    /// Now notice, if we use one of the other styles of options:
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myapp")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("option")
-    ///         .short("o")
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec!["myapp", "-f", "-o=val"]);
-    ///             // ARGV idices: ^0       ^1    ^2
-    ///             // clap idices:          ^1       ^3
-    ///
-    /// assert_eq!(m.index_of("flag"), Some(1));
-    /// assert_eq!(m.index_of("option"), Some(3));
-    /// ```
-    ///
-    /// Things become much more complicated, or clear if we look at a more complex combination of
-    /// flags. Let's also throw in the final option style for good measure.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myapp")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("flag2")
-    ///         .short("F"))
-    ///     .arg(Arg::with_name("flag3")
-    ///         .short("z"))
-    ///     .arg(Arg::with_name("option")
-    ///         .short("o")
-    ///         .takes_value(true))
-    ///     .get_matches_from(vec!["myapp", "-fzF", "-oval"]);
-    ///             // ARGV idices: ^0      ^1       ^2
-    ///             // clap idices:         ^1,2,3    ^5
-    ///             //
-    ///             // clap sees the above as 'myapp -f -z -F -o val'
-    ///             //                         ^0    ^1 ^2 ^3 ^4 ^5
-    /// assert_eq!(m.index_of("flag"), Some(1));
-    /// assert_eq!(m.index_of("flag2"), Some(3));
-    /// assert_eq!(m.index_of("flag3"), Some(2));
-    /// assert_eq!(m.index_of("option"), Some(5));
-    /// ```
-    ///
-    /// One final combination of flags/options to see how they combine:
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myapp")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("flag2")
-    ///         .short("F"))
-    ///     .arg(Arg::with_name("flag3")
-    ///         .short("z"))
-    ///     .arg(Arg::with_name("option")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .multiple(true))
-    ///     .get_matches_from(vec!["myapp", "-fzFoval"]);
-    ///             // ARGV idices: ^0       ^1
-    ///             // clap idices:          ^1,2,3^5
-    ///             //
-    ///             // clap sees the above as 'myapp -f -z -F -o val'
-    ///             //                         ^0    ^1 ^2 ^3 ^4 ^5
-    /// assert_eq!(m.index_of("flag"), Some(1));
-    /// assert_eq!(m.index_of("flag2"), Some(3));
-    /// assert_eq!(m.index_of("flag3"), Some(2));
-    /// assert_eq!(m.index_of("option"), Some(5));
-    /// ```
-    ///
-    /// The last part to mention is when values are sent in multiple groups with a [delimiter].
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myapp")
-    ///     .arg(Arg::with_name("option")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .multiple(true))
-    ///     .get_matches_from(vec!["myapp", "-o=val1,val2,val3"]);
-    ///             // ARGV idices: ^0       ^1
-    ///             // clap idices:             ^2   ^3   ^4
-    ///             //
-    ///             // clap sees the above as 'myapp -o val1 val2 val3'
-    ///             //                         ^0    ^1 ^2   ^3   ^4
-    /// assert_eq!(m.index_of("option"), Some(2));
-    /// ```
-    /// [`ArgMatches`]: ./struct.ArgMatches.html
-    /// [delimiter]: ./struct.Arg.html#method.value_delimiter
-    pub fn index_of<S: AsRef<str>>(&self, name: S) -> Option<usize> {
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            if let Some(i) = arg.indices.get(0) {
-                return Some(*i);
-            }
-        }
-        None
-    }
-
-    /// Gets all indices of the argument in respect to all other arguments. Indices are
-    /// similar to argv indices, but are not exactly 1:1.
-    ///
-    /// For flags (i.e. those arguments which don't have an associated value), indices refer
-    /// to occurrence of the switch, such as `-f`, or `--flag`. However, for options the indices
-    /// refer to the *values* `-o val` would therefore not represent two distinct indices, only the
-    /// index for `val` would be recorded. This is by design.
-    ///
-    /// *NOTE:* For more information about how clap indices compare to argv indices, see
-    /// [`ArgMatches::index_of`]
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myapp")
-    ///     .arg(Arg::with_name("option")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .use_delimiter(true)
-    ///         .multiple(true))
-    ///     .get_matches_from(vec!["myapp", "-o=val1,val2,val3"]);
-    ///             // ARGV idices: ^0       ^1
-    ///             // clap idices:             ^2   ^3   ^4
-    ///             //
-    ///             // clap sees the above as 'myapp -o val1 val2 val3'
-    ///             //                         ^0    ^1 ^2   ^3   ^4
-    /// assert_eq!(m.indices_of("option").unwrap().collect::<Vec<_>>(), &[2, 3, 4]);
-    /// ```
-    ///
-    /// Another quick example is when flags and options are used together
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myapp")
-    ///     .arg(Arg::with_name("option")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .multiple(true))
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f")
-    ///         .multiple(true))
-    ///     .get_matches_from(vec!["myapp", "-o", "val1", "-f", "-o", "val2", "-f"]);
-    ///             // ARGV idices: ^0       ^1    ^2      ^3    ^4    ^5      ^6
-    ///             // clap idices:                ^2      ^3          ^5      ^6
-    ///
-    /// assert_eq!(m.indices_of("option").unwrap().collect::<Vec<_>>(), &[2, 5]);
-    /// assert_eq!(m.indices_of("flag").unwrap().collect::<Vec<_>>(), &[3, 6]);
-    /// ```
-    ///
-    /// One final example, which is an odd case; if we *don't* use  value delimiter as we did with
-    /// the first example above instead of `val1`, `val2` and `val3` all being distinc values, they
-    /// would all be a single value of `val1,val2,val3`, in which case case they'd only receive a
-    /// single index.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg};
-    /// let m = App::new("myapp")
-    ///     .arg(Arg::with_name("option")
-    ///         .short("o")
-    ///         .takes_value(true)
-    ///         .multiple(true))
-    ///     .get_matches_from(vec!["myapp", "-o=val1,val2,val3"]);
-    ///             // ARGV idices: ^0       ^1
-    ///             // clap idices:             ^2
-    ///             //
-    ///             // clap sees the above as 'myapp -o "val1,val2,val3"'
-    ///             //                         ^0    ^1  ^2
-    /// assert_eq!(m.indices_of("option").unwrap().collect::<Vec<_>>(), &[2]);
-    /// ```
-    /// [`ArgMatches`]: ./struct.ArgMatches.html
-    /// [`ArgMatches::index_of`]: ./struct.ArgMatches.html#method.index_of
-    /// [delimiter]: ./struct.Arg.html#method.value_delimiter
-    pub fn indices_of<S: AsRef<str>>(&'a self, name: S) -> Option<Indices<'a>> {
-        if let Some(arg) = self.args.get(name.as_ref()) {
-            fn to_usize(i: &usize) -> usize {
-                *i
-            }
-            let to_usize: fn(&usize) -> usize = to_usize; // coerce to fn pointer
-            return Some(Indices {
-                iter: arg.indices.iter().map(to_usize),
-            });
-        }
-        None
-    }
-
-    /// Because [`Subcommand`]s are essentially "sub-[`App`]s" they have their own [`ArgMatches`]
-    /// as well. This method returns the [`ArgMatches`] for a particular subcommand or `None` if
-    /// the subcommand wasn't present at runtime.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, SubCommand};
-    /// let app_m = App::new("myprog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .subcommand(SubCommand::with_name("test")
-    ///         .arg(Arg::with_name("opt")
-    ///             .long("option")
-    ///             .takes_value(true)))
-    ///     .get_matches_from(vec![
-    ///         "myprog", "-d", "test", "--option", "val"
-    ///     ]);
-    ///
-    /// // Both parent commands, and child subcommands can have arguments present at the same times
-    /// assert!(app_m.is_present("debug"));
-    ///
-    /// // Get the subcommand's ArgMatches instance
-    /// if let Some(sub_m) = app_m.subcommand_matches("test") {
-    ///     // Use the struct like normal
-    ///     assert_eq!(sub_m.value_of("opt"), Some("val"));
-    /// }
-    /// ```
-    /// [`Subcommand`]: ./struct.SubCommand.html
-    /// [`App`]: ./struct.App.html
-    /// [`ArgMatches`]: ./struct.ArgMatches.html
-    pub fn subcommand_matches<S: AsRef<str>>(&self, name: S) -> Option<&ArgMatches<'a>> {
-        if let Some(ref s) = self.subcommand {
-            if s.name == name.as_ref() {
-                return Some(&s.matches);
-            }
-        }
-        None
-    }
-
-    /// Because [`Subcommand`]s are essentially "sub-[`App`]s" they have their own [`ArgMatches`]
-    /// as well.But simply getting the sub-[`ArgMatches`] doesn't help much if we don't also know
-    /// which subcommand was actually used. This method returns the name of the subcommand that was
-    /// used at runtime, or `None` if one wasn't.
-    ///
-    /// *NOTE*: Subcommands form a hierarchy, where multiple subcommands can be used at runtime,
-    /// but only a single subcommand from any group of sibling commands may used at once.
-    ///
-    /// An ASCII art depiction may help explain this better...Using a fictional version of `git` as
-    /// the demo subject. Imagine the following are all subcommands of `git` (note, the author is
-    /// aware these aren't actually all subcommands in the real `git` interface, but it makes
-    /// explanation easier)
-    ///
-    /// ```notrust
-    ///              Top Level App (git)                         TOP
-    ///                              |
-    ///       -----------------------------------------
-    ///      /             |                \          \
-    ///   clone          push              add       commit      LEVEL 1
-    ///     |           /    \            /    \       |
-    ///    url      origin   remote    ref    name   message     LEVEL 2
-    ///             /                  /\
-    ///          path            remote  local                   LEVEL 3
-    /// ```
-    ///
-    /// Given the above fictional subcommand hierarchy, valid runtime uses would be (not an all
-    /// inclusive list, and not including argument options per command for brevity and clarity):
-    ///
-    /// ```sh
-    /// $ git clone url
-    /// $ git push origin path
-    /// $ git add ref local
-    /// $ git commit message
-    /// ```
-    ///
-    /// Notice only one command per "level" may be used. You could not, for example, do `$ git
-    /// clone url push origin path`
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    ///  let app_m = App::new("git")
-    ///      .subcommand(SubCommand::with_name("clone"))
-    ///      .subcommand(SubCommand::with_name("push"))
-    ///      .subcommand(SubCommand::with_name("commit"))
-    ///      .get_matches();
-    ///
-    /// match app_m.subcommand_name() {
-    ///     Some("clone")  => {}, // clone was used
-    ///     Some("push")   => {}, // push was used
-    ///     Some("commit") => {}, // commit was used
-    ///     _              => {}, // Either no subcommand or one not tested for...
-    /// }
-    /// ```
-    /// [`Subcommand`]: ./struct.SubCommand.html
-    /// [`App`]: ./struct.App.html
-    /// [`ArgMatches`]: ./struct.ArgMatches.html
-    pub fn subcommand_name(&self) -> Option<&str> {
-        self.subcommand.as_ref().map(|sc| &sc.name[..])
-    }
-
-    /// This brings together [`ArgMatches::subcommand_matches`] and [`ArgMatches::subcommand_name`]
-    /// by returning a tuple with both pieces of information.
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    ///  let app_m = App::new("git")
-    ///      .subcommand(SubCommand::with_name("clone"))
-    ///      .subcommand(SubCommand::with_name("push"))
-    ///      .subcommand(SubCommand::with_name("commit"))
-    ///      .get_matches();
-    ///
-    /// match app_m.subcommand() {
-    ///     ("clone",  Some(sub_m)) => {}, // clone was used
-    ///     ("push",   Some(sub_m)) => {}, // push was used
-    ///     ("commit", Some(sub_m)) => {}, // commit was used
-    ///     _                       => {}, // Either no subcommand or one not tested for...
-    /// }
-    /// ```
-    ///
-    /// Another useful scenario is when you want to support third party, or external, subcommands.
-    /// In these cases you can't know the subcommand name ahead of time, so use a variable instead
-    /// with pattern matching!
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings};
-    /// // Assume there is an external subcommand named "subcmd"
-    /// let app_m = App::new("myprog")
-    ///     .setting(AppSettings::AllowExternalSubcommands)
-    ///     .get_matches_from(vec![
-    ///         "myprog", "subcmd", "--option", "value", "-fff", "--flag"
-    ///     ]);
-    ///
-    /// // All trailing arguments will be stored under the subcommand's sub-matches using an empty
-    /// // string argument name
-    /// match app_m.subcommand() {
-    ///     (external, Some(sub_m)) => {
-    ///          let ext_args: Vec<&str> = sub_m.values_of("").unwrap().collect();
-    ///          assert_eq!(external, "subcmd");
-    ///          assert_eq!(ext_args, ["--option", "value", "-fff", "--flag"]);
-    ///     },
-    ///     _ => {},
-    /// }
-    /// ```
-    /// [`ArgMatches::subcommand_matches`]: ./struct.ArgMatches.html#method.subcommand_matches
-    /// [`ArgMatches::subcommand_name`]: ./struct.ArgMatches.html#method.subcommand_name
-    pub fn subcommand(&self) -> (&str, Option<&ArgMatches<'a>>) {
-        self.subcommand
-            .as_ref()
-            .map_or(("", None), |sc| (&sc.name[..], Some(&sc.matches)))
-    }
-
-    /// Returns a string slice of the usage statement for the [`App`] or [`SubCommand`]
-    ///
-    /// # Examples
-    ///
-    /// ```no_run
-    /// # use clap::{App, Arg, SubCommand};
-    /// let app_m = App::new("myprog")
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches();
-    ///
-    /// println!("{}", app_m.usage());
-    /// ```
-    /// [`Subcommand`]: ./struct.SubCommand.html
-    /// [`App`]: ./struct.App.html
-    pub fn usage(&self) -> &str {
-        self.usage.as_ref().map_or("", |u| &u[..])
-    }
-}
-
-// The following were taken and adapated from vec_map source
-// repo: https://github.com/contain-rs/vec-map
-// commit: be5e1fa3c26e351761b33010ddbdaf5f05dbcc33
-// license: MIT - Copyright (c) 2015 The Rust Project Developers
-
-/// An iterator for getting multiple values out of an argument via the [`ArgMatches::values_of`]
-/// method.
-///
-/// # Examples
-///
-/// ```rust
-/// # use clap::{App, Arg};
-/// let m = App::new("myapp")
-///     .arg(Arg::with_name("output")
-///         .short("o")
-///         .multiple(true)
-///         .takes_value(true))
-///     .get_matches_from(vec!["myapp", "-o", "val1", "val2"]);
-///
-/// let mut values = m.values_of("output").unwrap();
-///
-/// assert_eq!(values.next(), Some("val1"));
-/// assert_eq!(values.next(), Some("val2"));
-/// assert_eq!(values.next(), None);
-/// ```
-/// [`ArgMatches::values_of`]: ./struct.ArgMatches.html#method.values_of
-#[derive(Debug, Clone)]
-pub struct Values<'a> {
-    iter: Map<Iter<'a, OsString>, fn(&'a OsString) -> &'a str>,
-}
-
-impl<'a> Iterator for Values<'a> {
-    type Item = &'a str;
-
-    fn next(&mut self) -> Option<&'a str> {
-        self.iter.next()
-    }
-    fn size_hint(&self) -> (usize, Option<usize>) {
-        self.iter.size_hint()
-    }
-}
-
-impl<'a> DoubleEndedIterator for Values<'a> {
-    fn next_back(&mut self) -> Option<&'a str> {
-        self.iter.next_back()
-    }
-}
-
-impl<'a> ExactSizeIterator for Values<'a> {}
-
-/// Creates an empty iterator.
-impl<'a> Default for Values<'a> {
-    fn default() -> Self {
-        static EMPTY: [OsString; 0] = [];
-        // This is never called because the iterator is empty:
-        fn to_str_slice(_: &OsString) -> &str {
-            unreachable!()
-        };
-        Values {
-            iter: EMPTY[..].iter().map(to_str_slice),
-        }
-    }
-}
-
-/// An iterator for getting multiple values out of an argument via the [`ArgMatches::values_of_os`]
-/// method. Usage of this iterator allows values which contain invalid UTF-8 code points unlike
-/// [`Values`].
-///
-/// # Examples
-///
-#[cfg_attr(not(unix), doc = " ```ignore")]
-#[cfg_attr(unix, doc = " ```")]
-/// # use clap::{App, Arg};
-/// use std::ffi::OsString;
-/// use std::os::unix::ffi::{OsStrExt,OsStringExt};
-///
-/// let m = App::new("utf8")
-///     .arg(Arg::from_usage("<arg> 'some arg'"))
-///     .get_matches_from(vec![OsString::from("myprog"),
-///                             // "Hi {0xe9}!"
-///                             OsString::from_vec(vec![b'H', b'i', b' ', 0xe9, b'!'])]);
-/// assert_eq!(&*m.value_of_os("arg").unwrap().as_bytes(), [b'H', b'i', b' ', 0xe9, b'!']);
-/// ```
-/// [`ArgMatches::values_of_os`]: ./struct.ArgMatches.html#method.values_of_os
-/// [`Values`]: ./struct.Values.html
-#[derive(Debug, Clone)]
-pub struct OsValues<'a> {
-    iter: Map<Iter<'a, OsString>, fn(&'a OsString) -> &'a OsStr>,
-}
-
-impl<'a> Iterator for OsValues<'a> {
-    type Item = &'a OsStr;
-
-    fn next(&mut self) -> Option<&'a OsStr> {
-        self.iter.next()
-    }
-    fn size_hint(&self) -> (usize, Option<usize>) {
-        self.iter.size_hint()
-    }
-}
-
-impl<'a> DoubleEndedIterator for OsValues<'a> {
-    fn next_back(&mut self) -> Option<&'a OsStr> {
-        self.iter.next_back()
-    }
-}
-
-impl<'a> ExactSizeIterator for OsValues<'a> {}
-
-/// Creates an empty iterator.
-impl<'a> Default for OsValues<'a> {
-    fn default() -> Self {
-        static EMPTY: [OsString; 0] = [];
-        // This is never called because the iterator is empty:
-        fn to_str_slice(_: &OsString) -> &OsStr {
-            unreachable!()
-        };
-        OsValues {
-            iter: EMPTY[..].iter().map(to_str_slice),
-        }
-    }
-}
-
-/// An iterator for getting multiple indices out of an argument via the [`ArgMatches::indices_of`]
-/// method.
-///
-/// # Examples
-///
-/// ```rust
-/// # use clap::{App, Arg};
-/// let m = App::new("myapp")
-///     .arg(Arg::with_name("output")
-///         .short("o")
-///         .multiple(true)
-///         .takes_value(true))
-///     .get_matches_from(vec!["myapp", "-o", "val1", "val2"]);
-///
-/// let mut indices = m.indices_of("output").unwrap();
-///
-/// assert_eq!(indices.next(), Some(2));
-/// assert_eq!(indices.next(), Some(3));
-/// assert_eq!(indices.next(), None);
-/// ```
-/// [`ArgMatches::indices_of`]: ./struct.ArgMatches.html#method.indices_of
-#[derive(Debug, Clone)]
-pub struct Indices<'a> {
-    // would rather use '_, but: https://github.com/rust-lang/rust/issues/48469
-    iter: Map<Iter<'a, usize>, fn(&'a usize) -> usize>,
-}
-
-impl<'a> Iterator for Indices<'a> {
-    type Item = usize;
-
-    fn next(&mut self) -> Option<usize> {
-        self.iter.next()
-    }
-    fn size_hint(&self) -> (usize, Option<usize>) {
-        self.iter.size_hint()
-    }
-}
-
-impl<'a> DoubleEndedIterator for Indices<'a> {
-    fn next_back(&mut self) -> Option<usize> {
-        self.iter.next_back()
-    }
-}
-
-impl<'a> ExactSizeIterator for Indices<'a> {}
-
-/// Creates an empty iterator.
-impl<'a> Default for Indices<'a> {
-    fn default() -> Self {
-        static EMPTY: [usize; 0] = [];
-        // This is never called because the iterator is empty:
-        fn to_usize(_: &usize) -> usize {
-            unreachable!()
-        };
-        Indices {
-            iter: EMPTY[..].iter().map(to_usize),
-        }
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn test_default_values() {
-        let mut values: Values = Values::default();
-        assert_eq!(values.next(), None);
-    }
-
-    #[test]
-    fn test_default_values_with_shorter_lifetime() {
-        let matches = ArgMatches::new();
-        let mut values = matches.values_of("").unwrap_or_default();
-        assert_eq!(values.next(), None);
-    }
-
-    #[test]
-    fn test_default_osvalues() {
-        let mut values: OsValues = OsValues::default();
-        assert_eq!(values.next(), None);
-    }
-
-    #[test]
-    fn test_default_osvalues_with_shorter_lifetime() {
-        let matches = ArgMatches::new();
-        let mut values = matches.values_of_os("").unwrap_or_default();
-        assert_eq!(values.next(), None);
-    }
-
-    #[test]
-    fn test_default_indices() {
-        let mut indices: Indices = Indices::default();
-        assert_eq!(indices.next(), None);
-    }
-
-    #[test]
-    fn test_default_indices_with_shorter_lifetime() {
-        let matches = ArgMatches::new();
-        let mut indices = matches.indices_of("").unwrap_or_default();
-        assert_eq!(indices.next(), None);
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/group.rs b/third_party/rust/clap/v2/crate/src/args/group.rs
deleted file mode 100644
index 8103a9c..0000000
--- a/third_party/rust/clap/v2/crate/src/args/group.rs
+++ /dev/null
@@ -1,638 +0,0 @@
-#[cfg(feature = "yaml")]
-use std::collections::BTreeMap;
-use std::fmt::{Debug, Formatter, Result};
-
-#[cfg(feature = "yaml")]
-use yaml_rust::Yaml;
-
-/// `ArgGroup`s are a family of related [arguments] and way for you to express, "Any of these
-/// arguments". By placing arguments in a logical group, you can create easier requirement and
-/// exclusion rules instead of having to list each argument individually, or when you want a rule
-/// to apply "any but not all" arguments.
-///
-/// For instance, you can make an entire `ArgGroup` required. If [`ArgGroup::multiple(true)`] is
-/// set, this means that at least one argument from that group must be present. If
-/// [`ArgGroup::multiple(false)`] is set (the default), one and *only* one must be present.
-///
-/// You can also do things such as name an entire `ArgGroup` as a [conflict] or [requirement] for
-/// another argument, meaning any of the arguments that belong to that group will cause a failure
-/// if present, or must present respectively.
-///
-/// Perhaps the most common use of `ArgGroup`s is to require one and *only* one argument to be
-/// present out of a given set. Imagine that you had multiple arguments, and you want one of them
-/// to be required, but making all of them required isn't feasible because perhaps they conflict
-/// with each other. For example, lets say that you were building an application where one could
-/// set a given version number by supplying a string with an option argument, i.e.
-/// `--set-ver v1.2.3`, you also wanted to support automatically using a previous version number
-/// and simply incrementing one of the three numbers. So you create three flags `--major`,
-/// `--minor`, and `--patch`. All of these arguments shouldn't be used at one time but you want to
-/// specify that *at least one* of them is used. For this, you can create a group.
-///
-/// Finally, you may use `ArgGroup`s to pull a value from a group of arguments when you don't care
-/// exactly which argument was actually used at runtime.
-///
-/// # Examples
-///
-/// The following example demonstrates using an `ArgGroup` to ensure that one, and only one, of
-/// the arguments from the specified group is present at runtime.
-///
-/// ```rust
-/// # use clap::{App, ArgGroup, ErrorKind};
-/// let result = App::new("app")
-///     .args_from_usage(
-///         "--set-ver [ver] 'set the version manually'
-///          --major         'auto increase major'
-///          --minor         'auto increase minor'
-///          --patch         'auto increase patch'")
-///     .group(ArgGroup::with_name("vers")
-///          .args(&["set-ver", "major", "minor", "patch"])
-///          .required(true))
-///     .get_matches_from_safe(vec!["app", "--major", "--patch"]);
-/// // Because we used two args in the group it's an error
-/// assert!(result.is_err());
-/// let err = result.unwrap_err();
-/// assert_eq!(err.kind, ErrorKind::ArgumentConflict);
-/// ```
-/// This next example shows a passing parse of the same scenario
-///
-/// ```rust
-/// # use clap::{App, ArgGroup};
-/// let result = App::new("app")
-///     .args_from_usage(
-///         "--set-ver [ver] 'set the version manually'
-///          --major         'auto increase major'
-///          --minor         'auto increase minor'
-///          --patch         'auto increase patch'")
-///     .group(ArgGroup::with_name("vers")
-///          .args(&["set-ver", "major", "minor","patch"])
-///          .required(true))
-///     .get_matches_from_safe(vec!["app", "--major"]);
-/// assert!(result.is_ok());
-/// let matches = result.unwrap();
-/// // We may not know which of the args was used, so we can test for the group...
-/// assert!(matches.is_present("vers"));
-/// // we could also alternatively check each arg individually (not shown here)
-/// ```
-/// [`ArgGroup::multiple(true)`]: ./struct.ArgGroup.html#method.multiple
-/// [arguments]: ./struct.Arg.html
-/// [conflict]: ./struct.Arg.html#method.conflicts_with
-/// [requirement]: ./struct.Arg.html#method.requires
-#[derive(Default)]
-pub struct ArgGroup<'a> {
-    #[doc(hidden)]
-    pub name: &'a str,
-    #[doc(hidden)]
-    pub args: Vec<&'a str>,
-    #[doc(hidden)]
-    pub required: bool,
-    #[doc(hidden)]
-    pub requires: Option<Vec<&'a str>>,
-    #[doc(hidden)]
-    pub conflicts: Option<Vec<&'a str>>,
-    #[doc(hidden)]
-    pub multiple: bool,
-}
-
-impl<'a> ArgGroup<'a> {
-    /// Creates a new instance of `ArgGroup` using a unique string name. The name will be used to
-    /// get values from the group or refer to the group inside of conflict and requirement rules.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, ArgGroup};
-    /// ArgGroup::with_name("config")
-    /// # ;
-    /// ```
-    pub fn with_name(n: &'a str) -> Self {
-        ArgGroup {
-            name: n,
-            required: false,
-            args: vec![],
-            requires: None,
-            conflicts: None,
-            multiple: false,
-        }
-    }
-
-    /// Creates a new instance of `ArgGroup` from a .yml (YAML) file.
-    ///
-    /// # Examples
-    ///
-    /// ```ignore
-    /// # #[macro_use]
-    /// # extern crate clap;
-    /// # use clap::ArgGroup;
-    /// # fn main() {
-    /// let yml = load_yaml!("group.yml");
-    /// let ag = ArgGroup::from_yaml(yml);
-    /// # }
-    /// ```
-    #[cfg(feature = "yaml")]
-    pub fn from_yaml(y: &'a Yaml) -> ArgGroup<'a> {
-        ArgGroup::from(y.as_hash().unwrap())
-    }
-
-    /// Adds an [argument] to this group by name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .arg("flag")
-    ///         .arg("color"))
-    ///     .get_matches_from(vec!["myprog", "-f"]);
-    /// // maybe we don't know which of the two flags was used...
-    /// assert!(m.is_present("req_flags"));
-    /// // but we can also check individually if needed
-    /// assert!(m.is_present("flag"));
-    /// ```
-    /// [argument]: ./struct.Arg.html
-    #[cfg_attr(feature = "lints", allow(should_assert_eq))]
-    pub fn arg(mut self, n: &'a str) -> Self {
-        assert!(
-            self.name != n,
-            "ArgGroup '{}' can not have same name as arg inside it",
-            &*self.name
-        );
-        self.args.push(n);
-        self
-    }
-
-    /// Adds multiple [arguments] to this group by name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"]))
-    ///     .get_matches_from(vec!["myprog", "-f"]);
-    /// // maybe we don't know which of the two flags was used...
-    /// assert!(m.is_present("req_flags"));
-    /// // but we can also check individually if needed
-    /// assert!(m.is_present("flag"));
-    /// ```
-    /// [arguments]: ./struct.Arg.html
-    pub fn args(mut self, ns: &[&'a str]) -> Self {
-        for n in ns {
-            self = self.arg(n);
-        }
-        self
-    }
-
-    /// Allows more than one of the ['Arg']s in this group to be used. (Default: `false`)
-    ///
-    /// # Examples
-    ///
-    /// Notice in this example we use *both* the `-f` and `-c` flags which are both part of the
-    /// group
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup};
-    /// let m = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .multiple(true))
-    ///     .get_matches_from(vec!["myprog", "-f", "-c"]);
-    /// // maybe we don't know which of the two flags was used...
-    /// assert!(m.is_present("req_flags"));
-    /// ```
-    /// In this next example, we show the default behavior (i.e. `multiple(false)) which will throw
-    /// an error if more than one of the args in the group was used.
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"]))
-    ///     .get_matches_from_safe(vec!["myprog", "-f", "-c"]);
-    /// // Because we used both args in the group it's an error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::ArgumentConflict);
-    /// ```
-    /// ['Arg']: ./struct.Arg.html
-    pub fn multiple(mut self, m: bool) -> Self {
-        self.multiple = m;
-        self
-    }
-
-    /// Sets the group as required or not. A required group will be displayed in the usage string
-    /// of the application in the format `<arg|arg2|arg3>`. A required `ArgGroup` simply states
-    /// that one argument from this group *must* be present at runtime (unless
-    /// conflicting with another argument).
-    ///
-    /// **NOTE:** This setting only applies to the current [`App`] / [`SubCommand`], and not
-    /// globally.
-    ///
-    /// **NOTE:** By default, [`ArgGroup::multiple`] is set to `false` which when combined with
-    /// `ArgGroup::required(true)` states, "One and *only one* arg must be used from this group.
-    /// Use of more than one arg is an error." Vice setting `ArgGroup::multiple(true)` which
-    /// states, '*At least* one arg from this group must be used. Using multiple is OK."
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .required(true))
-    ///     .get_matches_from_safe(vec!["myprog"]);
-    /// // Because we didn't use any of the args in the group, it's an error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [`App`]: ./struct.App.html
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`ArgGroup::multiple`]: ./struct.ArgGroup.html#method.multiple
-    pub fn required(mut self, r: bool) -> Self {
-        self.required = r;
-        self
-    }
-
-    /// Sets the requirement rules of this group. This is not to be confused with a
-    /// [required group]. Requirement rules function just like [argument requirement rules], you
-    /// can name other arguments or groups that must be present when any one of the arguments from
-    /// this group is used.
-    ///
-    /// **NOTE:** The name provided may be an argument, or group name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .requires("debug"))
-    ///     .get_matches_from_safe(vec!["myprog", "-c"]);
-    /// // because we used an arg from the group, and the group requires "-d" to be used, it's an
-    /// // error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [required group]: ./struct.ArgGroup.html#method.required
-    /// [argument requirement rules]: ./struct.Arg.html#method.requires
-    pub fn requires(mut self, n: &'a str) -> Self {
-        if let Some(ref mut reqs) = self.requires {
-            reqs.push(n);
-        } else {
-            self.requires = Some(vec![n]);
-        }
-        self
-    }
-
-    /// Sets the requirement rules of this group. This is not to be confused with a
-    /// [required group]. Requirement rules function just like [argument requirement rules], you
-    /// can name other arguments or groups that must be present when one of the arguments from this
-    /// group is used.
-    ///
-    /// **NOTE:** The names provided may be an argument, or group name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .arg(Arg::with_name("verb")
-    ///         .short("v"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .requires_all(&["debug", "verb"]))
-    ///     .get_matches_from_safe(vec!["myprog", "-c", "-d"]);
-    /// // because we used an arg from the group, and the group requires "-d" and "-v" to be used,
-    /// // yet we only used "-d" it's an error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    /// [required group]: ./struct.ArgGroup.html#method.required
-    /// [argument requirement rules]: ./struct.Arg.html#method.requires_all
-    pub fn requires_all(mut self, ns: &[&'a str]) -> Self {
-        for n in ns {
-            self = self.requires(n);
-        }
-        self
-    }
-
-    /// Sets the exclusion rules of this group. Exclusion (aka conflict) rules function just like
-    /// [argument exclusion rules], you can name other arguments or groups that must *not* be
-    /// present when one of the arguments from this group are used.
-    ///
-    /// **NOTE:** The name provided may be an argument, or group name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .conflicts_with("debug"))
-    ///     .get_matches_from_safe(vec!["myprog", "-c", "-d"]);
-    /// // because we used an arg from the group, and the group conflicts with "-d", it's an error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::ArgumentConflict);
-    /// ```
-    /// [argument exclusion rules]: ./struct.Arg.html#method.conflicts_with
-    pub fn conflicts_with(mut self, n: &'a str) -> Self {
-        if let Some(ref mut confs) = self.conflicts {
-            confs.push(n);
-        } else {
-            self.conflicts = Some(vec![n]);
-        }
-        self
-    }
-
-    /// Sets the exclusion rules of this group. Exclusion rules function just like
-    /// [argument exclusion rules], you can name other arguments or groups that must *not* be
-    /// present when one of the arguments from this group are used.
-    ///
-    /// **NOTE:** The names provided may be an argument, or group name
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ArgGroup, ErrorKind};
-    /// let result = App::new("myprog")
-    ///     .arg(Arg::with_name("flag")
-    ///         .short("f"))
-    ///     .arg(Arg::with_name("color")
-    ///         .short("c"))
-    ///     .arg(Arg::with_name("debug")
-    ///         .short("d"))
-    ///     .arg(Arg::with_name("verb")
-    ///         .short("v"))
-    ///     .group(ArgGroup::with_name("req_flags")
-    ///         .args(&["flag", "color"])
-    ///         .conflicts_with_all(&["debug", "verb"]))
-    ///     .get_matches_from_safe(vec!["myprog", "-c", "-v"]);
-    /// // because we used an arg from the group, and the group conflicts with either "-v" or "-d"
-    /// // it's an error
-    /// assert!(result.is_err());
-    /// let err = result.unwrap_err();
-    /// assert_eq!(err.kind, ErrorKind::ArgumentConflict);
-    /// ```
-    /// [argument exclusion rules]: ./struct.Arg.html#method.conflicts_with_all
-    pub fn conflicts_with_all(mut self, ns: &[&'a str]) -> Self {
-        for n in ns {
-            self = self.conflicts_with(n);
-        }
-        self
-    }
-}
-
-impl<'a> Debug for ArgGroup<'a> {
-    fn fmt(&self, f: &mut Formatter) -> Result {
-        write!(
-            f,
-            "{{\n\
-             \tname: {:?},\n\
-             \targs: {:?},\n\
-             \trequired: {:?},\n\
-             \trequires: {:?},\n\
-             \tconflicts: {:?},\n\
-             }}",
-            self.name, self.args, self.required, self.requires, self.conflicts
-        )
-    }
-}
-
-impl<'a, 'z> From<&'z ArgGroup<'a>> for ArgGroup<'a> {
-    fn from(g: &'z ArgGroup<'a>) -> Self {
-        ArgGroup {
-            name: g.name,
-            required: g.required,
-            args: g.args.clone(),
-            requires: g.requires.clone(),
-            conflicts: g.conflicts.clone(),
-            multiple: g.multiple,
-        }
-    }
-}
-
-#[cfg(feature = "yaml")]
-impl<'a> From<&'a BTreeMap<Yaml, Yaml>> for ArgGroup<'a> {
-    fn from(b: &'a BTreeMap<Yaml, Yaml>) -> Self {
-        // We WANT this to panic on error...so expect() is good.
-        let mut a = ArgGroup::default();
-        let group_settings = if b.len() == 1 {
-            let name_yml = b.keys().nth(0).expect("failed to get name");
-            let name_str = name_yml
-                .as_str()
-                .expect("failed to convert arg YAML name to str");
-            a.name = name_str;
-            b.get(name_yml)
-                .expect("failed to get name_str")
-                .as_hash()
-                .expect("failed to convert to a hash")
-        } else {
-            b
-        };
-
-        for (k, v) in group_settings {
-            a = match k.as_str().unwrap() {
-                "required" => a.required(v.as_bool().unwrap()),
-                "multiple" => a.multiple(v.as_bool().unwrap()),
-                "args" => yaml_vec_or_str!(v, a, arg),
-                "arg" => {
-                    if let Some(ys) = v.as_str() {
-                        a = a.arg(ys);
-                    }
-                    a
-                }
-                "requires" => yaml_vec_or_str!(v, a, requires),
-                "conflicts_with" => yaml_vec_or_str!(v, a, conflicts_with),
-                "name" => {
-                    if let Some(ys) = v.as_str() {
-                        a.name = ys;
-                    }
-                    a
-                }
-                s => panic!(
-                    "Unknown ArgGroup setting '{}' in YAML file for \
-                     ArgGroup '{}'",
-                    s, a.name
-                ),
-            }
-        }
-
-        a
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::ArgGroup;
-    #[cfg(feature = "yaml")]
-    use yaml_rust::YamlLoader;
-
-    #[test]
-    fn groups() {
-        let g = ArgGroup::with_name("test")
-            .arg("a1")
-            .arg("a4")
-            .args(&["a2", "a3"])
-            .required(true)
-            .conflicts_with("c1")
-            .conflicts_with_all(&["c2", "c3"])
-            .conflicts_with("c4")
-            .requires("r1")
-            .requires_all(&["r2", "r3"])
-            .requires("r4");
-
-        let args = vec!["a1", "a4", "a2", "a3"];
-        let reqs = vec!["r1", "r2", "r3", "r4"];
-        let confs = vec!["c1", "c2", "c3", "c4"];
-
-        assert_eq!(g.args, args);
-        assert_eq!(g.requires, Some(reqs));
-        assert_eq!(g.conflicts, Some(confs));
-    }
-
-    #[test]
-    fn test_debug() {
-        let g = ArgGroup::with_name("test")
-            .arg("a1")
-            .arg("a4")
-            .args(&["a2", "a3"])
-            .required(true)
-            .conflicts_with("c1")
-            .conflicts_with_all(&["c2", "c3"])
-            .conflicts_with("c4")
-            .requires("r1")
-            .requires_all(&["r2", "r3"])
-            .requires("r4");
-
-        let args = vec!["a1", "a4", "a2", "a3"];
-        let reqs = vec!["r1", "r2", "r3", "r4"];
-        let confs = vec!["c1", "c2", "c3", "c4"];
-
-        let debug_str = format!(
-            "{{\n\
-             \tname: \"test\",\n\
-             \targs: {:?},\n\
-             \trequired: {:?},\n\
-             \trequires: {:?},\n\
-             \tconflicts: {:?},\n\
-             }}",
-            args,
-            true,
-            Some(reqs),
-            Some(confs)
-        );
-        assert_eq!(&*format!("{:?}", g), &*debug_str);
-    }
-
-    #[test]
-    fn test_from() {
-        let g = ArgGroup::with_name("test")
-            .arg("a1")
-            .arg("a4")
-            .args(&["a2", "a3"])
-            .required(true)
-            .conflicts_with("c1")
-            .conflicts_with_all(&["c2", "c3"])
-            .conflicts_with("c4")
-            .requires("r1")
-            .requires_all(&["r2", "r3"])
-            .requires("r4");
-
-        let args = vec!["a1", "a4", "a2", "a3"];
-        let reqs = vec!["r1", "r2", "r3", "r4"];
-        let confs = vec!["c1", "c2", "c3", "c4"];
-
-        let g2 = ArgGroup::from(&g);
-        assert_eq!(g2.args, args);
-        assert_eq!(g2.requires, Some(reqs));
-        assert_eq!(g2.conflicts, Some(confs));
-    }
-
-    #[cfg(feature = "yaml")]
-    #[cfg_attr(feature = "yaml", test)]
-    fn test_yaml() {
-        let g_yaml = "name: test
-args:
-- a1
-- a4
-- a2
-- a3
-conflicts_with:
-- c1
-- c2
-- c3
-- c4
-requires:
-- r1
-- r2
-- r3
-- r4";
-        let yml = &YamlLoader::load_from_str(g_yaml).expect("failed to load YAML file")[0];
-        let g = ArgGroup::from_yaml(yml);
-        let args = vec!["a1", "a4", "a2", "a3"];
-        let reqs = vec!["r1", "r2", "r3", "r4"];
-        let confs = vec!["c1", "c2", "c3", "c4"];
-        assert_eq!(g.args, args);
-        assert_eq!(g.requires, Some(reqs));
-        assert_eq!(g.conflicts, Some(confs));
-    }
-}
-
-impl<'a> Clone for ArgGroup<'a> {
-    fn clone(&self) -> Self {
-        ArgGroup {
-            name: self.name,
-            required: self.required,
-            args: self.args.clone(),
-            requires: self.requires.clone(),
-            conflicts: self.conflicts.clone(),
-            multiple: self.multiple,
-        }
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/macros.rs b/third_party/rust/clap/v2/crate/src/args/macros.rs
deleted file mode 100644
index ac4b1a2d..0000000
--- a/third_party/rust/clap/v2/crate/src/args/macros.rs
+++ /dev/null
@@ -1,121 +0,0 @@
-#[cfg(feature = "yaml")]
-macro_rules! yaml_tuple2 {
-    ($a:ident, $v:ident, $c:ident) => {{
-        if let Some(vec) = $v.as_vec() {
-            for ys in vec {
-                if let Some(tup) = ys.as_vec() {
-                    debug_assert_eq!(2, tup.len());
-                    $a = $a.$c(yaml_str!(tup[0]), yaml_str!(tup[1]));
-                } else {
-                    panic!("Failed to convert YAML value to vec");
-                }
-            }
-        } else {
-            panic!("Failed to convert YAML value to vec");
-        }
-        $a
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_tuple3 {
-    ($a:ident, $v:ident, $c:ident) => {{
-        if let Some(vec) = $v.as_vec() {
-            for ys in vec {
-                if let Some(tup) = ys.as_vec() {
-                    debug_assert_eq!(3, tup.len());
-                    $a = $a.$c(yaml_str!(tup[0]), yaml_opt_str!(tup[1]), yaml_str!(tup[2]));
-                } else {
-                    panic!("Failed to convert YAML value to vec");
-                }
-            }
-        } else {
-            panic!("Failed to convert YAML value to vec");
-        }
-        $a
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_vec_or_str {
-    ($v:ident, $a:ident, $c:ident) => {{
-        let maybe_vec = $v.as_vec();
-        if let Some(vec) = maybe_vec {
-            for ys in vec {
-                if let Some(s) = ys.as_str() {
-                    $a = $a.$c(s);
-                } else {
-                    panic!("Failed to convert YAML value {:?} to a string", ys);
-                }
-            }
-        } else {
-            if let Some(s) = $v.as_str() {
-                $a = $a.$c(s);
-            } else {
-                panic!(
-                    "Failed to convert YAML value {:?} to either a vec or string",
-                    $v
-                );
-            }
-        }
-        $a
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_opt_str {
-    ($v:expr) => {{
-        if $v.is_null() {
-            Some(
-                $v.as_str()
-                    .unwrap_or_else(|| panic!("failed to convert YAML {:?} value to a string", $v)),
-            )
-        } else {
-            None
-        }
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_str {
-    ($v:expr) => {{
-        $v.as_str()
-            .unwrap_or_else(|| panic!("failed to convert YAML {:?} value to a string", $v))
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_to_str {
-    ($a:ident, $v:ident, $c:ident) => {{
-        $a.$c(yaml_str!($v))
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_to_bool {
-    ($a:ident, $v:ident, $c:ident) => {{
-        $a.$c($v
-            .as_bool()
-            .unwrap_or_else(|| panic!("failed to convert YAML {:?} value to a string", $v)))
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_to_u64 {
-    ($a:ident, $v:ident, $c:ident) => {{
-        $a.$c($v
-            .as_i64()
-            .unwrap_or_else(|| panic!("failed to convert YAML {:?} value to a string", $v))
-            as u64)
-    }};
-}
-
-#[cfg(feature = "yaml")]
-macro_rules! yaml_to_usize {
-    ($a:ident, $v:ident, $c:ident) => {{
-        $a.$c($v
-            .as_i64()
-            .unwrap_or_else(|| panic!("failed to convert YAML {:?} value to a string", $v))
-            as usize)
-    }};
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/matched_arg.rs b/third_party/rust/clap/v2/crate/src/args/matched_arg.rs
deleted file mode 100644
index 681e5d2..0000000
--- a/third_party/rust/clap/v2/crate/src/args/matched_arg.rs
+++ /dev/null
@@ -1,29 +0,0 @@
-// Std
-use std::ffi::OsString;
-
-#[doc(hidden)]
-#[derive(Debug, Clone)]
-pub struct MatchedArg {
-    #[doc(hidden)]
-    pub occurs: u64,
-    #[doc(hidden)]
-    pub indices: Vec<usize>,
-    #[doc(hidden)]
-    pub vals: Vec<OsString>,
-}
-
-impl Default for MatchedArg {
-    fn default() -> Self {
-        MatchedArg {
-            occurs: 1,
-            indices: Vec::new(),
-            vals: Vec::new(),
-        }
-    }
-}
-
-impl MatchedArg {
-    pub fn new() -> Self {
-        MatchedArg::default()
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/mod.rs b/third_party/rust/clap/v2/crate/src/args/mod.rs
deleted file mode 100644
index 8f076ea5..0000000
--- a/third_party/rust/clap/v2/crate/src/args/mod.rs
+++ /dev/null
@@ -1,21 +0,0 @@
-pub use self::any_arg::{AnyArg, DispOrder};
-pub use self::arg::Arg;
-pub use self::arg_builder::{Base, FlagBuilder, OptBuilder, PosBuilder, Switched, Valued};
-pub use self::arg_matcher::ArgMatcher;
-pub use self::arg_matches::{ArgMatches, OsValues, Values};
-pub use self::group::ArgGroup;
-pub use self::matched_arg::MatchedArg;
-pub use self::settings::{ArgFlags, ArgSettings};
-pub use self::subcommand::SubCommand;
-
-#[macro_use]
-mod macros;
-pub mod any_arg;
-mod arg;
-mod arg_builder;
-mod arg_matcher;
-mod arg_matches;
-mod group;
-mod matched_arg;
-pub mod settings;
-mod subcommand;
diff --git a/third_party/rust/clap/v2/crate/src/args/settings.rs b/third_party/rust/clap/v2/crate/src/args/settings.rs
deleted file mode 100644
index 833a1ea..0000000
--- a/third_party/rust/clap/v2/crate/src/args/settings.rs
+++ /dev/null
@@ -1,237 +0,0 @@
-// Std
-#[allow(deprecated, unused_imports)]
-use std::ascii::AsciiExt;
-use std::str::FromStr;
-
-bitflags! {
-    struct Flags: u32 {
-        const REQUIRED         = 1;
-        const MULTIPLE         = 1 << 1;
-        const EMPTY_VALS       = 1 << 2;
-        const GLOBAL           = 1 << 3;
-        const HIDDEN           = 1 << 4;
-        const TAKES_VAL        = 1 << 5;
-        const USE_DELIM        = 1 << 6;
-        const NEXT_LINE_HELP   = 1 << 7;
-        const R_UNLESS_ALL     = 1 << 8;
-        const REQ_DELIM        = 1 << 9;
-        const DELIM_NOT_SET    = 1 << 10;
-        const HIDE_POS_VALS    = 1 << 11;
-        const ALLOW_TAC_VALS   = 1 << 12;
-        const REQUIRE_EQUALS   = 1 << 13;
-        const LAST             = 1 << 14;
-        const HIDE_DEFAULT_VAL = 1 << 15;
-        const CASE_INSENSITIVE = 1 << 16;
-        const HIDE_ENV_VALS    = 1 << 17;
-        const HIDDEN_SHORT_H   = 1 << 18;
-        const HIDDEN_LONG_H    = 1 << 19;
-    }
-}
-
-#[doc(hidden)]
-#[derive(Debug, Clone, Copy)]
-pub struct ArgFlags(Flags);
-
-impl ArgFlags {
-    pub fn new() -> Self {
-        ArgFlags::default()
-    }
-
-    impl_settings! {ArgSettings,
-        Required => Flags::REQUIRED,
-        Multiple => Flags::MULTIPLE,
-        EmptyValues => Flags::EMPTY_VALS,
-        Global => Flags::GLOBAL,
-        Hidden => Flags::HIDDEN,
-        TakesValue => Flags::TAKES_VAL,
-        UseValueDelimiter => Flags::USE_DELIM,
-        NextLineHelp => Flags::NEXT_LINE_HELP,
-        RequiredUnlessAll => Flags::R_UNLESS_ALL,
-        RequireDelimiter => Flags::REQ_DELIM,
-        ValueDelimiterNotSet => Flags::DELIM_NOT_SET,
-        HidePossibleValues => Flags::HIDE_POS_VALS,
-        AllowLeadingHyphen => Flags::ALLOW_TAC_VALS,
-        RequireEquals => Flags::REQUIRE_EQUALS,
-        Last => Flags::LAST,
-        CaseInsensitive => Flags::CASE_INSENSITIVE,
-        HideEnvValues => Flags::HIDE_ENV_VALS,
-        HideDefaultValue => Flags::HIDE_DEFAULT_VAL,
-        HiddenShortHelp => Flags::HIDDEN_SHORT_H,
-        HiddenLongHelp => Flags::HIDDEN_LONG_H
-    }
-}
-
-impl Default for ArgFlags {
-    fn default() -> Self {
-        ArgFlags(Flags::EMPTY_VALS | Flags::DELIM_NOT_SET)
-    }
-}
-
-/// Various settings that apply to arguments and may be set, unset, and checked via getter/setter
-/// methods [`Arg::set`], [`Arg::unset`], and [`Arg::is_set`]
-///
-/// [`Arg::set`]: ./struct.Arg.html#method.set
-/// [`Arg::unset`]: ./struct.Arg.html#method.unset
-/// [`Arg::is_set`]: ./struct.Arg.html#method.is_set
-#[derive(Debug, PartialEq, Copy, Clone)]
-pub enum ArgSettings {
-    /// The argument must be used
-    Required,
-    /// The argument may be used multiple times such as `--flag --flag`
-    Multiple,
-    /// The argument allows empty values such as `--option ""`
-    EmptyValues,
-    /// The argument should be propagated down through all child [`SubCommand`]s
-    ///
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    Global,
-    /// The argument should **not** be shown in help text
-    Hidden,
-    /// The argument accepts a value, such as `--option <value>`
-    TakesValue,
-    /// Determines if the argument allows values to be grouped via a delimiter
-    UseValueDelimiter,
-    /// Prints the help text on the line after the argument
-    NextLineHelp,
-    /// Requires the use of a value delimiter for all multiple values
-    RequireDelimiter,
-    /// Hides the possible values from the help string
-    HidePossibleValues,
-    /// Allows vals that start with a '-'
-    AllowLeadingHyphen,
-    /// Require options use `--option=val` syntax
-    RequireEquals,
-    /// Specifies that the arg is the last positional argument and may be accessed early via `--`
-    /// syntax
-    Last,
-    /// Hides the default value from the help string
-    HideDefaultValue,
-    /// Makes `Arg::possible_values` case insensitive
-    CaseInsensitive,
-    /// Hides ENV values in the help message
-    HideEnvValues,
-    /// The argument should **not** be shown in short help text
-    HiddenShortHelp,
-    /// The argument should **not** be shown in long help text
-    HiddenLongHelp,
-    #[doc(hidden)]
-    RequiredUnlessAll,
-    #[doc(hidden)]
-    ValueDelimiterNotSet,
-}
-
-impl FromStr for ArgSettings {
-    type Err = String;
-    fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
-        match &*s.to_ascii_lowercase() {
-            "required" => Ok(ArgSettings::Required),
-            "multiple" => Ok(ArgSettings::Multiple),
-            "global" => Ok(ArgSettings::Global),
-            "emptyvalues" => Ok(ArgSettings::EmptyValues),
-            "hidden" => Ok(ArgSettings::Hidden),
-            "takesvalue" => Ok(ArgSettings::TakesValue),
-            "usevaluedelimiter" => Ok(ArgSettings::UseValueDelimiter),
-            "nextlinehelp" => Ok(ArgSettings::NextLineHelp),
-            "requiredunlessall" => Ok(ArgSettings::RequiredUnlessAll),
-            "requiredelimiter" => Ok(ArgSettings::RequireDelimiter),
-            "valuedelimiternotset" => Ok(ArgSettings::ValueDelimiterNotSet),
-            "hidepossiblevalues" => Ok(ArgSettings::HidePossibleValues),
-            "allowleadinghyphen" => Ok(ArgSettings::AllowLeadingHyphen),
-            "requireequals" => Ok(ArgSettings::RequireEquals),
-            "last" => Ok(ArgSettings::Last),
-            "hidedefaultvalue" => Ok(ArgSettings::HideDefaultValue),
-            "caseinsensitive" => Ok(ArgSettings::CaseInsensitive),
-            "hideenvvalues" => Ok(ArgSettings::HideEnvValues),
-            "hiddenshorthelp" => Ok(ArgSettings::HiddenShortHelp),
-            "hiddenlonghelp" => Ok(ArgSettings::HiddenLongHelp),
-            _ => Err("unknown ArgSetting, cannot convert from str".to_owned()),
-        }
-    }
-}
-
-#[cfg(test)]
-mod test {
-    use super::ArgSettings;
-
-    #[test]
-    fn arg_settings_fromstr() {
-        assert_eq!(
-            "allowleadinghyphen".parse::<ArgSettings>().unwrap(),
-            ArgSettings::AllowLeadingHyphen
-        );
-        assert_eq!(
-            "emptyvalues".parse::<ArgSettings>().unwrap(),
-            ArgSettings::EmptyValues
-        );
-        assert_eq!(
-            "global".parse::<ArgSettings>().unwrap(),
-            ArgSettings::Global
-        );
-        assert_eq!(
-            "hidepossiblevalues".parse::<ArgSettings>().unwrap(),
-            ArgSettings::HidePossibleValues
-        );
-        assert_eq!(
-            "hidden".parse::<ArgSettings>().unwrap(),
-            ArgSettings::Hidden
-        );
-        assert_eq!(
-            "multiple".parse::<ArgSettings>().unwrap(),
-            ArgSettings::Multiple
-        );
-        assert_eq!(
-            "nextlinehelp".parse::<ArgSettings>().unwrap(),
-            ArgSettings::NextLineHelp
-        );
-        assert_eq!(
-            "requiredunlessall".parse::<ArgSettings>().unwrap(),
-            ArgSettings::RequiredUnlessAll
-        );
-        assert_eq!(
-            "requiredelimiter".parse::<ArgSettings>().unwrap(),
-            ArgSettings::RequireDelimiter
-        );
-        assert_eq!(
-            "required".parse::<ArgSettings>().unwrap(),
-            ArgSettings::Required
-        );
-        assert_eq!(
-            "takesvalue".parse::<ArgSettings>().unwrap(),
-            ArgSettings::TakesValue
-        );
-        assert_eq!(
-            "usevaluedelimiter".parse::<ArgSettings>().unwrap(),
-            ArgSettings::UseValueDelimiter
-        );
-        assert_eq!(
-            "valuedelimiternotset".parse::<ArgSettings>().unwrap(),
-            ArgSettings::ValueDelimiterNotSet
-        );
-        assert_eq!(
-            "requireequals".parse::<ArgSettings>().unwrap(),
-            ArgSettings::RequireEquals
-        );
-        assert_eq!("last".parse::<ArgSettings>().unwrap(), ArgSettings::Last);
-        assert_eq!(
-            "hidedefaultvalue".parse::<ArgSettings>().unwrap(),
-            ArgSettings::HideDefaultValue
-        );
-        assert_eq!(
-            "caseinsensitive".parse::<ArgSettings>().unwrap(),
-            ArgSettings::CaseInsensitive
-        );
-        assert_eq!(
-            "hideenvvalues".parse::<ArgSettings>().unwrap(),
-            ArgSettings::HideEnvValues
-        );
-        assert_eq!(
-            "hiddenshorthelp".parse::<ArgSettings>().unwrap(),
-            ArgSettings::HiddenShortHelp
-        );
-        assert_eq!(
-            "hiddenlonghelp".parse::<ArgSettings>().unwrap(),
-            ArgSettings::HiddenLongHelp
-        );
-        assert!("hahahaha".parse::<ArgSettings>().is_err());
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/args/subcommand.rs b/third_party/rust/clap/v2/crate/src/args/subcommand.rs
deleted file mode 100644
index 8b8049e..0000000
--- a/third_party/rust/clap/v2/crate/src/args/subcommand.rs
+++ /dev/null
@@ -1,72 +0,0 @@
-// Third Party
-#[cfg(feature = "yaml")]
-use yaml_rust::Yaml;
-
-// Internal
-use App;
-use ArgMatches;
-
-/// The abstract representation of a command line subcommand.
-///
-/// This struct describes all the valid options of the subcommand for the program. Subcommands are
-/// essentially "sub-[`App`]s" and contain all the same possibilities (such as their own
-/// [arguments], subcommands, and settings).
-///
-/// # Examples
-///
-/// ```rust
-/// # use clap::{App, Arg, SubCommand};
-/// App::new("myprog")
-///     .subcommand(
-///         SubCommand::with_name("config")
-///             .about("Used for configuration")
-///             .arg(Arg::with_name("config_file")
-///                 .help("The configuration file to use")
-///                 .index(1)))
-/// # ;
-/// ```
-/// [`App`]: ./struct.App.html
-/// [arguments]: ./struct.Arg.html
-#[derive(Debug, Clone)]
-pub struct SubCommand<'a> {
-    #[doc(hidden)]
-    pub name: String,
-    #[doc(hidden)]
-    pub matches: ArgMatches<'a>,
-}
-
-impl<'a> SubCommand<'a> {
-    /// Creates a new instance of a subcommand requiring a name. The name will be displayed
-    /// to the user when they print version or help and usage information.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, SubCommand};
-    /// App::new("myprog")
-    ///     .subcommand(
-    ///         SubCommand::with_name("config"))
-    /// # ;
-    /// ```
-    pub fn with_name<'b>(name: &str) -> App<'a, 'b> {
-        App::new(name)
-    }
-
-    /// Creates a new instance of a subcommand from a YAML (.yml) document
-    ///
-    /// # Examples
-    ///
-    /// ```ignore
-    /// # #[macro_use]
-    /// # extern crate clap;
-    /// # use clap::Subcommand;
-    /// # fn main() {
-    /// let sc_yaml = load_yaml!("test_subcommand.yml");
-    /// let sc = SubCommand::from_yaml(sc_yaml);
-    /// # }
-    /// ```
-    #[cfg(feature = "yaml")]
-    pub fn from_yaml(yaml: &Yaml) -> App {
-        App::from_yaml(yaml)
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/completions/bash.rs b/third_party/rust/clap/v2/crate/src/completions/bash.rs
deleted file mode 100644
index b712a68..0000000
--- a/third_party/rust/clap/v2/crate/src/completions/bash.rs
+++ /dev/null
@@ -1,222 +0,0 @@
-// Std
-use std::io::Write;
-
-// Internal
-use app::parser::Parser;
-use args::OptBuilder;
-use completions;
-
-pub struct BashGen<'a, 'b>
-where
-    'a: 'b,
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> BashGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self {
-        BashGen { p: p }
-    }
-
-    pub fn generate_to<W: Write>(&self, buf: &mut W) {
-        w!(
-            buf,
-            format!(
-                r#"_{name}() {{
-    local i cur prev opts cmds
-    COMPREPLY=()
-    cur="${{COMP_WORDS[COMP_CWORD]}}"
-    prev="${{COMP_WORDS[COMP_CWORD-1]}}"
-    cmd=""
-    opts=""
-
-    for i in ${{COMP_WORDS[@]}}
-    do
-        case "${{i}}" in
-            {name})
-                cmd="{name}"
-                ;;
-            {subcmds}
-            *)
-                ;;
-        esac
-    done
-
-    case "${{cmd}}" in
-        {name})
-            opts="{name_opts}"
-            if [[ ${{cur}} == -* || ${{COMP_CWORD}} -eq 1 ]] ; then
-                COMPREPLY=( $(compgen -W "${{opts}}" -- "${{cur}}") )
-                return 0
-            fi
-            case "${{prev}}" in
-                {name_opts_details}
-                *)
-                    COMPREPLY=()
-                    ;;
-            esac
-            COMPREPLY=( $(compgen -W "${{opts}}" -- "${{cur}}") )
-            return 0
-            ;;
-        {subcmd_details}
-    esac
-}}
-
-complete -F _{name} -o bashdefault -o default {name}
-"#,
-                name = self.p.meta.bin_name.as_ref().unwrap(),
-                name_opts = self.all_options_for_path(self.p.meta.bin_name.as_ref().unwrap()),
-                name_opts_details =
-                    self.option_details_for_path(self.p.meta.bin_name.as_ref().unwrap()),
-                subcmds = self.all_subcommands(),
-                subcmd_details = self.subcommand_details()
-            )
-            .as_bytes()
-        );
-    }
-
-    fn all_subcommands(&self) -> String {
-        debugln!("BashGen::all_subcommands;");
-        let mut subcmds = String::new();
-        let scs = completions::all_subcommand_names(self.p);
-
-        for sc in &scs {
-            subcmds = format!(
-                r#"{}
-            {name})
-                cmd+="__{fn_name}"
-                ;;"#,
-                subcmds,
-                name = sc,
-                fn_name = sc.replace("-", "__")
-            );
-        }
-
-        subcmds
-    }
-
-    fn subcommand_details(&self) -> String {
-        debugln!("BashGen::subcommand_details;");
-        let mut subcmd_dets = String::new();
-        let mut scs = completions::get_all_subcommand_paths(self.p, true);
-        scs.sort();
-        scs.dedup();
-
-        for sc in &scs {
-            subcmd_dets = format!(
-                r#"{}
-        {subcmd})
-            opts="{sc_opts}"
-            if [[ ${{cur}} == -* || ${{COMP_CWORD}} -eq {level} ]] ; then
-                COMPREPLY=( $(compgen -W "${{opts}}" -- "${{cur}}") )
-                return 0
-            fi
-            case "${{prev}}" in
-                {opts_details}
-                *)
-                    COMPREPLY=()
-                    ;;
-            esac
-            COMPREPLY=( $(compgen -W "${{opts}}" -- "${{cur}}") )
-            return 0
-            ;;"#,
-                subcmd_dets,
-                subcmd = sc.replace("-", "__"),
-                sc_opts = self.all_options_for_path(&*sc),
-                level = sc.split("__").map(|_| 1).fold(0, |acc, n| acc + n),
-                opts_details = self.option_details_for_path(&*sc)
-            );
-        }
-
-        subcmd_dets
-    }
-
-    fn option_details_for_path(&self, path: &str) -> String {
-        debugln!("BashGen::option_details_for_path: path={}", path);
-        let mut p = self.p;
-        for sc in path.split("__").skip(1) {
-            debugln!("BashGen::option_details_for_path:iter: sc={}", sc);
-            p = &find_subcmd!(p, sc).unwrap().p;
-        }
-        let mut opts = String::new();
-        for o in p.opts() {
-            if let Some(l) = o.s.long {
-                opts = format!(
-                    "{}
-                --{})
-                    COMPREPLY=({})
-                    return 0
-                    ;;",
-                    opts,
-                    l,
-                    self.vals_for(o)
-                );
-            }
-            if let Some(s) = o.s.short {
-                opts = format!(
-                    "{}
-                    -{})
-                    COMPREPLY=({})
-                    return 0
-                    ;;",
-                    opts,
-                    s,
-                    self.vals_for(o)
-                );
-            }
-        }
-        opts
-    }
-
-    fn vals_for(&self, o: &OptBuilder) -> String {
-        debugln!("BashGen::vals_for: o={}", o.b.name);
-        use args::AnyArg;
-        if let Some(vals) = o.possible_vals() {
-            format!(r#"$(compgen -W "{}" -- "${{cur}}")"#, vals.join(" "))
-        } else {
-            String::from(r#"$(compgen -f "${cur}")"#)
-        }
-    }
-
-    fn all_options_for_path(&self, path: &str) -> String {
-        debugln!("BashGen::all_options_for_path: path={}", path);
-        let mut p = self.p;
-        for sc in path.split("__").skip(1) {
-            debugln!("BashGen::all_options_for_path:iter: sc={}", sc);
-            p = &find_subcmd!(p, sc).unwrap().p;
-        }
-        let mut opts = shorts!(p).fold(String::new(), |acc, s| format!("{} -{}", acc, s));
-        opts = format!(
-            "{} {}",
-            opts,
-            longs!(p).fold(String::new(), |acc, l| format!("{} --{}", acc, l))
-        );
-        opts = format!(
-            "{} {}",
-            opts,
-            p.positionals
-                .values()
-                .fold(String::new(), |acc, p| format!("{} {}", acc, p))
-        );
-        opts = format!(
-            "{} {}",
-            opts,
-            p.subcommands
-                .iter()
-                .fold(String::new(), |acc, s| format!("{} {}", acc, s.p.meta.name))
-        );
-        for sc in &p.subcommands {
-            if let Some(ref aliases) = sc.p.meta.aliases {
-                opts = format!(
-                    "{} {}",
-                    opts,
-                    aliases
-                        .iter()
-                        .map(|&(n, _)| n)
-                        .fold(String::new(), |acc, a| format!("{} {}", acc, a))
-                );
-            }
-        }
-        opts
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/completions/elvish.rs b/third_party/rust/clap/v2/crate/src/completions/elvish.rs
deleted file mode 100644
index 12be03d..0000000
--- a/third_party/rust/clap/v2/crate/src/completions/elvish.rs
+++ /dev/null
@@ -1,128 +0,0 @@
-// Std
-use std::io::Write;
-
-// Internal
-use app::parser::Parser;
-use INTERNAL_ERROR_MSG;
-
-pub struct ElvishGen<'a, 'b>
-where
-    'a: 'b,
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> ElvishGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self {
-        ElvishGen { p: p }
-    }
-
-    pub fn generate_to<W: Write>(&self, buf: &mut W) {
-        let bin_name = self.p.meta.bin_name.as_ref().unwrap();
-
-        let mut names = vec![];
-        let subcommands_cases = generate_inner(self.p, "", &mut names);
-
-        let result = format!(
-            r#"
-edit:completion:arg-completer[{bin_name}] = [@words]{{
-    fn spaces [n]{{
-        repeat $n ' ' | joins ''
-    }}
-    fn cand [text desc]{{
-        edit:complex-candidate $text &display-suffix=' '(spaces (- 14 (wcswidth $text)))$desc
-    }}
-    command = '{bin_name}'
-    for word $words[1:-1] {{
-        if (has-prefix $word '-') {{
-            break
-        }}
-        command = $command';'$word
-    }}
-    completions = [{subcommands_cases}
-    ]
-    $completions[$command]
-}}
-"#,
-            bin_name = bin_name,
-            subcommands_cases = subcommands_cases
-        );
-
-        w!(buf, result.as_bytes());
-    }
-}
-
-// Escape string inside single quotes
-fn escape_string(string: &str) -> String {
-    string.replace("'", "''")
-}
-
-fn get_tooltip<T: ToString>(help: Option<&str>, data: T) -> String {
-    match help {
-        Some(help) => escape_string(help),
-        _ => data.to_string(),
-    }
-}
-
-fn generate_inner<'a, 'b, 'p>(
-    p: &'p Parser<'a, 'b>,
-    previous_command_name: &str,
-    names: &mut Vec<&'p str>,
-) -> String {
-    debugln!("ElvishGen::generate_inner;");
-    let command_name = if previous_command_name.is_empty() {
-        p.meta.bin_name.as_ref().expect(INTERNAL_ERROR_MSG).clone()
-    } else {
-        format!("{};{}", previous_command_name, &p.meta.name)
-    };
-
-    let mut completions = String::new();
-    let preamble = String::from("\n            cand ");
-
-    for option in p.opts() {
-        if let Some(data) = option.s.short {
-            let tooltip = get_tooltip(option.b.help, data);
-            completions.push_str(&preamble);
-            completions.push_str(format!("-{} '{}'", data, tooltip).as_str());
-        }
-        if let Some(data) = option.s.long {
-            let tooltip = get_tooltip(option.b.help, data);
-            completions.push_str(&preamble);
-            completions.push_str(format!("--{} '{}'", data, tooltip).as_str());
-        }
-    }
-
-    for flag in p.flags() {
-        if let Some(data) = flag.s.short {
-            let tooltip = get_tooltip(flag.b.help, data);
-            completions.push_str(&preamble);
-            completions.push_str(format!("-{} '{}'", data, tooltip).as_str());
-        }
-        if let Some(data) = flag.s.long {
-            let tooltip = get_tooltip(flag.b.help, data);
-            completions.push_str(&preamble);
-            completions.push_str(format!("--{} '{}'", data, tooltip).as_str());
-        }
-    }
-
-    for subcommand in &p.subcommands {
-        let data = &subcommand.p.meta.name;
-        let tooltip = get_tooltip(subcommand.p.meta.about, data);
-        completions.push_str(&preamble);
-        completions.push_str(format!("{} '{}'", data, tooltip).as_str());
-    }
-
-    let mut subcommands_cases = format!(
-        r"
-        &'{}'= {{{}
-        }}",
-        &command_name, completions
-    );
-
-    for subcommand in &p.subcommands {
-        let subcommand_subcommands_cases = generate_inner(&subcommand.p, &command_name, names);
-        subcommands_cases.push_str(&subcommand_subcommands_cases);
-    }
-
-    subcommands_cases
-}
diff --git a/third_party/rust/clap/v2/crate/src/completions/fish.rs b/third_party/rust/clap/v2/crate/src/completions/fish.rs
deleted file mode 100644
index a2bf888e..0000000
--- a/third_party/rust/clap/v2/crate/src/completions/fish.rs
+++ /dev/null
@@ -1,103 +0,0 @@
-// Std
-use std::io::Write;
-
-// Internal
-use app::parser::Parser;
-
-pub struct FishGen<'a, 'b>
-where
-    'a: 'b,
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> FishGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self {
-        FishGen { p: p }
-    }
-
-    pub fn generate_to<W: Write>(&self, buf: &mut W) {
-        let command = self.p.meta.bin_name.as_ref().unwrap();
-        let mut buffer = String::new();
-        gen_fish_inner(command, self, command, &mut buffer);
-        w!(buf, buffer.as_bytes());
-    }
-}
-
-// Escape string inside single quotes
-fn escape_string(string: &str) -> String {
-    string.replace("\\", "\\\\").replace("'", "\\'")
-}
-
-fn gen_fish_inner(root_command: &str, comp_gen: &FishGen, subcommand: &str, buffer: &mut String) {
-    debugln!("FishGen::gen_fish_inner;");
-    // example :
-    //
-    // complete
-    //      -c {command}
-    //      -d "{description}"
-    //      -s {short}
-    //      -l {long}
-    //      -a "{possible_arguments}"
-    //      -r # if require parameter
-    //      -f # don't use file completion
-    //      -n "__fish_use_subcommand"               # complete for command "myprog"
-    //      -n "__fish_seen_subcommand_from subcmd1" # complete for command "myprog subcmd1"
-
-    let mut basic_template = format!("complete -c {} -n ", root_command);
-    if root_command == subcommand {
-        basic_template.push_str("\"__fish_use_subcommand\"");
-    } else {
-        basic_template.push_str(format!("\"__fish_seen_subcommand_from {}\"", subcommand).as_str());
-    }
-
-    for option in comp_gen.p.opts() {
-        let mut template = basic_template.clone();
-        if let Some(data) = option.s.short {
-            template.push_str(format!(" -s {}", data).as_str());
-        }
-        if let Some(data) = option.s.long {
-            template.push_str(format!(" -l {}", data).as_str());
-        }
-        if let Some(data) = option.b.help {
-            template.push_str(format!(" -d '{}'", escape_string(data)).as_str());
-        }
-        if let Some(ref data) = option.v.possible_vals {
-            template.push_str(format!(" -r -f -a \"{}\"", data.join(" ")).as_str());
-        }
-        buffer.push_str(template.as_str());
-        buffer.push_str("\n");
-    }
-
-    for flag in comp_gen.p.flags() {
-        let mut template = basic_template.clone();
-        if let Some(data) = flag.s.short {
-            template.push_str(format!(" -s {}", data).as_str());
-        }
-        if let Some(data) = flag.s.long {
-            template.push_str(format!(" -l {}", data).as_str());
-        }
-        if let Some(data) = flag.b.help {
-            template.push_str(format!(" -d '{}'", escape_string(data)).as_str());
-        }
-        buffer.push_str(template.as_str());
-        buffer.push_str("\n");
-    }
-
-    for subcommand in &comp_gen.p.subcommands {
-        let mut template = basic_template.clone();
-        template.push_str(" -f");
-        template.push_str(format!(" -a \"{}\"", &subcommand.p.meta.name).as_str());
-        if let Some(data) = subcommand.p.meta.about {
-            template.push_str(format!(" -d '{}'", escape_string(data)).as_str())
-        }
-        buffer.push_str(template.as_str());
-        buffer.push_str("\n");
-    }
-
-    // generate options of subcommands
-    for subcommand in &comp_gen.p.subcommands {
-        let sub_comp_gen = FishGen::new(&subcommand.p);
-        gen_fish_inner(root_command, &sub_comp_gen, &subcommand.to_string(), buffer);
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/completions/macros.rs b/third_party/rust/clap/v2/crate/src/completions/macros.rs
deleted file mode 100644
index 3a69de5..0000000
--- a/third_party/rust/clap/v2/crate/src/completions/macros.rs
+++ /dev/null
@@ -1,28 +0,0 @@
-macro_rules! w {
-    ($buf:expr, $to_w:expr) => {
-        match $buf.write_all($to_w) {
-            Ok(..) => (),
-            Err(..) => panic!("Failed to write to completions file"),
-        }
-    };
-}
-
-macro_rules! get_zsh_arg_conflicts {
-    ($p:ident, $arg:ident, $msg:ident) => {
-        if let Some(conf_vec) = $arg.blacklist() {
-            let mut v = vec![];
-            for arg_name in conf_vec {
-                let arg = $p.find_any_arg(arg_name).expect($msg);
-                if let Some(s) = arg.short() {
-                    v.push(format!("-{}", s));
-                }
-                if let Some(l) = arg.long() {
-                    v.push(format!("--{}", l));
-                }
-            }
-            v.join(" ")
-        } else {
-            String::new()
-        }
-    };
-}
diff --git a/third_party/rust/clap/v2/crate/src/completions/mod.rs b/third_party/rust/clap/v2/crate/src/completions/mod.rs
deleted file mode 100644
index 99d4005..0000000
--- a/third_party/rust/clap/v2/crate/src/completions/mod.rs
+++ /dev/null
@@ -1,182 +0,0 @@
-#[macro_use]
-mod macros;
-mod bash;
-mod elvish;
-mod fish;
-mod powershell;
-mod shell;
-mod zsh;
-
-// Std
-use std::io::Write;
-
-// Internal
-use self::bash::BashGen;
-use self::elvish::ElvishGen;
-use self::fish::FishGen;
-use self::powershell::PowerShellGen;
-pub use self::shell::Shell;
-use self::zsh::ZshGen;
-use app::parser::Parser;
-
-pub struct ComplGen<'a, 'b>
-where
-    'a: 'b,
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> ComplGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self {
-        ComplGen { p: p }
-    }
-
-    pub fn generate<W: Write>(&self, for_shell: Shell, buf: &mut W) {
-        match for_shell {
-            Shell::Bash => BashGen::new(self.p).generate_to(buf),
-            Shell::Fish => FishGen::new(self.p).generate_to(buf),
-            Shell::Zsh => ZshGen::new(self.p).generate_to(buf),
-            Shell::PowerShell => PowerShellGen::new(self.p).generate_to(buf),
-            Shell::Elvish => ElvishGen::new(self.p).generate_to(buf),
-        }
-    }
-}
-
-// Gets all subcommands including child subcommands in the form of 'name' where the name
-// is a single word (i.e. "install")  of the path to said subcommand (i.e.
-// "rustup toolchain install")
-//
-// Also note, aliases are treated as their own subcommands but duplicates of whatever they're
-// aliasing.
-pub fn all_subcommand_names(p: &Parser) -> Vec<String> {
-    debugln!("all_subcommand_names;");
-    let mut subcmds: Vec<_> = subcommands_of(p)
-        .iter()
-        .map(|&(ref n, _)| n.clone())
-        .collect();
-    for sc_v in p.subcommands.iter().map(|s| all_subcommand_names(&s.p)) {
-        subcmds.extend(sc_v);
-    }
-    subcmds.sort();
-    subcmds.dedup();
-    subcmds
-}
-
-// Gets all subcommands including child subcommands in the form of ('name', 'bin_name') where the name
-// is a single word (i.e. "install") of the path and full bin_name of said subcommand (i.e.
-// "rustup toolchain install")
-//
-// Also note, aliases are treated as their own subcommands but duplicates of whatever they're
-// aliasing.
-pub fn all_subcommands(p: &Parser) -> Vec<(String, String)> {
-    debugln!("all_subcommands;");
-    let mut subcmds: Vec<_> = subcommands_of(p);
-    for sc_v in p.subcommands.iter().map(|s| all_subcommands(&s.p)) {
-        subcmds.extend(sc_v);
-    }
-    subcmds
-}
-
-// Gets all subcommands excluding child subcommands in the form of (name, bin_name) where the name
-// is a single word (i.e. "install") and the bin_name is a space delineated list of the path to said
-// subcommand (i.e. "rustup toolchain install")
-//
-// Also note, aliases are treated as their own subcommands but duplicates of whatever they're
-// aliasing.
-pub fn subcommands_of(p: &Parser) -> Vec<(String, String)> {
-    debugln!(
-        "subcommands_of: name={}, bin_name={}",
-        p.meta.name,
-        p.meta.bin_name.as_ref().unwrap()
-    );
-    let mut subcmds = vec![];
-
-    debugln!(
-        "subcommands_of: Has subcommands...{:?}",
-        p.has_subcommands()
-    );
-    if !p.has_subcommands() {
-        let mut ret = vec![];
-        debugln!("subcommands_of: Looking for aliases...");
-        if let Some(ref aliases) = p.meta.aliases {
-            for &(n, _) in aliases {
-                debugln!("subcommands_of:iter:iter: Found alias...{}", n);
-                let mut als_bin_name: Vec<_> =
-                    p.meta.bin_name.as_ref().unwrap().split(' ').collect();
-                als_bin_name.push(n);
-                let old = als_bin_name.len() - 2;
-                als_bin_name.swap_remove(old);
-                ret.push((n.to_owned(), als_bin_name.join(" ")));
-            }
-        }
-        return ret;
-    }
-    for sc in &p.subcommands {
-        debugln!(
-            "subcommands_of:iter: name={}, bin_name={}",
-            sc.p.meta.name,
-            sc.p.meta.bin_name.as_ref().unwrap()
-        );
-
-        debugln!("subcommands_of:iter: Looking for aliases...");
-        if let Some(ref aliases) = sc.p.meta.aliases {
-            for &(n, _) in aliases {
-                debugln!("subcommands_of:iter:iter: Found alias...{}", n);
-                let mut als_bin_name: Vec<_> =
-                    p.meta.bin_name.as_ref().unwrap().split(' ').collect();
-                als_bin_name.push(n);
-                let old = als_bin_name.len() - 2;
-                als_bin_name.swap_remove(old);
-                subcmds.push((n.to_owned(), als_bin_name.join(" ")));
-            }
-        }
-        subcmds.push((
-            sc.p.meta.name.clone(),
-            sc.p.meta.bin_name.as_ref().unwrap().clone(),
-        ));
-    }
-    subcmds
-}
-
-pub fn get_all_subcommand_paths(p: &Parser, first: bool) -> Vec<String> {
-    debugln!("get_all_subcommand_paths;");
-    let mut subcmds = vec![];
-    if !p.has_subcommands() {
-        if !first {
-            let name = &*p.meta.name;
-            let path = p.meta.bin_name.as_ref().unwrap().clone().replace(" ", "__");
-            let mut ret = vec![path.clone()];
-            if let Some(ref aliases) = p.meta.aliases {
-                for &(n, _) in aliases {
-                    ret.push(path.replace(name, n));
-                }
-            }
-            return ret;
-        }
-        return vec![];
-    }
-    for sc in &p.subcommands {
-        let name = &*sc.p.meta.name;
-        let path =
-            sc.p.meta
-                .bin_name
-                .as_ref()
-                .unwrap()
-                .clone()
-                .replace(" ", "__");
-        subcmds.push(path.clone());
-        if let Some(ref aliases) = sc.p.meta.aliases {
-            for &(n, _) in aliases {
-                subcmds.push(path.replace(name, n));
-            }
-        }
-    }
-    for sc_v in p
-        .subcommands
-        .iter()
-        .map(|s| get_all_subcommand_paths(&s.p, false))
-    {
-        subcmds.extend(sc_v);
-    }
-    subcmds
-}
diff --git a/third_party/rust/clap/v2/crate/src/completions/powershell.rs b/third_party/rust/clap/v2/crate/src/completions/powershell.rs
deleted file mode 100644
index 5fafd8d..0000000
--- a/third_party/rust/clap/v2/crate/src/completions/powershell.rs
+++ /dev/null
@@ -1,166 +0,0 @@
-// Std
-use std::io::Write;
-
-// Internal
-use app::parser::Parser;
-use INTERNAL_ERROR_MSG;
-
-pub struct PowerShellGen<'a, 'b>
-where
-    'a: 'b,
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> PowerShellGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self {
-        PowerShellGen { p: p }
-    }
-
-    pub fn generate_to<W: Write>(&self, buf: &mut W) {
-        let bin_name = self.p.meta.bin_name.as_ref().unwrap();
-
-        let mut names = vec![];
-        let subcommands_cases = generate_inner(self.p, "", &mut names);
-
-        let result = format!(
-            r#"
-using namespace System.Management.Automation
-using namespace System.Management.Automation.Language
-
-Register-ArgumentCompleter -Native -CommandName '{bin_name}' -ScriptBlock {{
-    param($wordToComplete, $commandAst, $cursorPosition)
-
-    $commandElements = $commandAst.CommandElements
-    $command = @(
-        '{bin_name}'
-        for ($i = 1; $i -lt $commandElements.Count; $i++) {{
-            $element = $commandElements[$i]
-            if ($element -isnot [StringConstantExpressionAst] -or
-                $element.StringConstantType -ne [StringConstantType]::BareWord -or
-                $element.Value.StartsWith('-')) {{
-                break
-        }}
-        $element.Value
-    }}) -join ';'
-
-    $completions = @(switch ($command) {{{subcommands_cases}
-    }})
-
-    $completions.Where{{ $_.CompletionText -like "$wordToComplete*" }} |
-        Sort-Object -Property ListItemText
-}}
-"#,
-            bin_name = bin_name,
-            subcommands_cases = subcommands_cases
-        );
-
-        w!(buf, result.as_bytes());
-    }
-}
-
-// Escape string inside single quotes
-fn escape_string(string: &str) -> String {
-    string.replace("'", "''")
-}
-
-fn get_tooltip<T: ToString>(help: Option<&str>, data: T) -> String {
-    match help {
-        Some(help) => escape_string(help),
-        _ => data.to_string(),
-    }
-}
-
-fn generate_inner<'a, 'b, 'p>(
-    p: &'p Parser<'a, 'b>,
-    previous_command_name: &str,
-    names: &mut Vec<&'p str>,
-) -> String {
-    debugln!("PowerShellGen::generate_inner;");
-    let command_name = if previous_command_name.is_empty() {
-        p.meta.bin_name.as_ref().expect(INTERNAL_ERROR_MSG).clone()
-    } else {
-        format!("{};{}", previous_command_name, &p.meta.name)
-    };
-
-    let mut completions = String::new();
-    let preamble = String::from("\n            [CompletionResult]::new(");
-
-    for option in p.opts() {
-        if let Some(data) = option.s.short {
-            let tooltip = get_tooltip(option.b.help, data);
-            completions.push_str(&preamble);
-            completions.push_str(
-                format!(
-                    "'-{}', '{}', {}, '{}')",
-                    data, data, "[CompletionResultType]::ParameterName", tooltip
-                )
-                .as_str(),
-            );
-        }
-        if let Some(data) = option.s.long {
-            let tooltip = get_tooltip(option.b.help, data);
-            completions.push_str(&preamble);
-            completions.push_str(
-                format!(
-                    "'--{}', '{}', {}, '{}')",
-                    data, data, "[CompletionResultType]::ParameterName", tooltip
-                )
-                .as_str(),
-            );
-        }
-    }
-
-    for flag in p.flags() {
-        if let Some(data) = flag.s.short {
-            let tooltip = get_tooltip(flag.b.help, data);
-            completions.push_str(&preamble);
-            completions.push_str(
-                format!(
-                    "'-{}', '{}', {}, '{}')",
-                    data, data, "[CompletionResultType]::ParameterName", tooltip
-                )
-                .as_str(),
-            );
-        }
-        if let Some(data) = flag.s.long {
-            let tooltip = get_tooltip(flag.b.help, data);
-            completions.push_str(&preamble);
-            completions.push_str(
-                format!(
-                    "'--{}', '{}', {}, '{}')",
-                    data, data, "[CompletionResultType]::ParameterName", tooltip
-                )
-                .as_str(),
-            );
-        }
-    }
-
-    for subcommand in &p.subcommands {
-        let data = &subcommand.p.meta.name;
-        let tooltip = get_tooltip(subcommand.p.meta.about, data);
-        completions.push_str(&preamble);
-        completions.push_str(
-            format!(
-                "'{}', '{}', {}, '{}')",
-                data, data, "[CompletionResultType]::ParameterValue", tooltip
-            )
-            .as_str(),
-        );
-    }
-
-    let mut subcommands_cases = format!(
-        r"
-        '{}' {{{}
-            break
-        }}",
-        &command_name, completions
-    );
-
-    for subcommand in &p.subcommands {
-        let subcommand_subcommands_cases = generate_inner(&subcommand.p, &command_name, names);
-        subcommands_cases.push_str(&subcommand_subcommands_cases);
-    }
-
-    subcommands_cases
-}
diff --git a/third_party/rust/clap/v2/crate/src/completions/shell.rs b/third_party/rust/clap/v2/crate/src/completions/shell.rs
deleted file mode 100644
index 80999e6..0000000
--- a/third_party/rust/clap/v2/crate/src/completions/shell.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-#[allow(deprecated, unused_imports)]
-use std::ascii::AsciiExt;
-use std::fmt;
-use std::str::FromStr;
-
-/// Describes which shell to produce a completions file for
-#[cfg_attr(feature = "lints", allow(enum_variant_names))]
-#[derive(Debug, Copy, Clone)]
-pub enum Shell {
-    /// Generates a .bash completion file for the Bourne Again SHell (BASH)
-    Bash,
-    /// Generates a .fish completion file for the Friendly Interactive SHell (fish)
-    Fish,
-    /// Generates a completion file for the Z SHell (ZSH)
-    Zsh,
-    /// Generates a completion file for PowerShell
-    PowerShell,
-    /// Generates a completion file for Elvish
-    Elvish,
-}
-
-impl Shell {
-    /// A list of possible variants in `&'static str` form
-    pub fn variants() -> [&'static str; 5] {
-        ["zsh", "bash", "fish", "powershell", "elvish"]
-    }
-}
-
-impl FromStr for Shell {
-    type Err = String;
-
-    fn from_str(s: &str) -> Result<Self, Self::Err> {
-        match s {
-            "ZSH" | _ if s.eq_ignore_ascii_case("zsh") => Ok(Shell::Zsh),
-            "FISH" | _ if s.eq_ignore_ascii_case("fish") => Ok(Shell::Fish),
-            "BASH" | _ if s.eq_ignore_ascii_case("bash") => Ok(Shell::Bash),
-            "POWERSHELL" | _ if s.eq_ignore_ascii_case("powershell") => Ok(Shell::PowerShell),
-            "ELVISH" | _ if s.eq_ignore_ascii_case("elvish") => Ok(Shell::Elvish),
-            _ => Err(String::from(
-                "[valid values: bash, fish, zsh, powershell, elvish]",
-            )),
-        }
-    }
-}
-
-impl fmt::Display for Shell {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            Shell::Bash => write!(f, "BASH"),
-            Shell::Fish => write!(f, "FISH"),
-            Shell::Zsh => write!(f, "ZSH"),
-            Shell::PowerShell => write!(f, "POWERSHELL"),
-            Shell::Elvish => write!(f, "ELVISH"),
-        }
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/completions/zsh.rs b/third_party/rust/clap/v2/crate/src/completions/zsh.rs
deleted file mode 100644
index 14cf2b6e..0000000
--- a/third_party/rust/clap/v2/crate/src/completions/zsh.rs
+++ /dev/null
@@ -1,485 +0,0 @@
-// Std
-#[allow(deprecated, unused_imports)]
-use std::ascii::AsciiExt;
-use std::io::Write;
-
-// Internal
-use app::parser::Parser;
-use app::App;
-use args::{AnyArg, ArgSettings};
-use completions;
-use INTERNAL_ERROR_MSG;
-
-pub struct ZshGen<'a, 'b>
-where
-    'a: 'b,
-{
-    p: &'b Parser<'a, 'b>,
-}
-
-impl<'a, 'b> ZshGen<'a, 'b> {
-    pub fn new(p: &'b Parser<'a, 'b>) -> Self {
-        debugln!("ZshGen::new;");
-        ZshGen { p: p }
-    }
-
-    pub fn generate_to<W: Write>(&self, buf: &mut W) {
-        debugln!("ZshGen::generate_to;");
-        w!(
-            buf,
-            format!(
-                "\
-#compdef {name}
-
-autoload -U is-at-least
-
-_{name}() {{
-    typeset -A opt_args
-    typeset -a _arguments_options
-    local ret=1
-
-    if is-at-least 5.2; then
-        _arguments_options=(-s -S -C)
-    else
-        _arguments_options=(-s -C)
-    fi
-
-    local context curcontext=\"$curcontext\" state line
-    {initial_args}
-    {subcommands}
-}}
-
-{subcommand_details}
-
-_{name} \"$@\"",
-                name = self.p.meta.bin_name.as_ref().unwrap(),
-                initial_args = get_args_of(self.p),
-                subcommands = get_subcommands_of(self.p),
-                subcommand_details = subcommand_details(self.p)
-            )
-            .as_bytes()
-        );
-    }
-}
-
-// Displays the commands of a subcommand
-// (( $+functions[_[bin_name_underscore]_commands] )) ||
-// _[bin_name_underscore]_commands() {
-// 	local commands; commands=(
-// 		'[arg_name]:[arg_help]'
-// 	)
-// 	_describe -t commands '[bin_name] commands' commands "$@"
-//
-// Where the following variables are present:
-//    [bin_name_underscore]: The full space delineated bin_name, where spaces have been replaced by
-//                           underscore characters
-//    [arg_name]: The name of the subcommand
-//    [arg_help]: The help message of the subcommand
-//    [bin_name]: The full space delineated bin_name
-//
-// Here's a snippet from rustup:
-//
-// (( $+functions[_rustup_commands] )) ||
-// _rustup_commands() {
-// 	local commands; commands=(
-// 		'show:Show the active and installed toolchains'
-//      'update:Update Rust toolchains'
-//      # ... snip for brevity
-//      'help:Prints this message or the help of the given subcommand(s)'
-// 	)
-// 	_describe -t commands 'rustup commands' commands "$@"
-//
-fn subcommand_details(p: &Parser) -> String {
-    debugln!("ZshGen::subcommand_details;");
-    // First we do ourself
-    let mut ret = vec![format!(
-        "\
-(( $+functions[_{bin_name_underscore}_commands] )) ||
-_{bin_name_underscore}_commands() {{
-    local commands; commands=(
-        {subcommands_and_args}
-    )
-    _describe -t commands '{bin_name} commands' commands \"$@\"
-}}",
-        bin_name_underscore = p.meta.bin_name.as_ref().unwrap().replace(" ", "__"),
-        bin_name = p.meta.bin_name.as_ref().unwrap(),
-        subcommands_and_args = subcommands_of(p)
-    )];
-
-    // Next we start looping through all the children, grandchildren, etc.
-    let mut all_subcommands = completions::all_subcommands(p);
-    all_subcommands.sort();
-    all_subcommands.dedup();
-    for &(_, ref bin_name) in &all_subcommands {
-        debugln!("ZshGen::subcommand_details:iter: bin_name={}", bin_name);
-        ret.push(format!(
-            "\
-(( $+functions[_{bin_name_underscore}_commands] )) ||
-_{bin_name_underscore}_commands() {{
-    local commands; commands=(
-        {subcommands_and_args}
-    )
-    _describe -t commands '{bin_name} commands' commands \"$@\"
-}}",
-            bin_name_underscore = bin_name.replace(" ", "__"),
-            bin_name = bin_name,
-            subcommands_and_args = subcommands_of(parser_of(p, bin_name))
-        ));
-    }
-
-    ret.join("\n")
-}
-
-// Generates subcommand completions in form of
-//
-// 		'[arg_name]:[arg_help]'
-//
-// Where:
-//    [arg_name]: the subcommand's name
-//    [arg_help]: the help message of the subcommand
-//
-// A snippet from rustup:
-// 		'show:Show the active and installed toolchains'
-//      'update:Update Rust toolchains'
-fn subcommands_of(p: &Parser) -> String {
-    debugln!("ZshGen::subcommands_of;");
-    let mut ret = vec![];
-    fn add_sc(sc: &App, n: &str, ret: &mut Vec<String>) {
-        debugln!("ZshGen::add_sc;");
-        let s = format!(
-            "\"{name}:{help}\" \\",
-            name = n,
-            help =
-                sc.p.meta
-                    .about
-                    .unwrap_or("")
-                    .replace("[", "\\[")
-                    .replace("]", "\\]")
-        );
-        if !s.is_empty() {
-            ret.push(s);
-        }
-    }
-
-    // The subcommands
-    for sc in p.subcommands() {
-        debugln!("ZshGen::subcommands_of:iter: subcommand={}", sc.p.meta.name);
-        add_sc(sc, &sc.p.meta.name, &mut ret);
-        if let Some(ref v) = sc.p.meta.aliases {
-            for alias in v.iter().filter(|&&(_, vis)| vis).map(|&(n, _)| n) {
-                add_sc(sc, alias, &mut ret);
-            }
-        }
-    }
-
-    ret.join("\n")
-}
-
-// Get's the subcommand section of a completion file
-// This looks roughly like:
-//
-// case $state in
-// ([bin_name]_args)
-//     curcontext=\"${curcontext%:*:*}:[name_hyphen]-command-$words[1]:\"
-//     case $line[1] in
-//
-//         ([name])
-//         _arguments -C -s -S \
-//             [subcommand_args]
-//         && ret=0
-//
-//         [RECURSIVE_CALLS]
-//
-//         ;;",
-//
-//         [repeat]
-//
-//     esac
-// ;;
-// esac",
-//
-// Where the following variables are present:
-//    [name] = The subcommand name in the form of "install" for "rustup toolchain install"
-//    [bin_name] = The full space delineated bin_name such as "rustup toolchain install"
-//    [name_hyphen] = The full space delineated bin_name, but replace spaces with hyphens
-//    [repeat] = From the same recursive calls, but for all subcommands
-//    [subcommand_args] = The same as zsh::get_args_of
-fn get_subcommands_of(p: &Parser) -> String {
-    debugln!("get_subcommands_of;");
-
-    debugln!(
-        "get_subcommands_of: Has subcommands...{:?}",
-        p.has_subcommands()
-    );
-    if !p.has_subcommands() {
-        return String::new();
-    }
-
-    let sc_names = completions::subcommands_of(p);
-
-    let mut subcmds = vec![];
-    for &(ref name, ref bin_name) in &sc_names {
-        let mut v = vec![format!("({})", name)];
-        let subcommand_args = get_args_of(parser_of(p, &*bin_name));
-        if !subcommand_args.is_empty() {
-            v.push(subcommand_args);
-        }
-        let subcommands = get_subcommands_of(parser_of(p, &*bin_name));
-        if !subcommands.is_empty() {
-            v.push(subcommands);
-        }
-        v.push(String::from(";;"));
-        subcmds.push(v.join("\n"));
-    }
-
-    format!(
-        "case $state in
-    ({name})
-        words=($line[{pos}] \"${{words[@]}}\")
-        (( CURRENT += 1 ))
-        curcontext=\"${{curcontext%:*:*}}:{name_hyphen}-command-$line[{pos}]:\"
-        case $line[{pos}] in
-            {subcommands}
-        esac
-    ;;
-esac",
-        name = p.meta.name,
-        name_hyphen = p.meta.bin_name.as_ref().unwrap().replace(" ", "-"),
-        subcommands = subcmds.join("\n"),
-        pos = p.positionals().len() + 1
-    )
-}
-
-fn parser_of<'a, 'b>(p: &'b Parser<'a, 'b>, sc: &str) -> &'b Parser<'a, 'b> {
-    debugln!("parser_of: sc={}", sc);
-    if sc == p.meta.bin_name.as_ref().unwrap_or(&String::new()) {
-        return p;
-    }
-    &p.find_subcommand(sc).expect(INTERNAL_ERROR_MSG).p
-}
-
-// Writes out the args section, which ends up being the flags, opts and postionals, and a jump to
-// another ZSH function if there are subcommands.
-// The structer works like this:
-//    ([conflicting_args]) [multiple] arg [takes_value] [[help]] [: :(possible_values)]
-//       ^-- list '-v -h'    ^--'*'          ^--'+'                   ^-- list 'one two three'
-//
-// An example from the rustup command:
-//
-// _arguments -C -s -S \
-// 		'(-h --help --verbose)-v[Enable verbose output]' \
-// 		'(-V -v --version --verbose --help)-h[Prints help information]' \
-//      # ... snip for brevity
-// 		':: :_rustup_commands' \    # <-- displays subcommands
-// 		'*::: :->rustup' \          # <-- displays subcommand args and child subcommands
-// 	&& ret=0
-//
-// The args used for _arguments are as follows:
-//    -C: modify the $context internal variable
-//    -s: Allow stacking of short args (i.e. -a -b -c => -abc)
-//    -S: Do not complete anything after '--' and treat those as argument values
-fn get_args_of(p: &Parser) -> String {
-    debugln!("get_args_of;");
-    let mut ret = vec![String::from("_arguments \"${_arguments_options[@]}\" \\")];
-    let opts = write_opts_of(p);
-    let flags = write_flags_of(p);
-    let positionals = write_positionals_of(p);
-    let sc_or_a = if p.has_subcommands() {
-        format!(
-            "\":: :_{name}_commands\" \\",
-            name = p.meta.bin_name.as_ref().unwrap().replace(" ", "__")
-        )
-    } else {
-        String::new()
-    };
-    let sc = if p.has_subcommands() {
-        format!("\"*::: :->{name}\" \\", name = p.meta.name)
-    } else {
-        String::new()
-    };
-
-    if !opts.is_empty() {
-        ret.push(opts);
-    }
-    if !flags.is_empty() {
-        ret.push(flags);
-    }
-    if !positionals.is_empty() {
-        ret.push(positionals);
-    }
-    if !sc_or_a.is_empty() {
-        ret.push(sc_or_a);
-    }
-    if !sc.is_empty() {
-        ret.push(sc);
-    }
-    ret.push(String::from("&& ret=0"));
-
-    ret.join("\n")
-}
-
-// Escape help string inside single quotes and brackets
-fn escape_help(string: &str) -> String {
-    string
-        .replace("\\", "\\\\")
-        .replace("'", "'\\''")
-        .replace("[", "\\[")
-        .replace("]", "\\]")
-}
-
-// Escape value string inside single quotes and parentheses
-fn escape_value(string: &str) -> String {
-    string
-        .replace("\\", "\\\\")
-        .replace("'", "'\\''")
-        .replace("(", "\\(")
-        .replace(")", "\\)")
-        .replace(" ", "\\ ")
-}
-
-fn write_opts_of(p: &Parser) -> String {
-    debugln!("write_opts_of;");
-    let mut ret = vec![];
-    for o in p.opts() {
-        debugln!("write_opts_of:iter: o={}", o.name());
-        let help = o.help().map_or(String::new(), escape_help);
-        let mut conflicts = get_zsh_arg_conflicts!(p, o, INTERNAL_ERROR_MSG);
-        conflicts = if conflicts.is_empty() {
-            String::new()
-        } else {
-            format!("({})", conflicts)
-        };
-
-        let multiple = if o.is_set(ArgSettings::Multiple) {
-            "*"
-        } else {
-            ""
-        };
-        let pv = if let Some(pv_vec) = o.possible_vals() {
-            format!(
-                ": :({})",
-                pv_vec
-                    .iter()
-                    .map(|v| escape_value(*v))
-                    .collect::<Vec<String>>()
-                    .join(" ")
-            )
-        } else {
-            String::new()
-        };
-        if let Some(short) = o.short() {
-            let s = format!(
-                "'{conflicts}{multiple}-{arg}+[{help}]{possible_values}' \\",
-                conflicts = conflicts,
-                multiple = multiple,
-                arg = short,
-                possible_values = pv,
-                help = help
-            );
-
-            debugln!("write_opts_of:iter: Wrote...{}", &*s);
-            ret.push(s);
-        }
-        if let Some(long) = o.long() {
-            let l = format!(
-                "'{conflicts}{multiple}--{arg}=[{help}]{possible_values}' \\",
-                conflicts = conflicts,
-                multiple = multiple,
-                arg = long,
-                possible_values = pv,
-                help = help
-            );
-
-            debugln!("write_opts_of:iter: Wrote...{}", &*l);
-            ret.push(l);
-        }
-    }
-
-    ret.join("\n")
-}
-
-fn write_flags_of(p: &Parser) -> String {
-    debugln!("write_flags_of;");
-    let mut ret = vec![];
-    for f in p.flags() {
-        debugln!("write_flags_of:iter: f={}", f.name());
-        let help = f.help().map_or(String::new(), escape_help);
-        let mut conflicts = get_zsh_arg_conflicts!(p, f, INTERNAL_ERROR_MSG);
-        conflicts = if conflicts.is_empty() {
-            String::new()
-        } else {
-            format!("({})", conflicts)
-        };
-
-        let multiple = if f.is_set(ArgSettings::Multiple) {
-            "*"
-        } else {
-            ""
-        };
-        if let Some(short) = f.short() {
-            let s = format!(
-                "'{conflicts}{multiple}-{arg}[{help}]' \\",
-                multiple = multiple,
-                conflicts = conflicts,
-                arg = short,
-                help = help
-            );
-
-            debugln!("write_flags_of:iter: Wrote...{}", &*s);
-            ret.push(s);
-        }
-
-        if let Some(long) = f.long() {
-            let l = format!(
-                "'{conflicts}{multiple}--{arg}[{help}]' \\",
-                conflicts = conflicts,
-                multiple = multiple,
-                arg = long,
-                help = help
-            );
-
-            debugln!("write_flags_of:iter: Wrote...{}", &*l);
-            ret.push(l);
-        }
-    }
-
-    ret.join("\n")
-}
-
-fn write_positionals_of(p: &Parser) -> String {
-    debugln!("write_positionals_of;");
-    let mut ret = vec![];
-    for arg in p.positionals() {
-        debugln!("write_positionals_of:iter: arg={}", arg.b.name);
-        let a = format!(
-            "'{optional}:{name}{help}:{action}' \\",
-            optional = if !arg.b.is_set(ArgSettings::Required) {
-                ":"
-            } else {
-                ""
-            },
-            name = arg.b.name,
-            help = arg
-                .b
-                .help
-                .map_or("".to_owned(), |v| " -- ".to_owned() + v)
-                .replace("[", "\\[")
-                .replace("]", "\\]"),
-            action = arg.possible_vals().map_or("_files".to_owned(), |values| {
-                format!(
-                    "({})",
-                    values
-                        .iter()
-                        .map(|v| escape_value(*v))
-                        .collect::<Vec<String>>()
-                        .join(" ")
-                )
-            })
-        );
-
-        debugln!("write_positionals_of:iter: Wrote...{}", a);
-        ret.push(a);
-    }
-
-    ret.join("\n")
-}
diff --git a/third_party/rust/clap/v2/crate/src/errors.rs b/third_party/rust/clap/v2/crate/src/errors.rs
deleted file mode 100644
index 1f86720..0000000
--- a/third_party/rust/clap/v2/crate/src/errors.rs
+++ /dev/null
@@ -1,918 +0,0 @@
-// Std
-use std::convert::From;
-use std::error::Error as StdError;
-use std::fmt as std_fmt;
-use std::fmt::Display;
-use std::io::{self, Write};
-use std::process;
-use std::result::Result as StdResult;
-
-// Internal
-use args::AnyArg;
-use fmt::{ColorWhen, Colorizer, ColorizerOption};
-use suggestions;
-
-/// Short hand for [`Result`] type
-///
-/// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
-pub type Result<T> = StdResult<T, Error>;
-
-/// Command line argument parser kind of error
-#[derive(Debug, Copy, Clone, PartialEq)]
-pub enum ErrorKind {
-    /// Occurs when an [`Arg`] has a set of possible values,
-    /// and the user provides a value which isn't in that set.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("speed")
-    ///         .possible_value("fast")
-    ///         .possible_value("slow"))
-    ///     .get_matches_from_safe(vec!["prog", "other"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::InvalidValue);
-    /// ```
-    /// [`Arg`]: ./struct.Arg.html
-    InvalidValue,
-
-    /// Occurs when a user provides a flag, option, argument or subcommand which isn't defined.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::from_usage("--flag 'some flag'"))
-    ///     .get_matches_from_safe(vec!["prog", "--other"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::UnknownArgument);
-    /// ```
-    UnknownArgument,
-
-    /// Occurs when the user provides an unrecognized [`SubCommand`] which meets the threshold for
-    /// being similar enough to an existing subcommand.
-    /// If it doesn't meet the threshold, or the 'suggestions' feature is disabled,
-    /// the more general [`UnknownArgument`] error is returned.
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(feature = "suggestions"), doc = " ```no_run")]
-    #[cfg_attr(feature = "suggestions", doc = " ```")]
-    /// # use clap::{App, Arg, ErrorKind, SubCommand};
-    /// let result = App::new("prog")
-    ///     .subcommand(SubCommand::with_name("config")
-    ///         .about("Used for configuration")
-    ///         .arg(Arg::with_name("config_file")
-    ///             .help("The configuration file to use")
-    ///             .index(1)))
-    ///     .get_matches_from_safe(vec!["prog", "confi"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::InvalidSubcommand);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`UnknownArgument`]: ./enum.ErrorKind.html#variant.UnknownArgument
-    InvalidSubcommand,
-
-    /// Occurs when the user provides an unrecognized [`SubCommand`] which either
-    /// doesn't meet the threshold for being similar enough to an existing subcommand,
-    /// or the 'suggestions' feature is disabled.
-    /// Otherwise the more detailed [`InvalidSubcommand`] error is returned.
-    ///
-    /// This error typically happens when passing additional subcommand names to the `help`
-    /// subcommand. Otherwise, the more general [`UnknownArgument`] error is used.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind, SubCommand};
-    /// let result = App::new("prog")
-    ///     .subcommand(SubCommand::with_name("config")
-    ///         .about("Used for configuration")
-    ///         .arg(Arg::with_name("config_file")
-    ///             .help("The configuration file to use")
-    ///             .index(1)))
-    ///     .get_matches_from_safe(vec!["prog", "help", "nothing"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::UnrecognizedSubcommand);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`InvalidSubcommand`]: ./enum.ErrorKind.html#variant.InvalidSubcommand
-    /// [`UnknownArgument`]: ./enum.ErrorKind.html#variant.UnknownArgument
-    UnrecognizedSubcommand,
-
-    /// Occurs when the user provides an empty value for an option that does not allow empty
-    /// values.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let res = App::new("prog")
-    ///     .arg(Arg::with_name("color")
-    ///          .long("color")
-    ///          .empty_values(false))
-    ///     .get_matches_from_safe(vec!["prog", "--color="]);
-    /// assert!(res.is_err());
-    /// assert_eq!(res.unwrap_err().kind, ErrorKind::EmptyValue);
-    /// ```
-    EmptyValue,
-
-    /// Occurs when the user provides a value for an argument with a custom validation and the
-    /// value fails that validation.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// fn is_numeric(val: String) -> Result<(), String> {
-    ///     match val.parse::<i64>() {
-    ///         Ok(..) => Ok(()),
-    ///         Err(..) => Err(String::from("Value wasn't a number!")),
-    ///     }
-    /// }
-    ///
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("num")
-    ///          .validator(is_numeric))
-    ///     .get_matches_from_safe(vec!["prog", "NotANumber"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::ValueValidation);
-    /// ```
-    ValueValidation,
-
-    /// Occurs when a user provides more values for an argument than were defined by setting
-    /// [`Arg::max_values`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("arg")
-    ///         .multiple(true)
-    ///         .max_values(2))
-    ///     .get_matches_from_safe(vec!["prog", "too", "many", "values"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::TooManyValues);
-    /// ```
-    /// [`Arg::max_values`]: ./struct.Arg.html#method.max_values
-    TooManyValues,
-
-    /// Occurs when the user provides fewer values for an argument than were defined by setting
-    /// [`Arg::min_values`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("some_opt")
-    ///         .long("opt")
-    ///         .min_values(3))
-    ///     .get_matches_from_safe(vec!["prog", "--opt", "too", "few"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::TooFewValues);
-    /// ```
-    /// [`Arg::min_values`]: ./struct.Arg.html#method.min_values
-    TooFewValues,
-
-    /// Occurs when the user provides a different number of values for an argument than what's
-    /// been defined by setting [`Arg::number_of_values`] or than was implicitly set by
-    /// [`Arg::value_names`].
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("some_opt")
-    ///         .long("opt")
-    ///         .takes_value(true)
-    ///         .number_of_values(2))
-    ///     .get_matches_from_safe(vec!["prog", "--opt", "wrong"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::WrongNumberOfValues);
-    /// ```
-    ///
-    /// [`Arg::number_of_values`]: ./struct.Arg.html#method.number_of_values
-    /// [`Arg::value_names`]: ./struct.Arg.html#method.value_names
-    WrongNumberOfValues,
-
-    /// Occurs when the user provides two values which conflict with each other and can't be used
-    /// together.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug")
-    ///         .conflicts_with("color"))
-    ///     .arg(Arg::with_name("color")
-    ///         .long("color"))
-    ///     .get_matches_from_safe(vec!["prog", "--debug", "--color"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::ArgumentConflict);
-    /// ```
-    ArgumentConflict,
-
-    /// Occurs when the user does not provide one or more required arguments.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .required(true))
-    ///     .get_matches_from_safe(vec!["prog"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::MissingRequiredArgument);
-    /// ```
-    MissingRequiredArgument,
-
-    /// Occurs when a subcommand is required (as defined by [`AppSettings::SubcommandRequired`]),
-    /// but the user does not provide one.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, AppSettings, SubCommand, ErrorKind};
-    /// let err = App::new("prog")
-    ///     .setting(AppSettings::SubcommandRequired)
-    ///     .subcommand(SubCommand::with_name("test"))
-    ///     .get_matches_from_safe(vec![
-    ///         "myprog",
-    ///     ]);
-    /// assert!(err.is_err());
-    /// assert_eq!(err.unwrap_err().kind, ErrorKind::MissingSubcommand);
-    /// # ;
-    /// ```
-    /// [`AppSettings::SubcommandRequired`]: ./enum.AppSettings.html#variant.SubcommandRequired
-    MissingSubcommand,
-
-    /// Occurs when either an argument or [`SubCommand`] is required, as defined by
-    /// [`AppSettings::ArgRequiredElseHelp`], but the user did not provide one.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, AppSettings, ErrorKind, SubCommand};
-    /// let result = App::new("prog")
-    ///     .setting(AppSettings::ArgRequiredElseHelp)
-    ///     .subcommand(SubCommand::with_name("config")
-    ///         .about("Used for configuration")
-    ///         .arg(Arg::with_name("config_file")
-    ///             .help("The configuration file to use")))
-    ///     .get_matches_from_safe(vec!["prog"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::MissingArgumentOrSubcommand);
-    /// ```
-    /// [`SubCommand`]: ./struct.SubCommand.html
-    /// [`AppSettings::ArgRequiredElseHelp`]: ./enum.AppSettings.html#variant.ArgRequiredElseHelp
-    MissingArgumentOrSubcommand,
-
-    /// Occurs when the user provides multiple values to an argument which doesn't allow that.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .arg(Arg::with_name("debug")
-    ///         .long("debug")
-    ///         .multiple(false))
-    ///     .get_matches_from_safe(vec!["prog", "--debug", "--debug"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::UnexpectedMultipleUsage);
-    /// ```
-    UnexpectedMultipleUsage,
-
-    /// Occurs when the user provides a value containing invalid UTF-8 for an argument and
-    /// [`AppSettings::StrictUtf8`] is set.
-    ///
-    /// # Platform Specific
-    ///
-    /// Non-Windows platforms only (such as Linux, Unix, macOS, etc.)
-    ///
-    /// # Examples
-    ///
-    #[cfg_attr(not(unix), doc = " ```ignore")]
-    #[cfg_attr(unix, doc = " ```")]
-    /// # use clap::{App, Arg, ErrorKind, AppSettings};
-    /// # use std::os::unix::ffi::OsStringExt;
-    /// # use std::ffi::OsString;
-    /// let result = App::new("prog")
-    ///     .setting(AppSettings::StrictUtf8)
-    ///     .arg(Arg::with_name("utf8")
-    ///         .short("u")
-    ///         .takes_value(true))
-    ///     .get_matches_from_safe(vec![OsString::from("myprog"),
-    ///                                 OsString::from("-u"),
-    ///                                 OsString::from_vec(vec![0xE9])]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::InvalidUtf8);
-    /// ```
-    /// [`AppSettings::StrictUtf8`]: ./enum.AppSettings.html#variant.StrictUtf8
-    InvalidUtf8,
-
-    /// Not a true "error" as it means `--help` or similar was used.
-    /// The help message will be sent to `stdout`.
-    ///
-    /// **Note**: If the help is displayed due to an error (such as missing subcommands) it will
-    /// be sent to `stderr` instead of `stdout`.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .get_matches_from_safe(vec!["prog", "--help"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::HelpDisplayed);
-    /// ```
-    HelpDisplayed,
-
-    /// Not a true "error" as it means `--version` or similar was used.
-    /// The message will be sent to `stdout`.
-    ///
-    /// # Examples
-    ///
-    /// ```rust
-    /// # use clap::{App, Arg, ErrorKind};
-    /// let result = App::new("prog")
-    ///     .get_matches_from_safe(vec!["prog", "--version"]);
-    /// assert!(result.is_err());
-    /// assert_eq!(result.unwrap_err().kind, ErrorKind::VersionDisplayed);
-    /// ```
-    VersionDisplayed,
-
-    /// Occurs when using the [`value_t!`] and [`values_t!`] macros to convert an argument value
-    /// into type `T`, but the argument you requested wasn't used. I.e. you asked for an argument
-    /// with name `config` to be converted, but `config` wasn't used by the user.
-    /// [`value_t!`]: ./macro.value_t!.html
-    /// [`values_t!`]: ./macro.values_t!.html
-    ArgumentNotFound,
-
-    /// Represents an [I/O error].
-    /// Can occur when writing to `stderr` or `stdout` or reading a configuration file.
-    /// [I/O error]: https://doc.rust-lang.org/std/io/struct.Error.html
-    Io,
-
-    /// Represents a [Format error] (which is a part of [`Display`]).
-    /// Typically caused by writing to `stderr` or `stdout`.
-    ///
-    /// [`Display`]: https://doc.rust-lang.org/std/fmt/trait.Display.html
-    /// [Format error]: https://doc.rust-lang.org/std/fmt/struct.Error.html
-    Format,
-}
-
-/// Command Line Argument Parser Error
-#[derive(Debug)]
-pub struct Error {
-    /// Formatted error message
-    pub message: String,
-    /// The type of error
-    pub kind: ErrorKind,
-    /// Any additional information passed along, such as the argument name that caused the error
-    pub info: Option<Vec<String>>,
-}
-
-impl Error {
-    /// Should the message be written to `stdout` or not
-    pub fn use_stderr(&self) -> bool {
-        match self.kind {
-            ErrorKind::HelpDisplayed | ErrorKind::VersionDisplayed => false,
-            _ => true,
-        }
-    }
-
-    /// Prints the error to `stderr` and exits with a status of `1`
-    pub fn exit(&self) -> ! {
-        if self.use_stderr() {
-            wlnerr!("{}", self.message);
-            process::exit(1);
-        }
-        let out = io::stdout();
-        writeln!(&mut out.lock(), "{}", self.message).expect("Error writing Error to stdout");
-        process::exit(0);
-    }
-
-    #[doc(hidden)]
-    pub fn write_to<W: Write>(&self, w: &mut W) -> io::Result<()> {
-        write!(w, "{}", self.message)
-    }
-
-    #[doc(hidden)]
-    pub fn argument_conflict<O, U>(
-        arg: &AnyArg,
-        other: Option<O>,
-        usage: U,
-        color: ColorWhen,
-    ) -> Self
-    where
-        O: Into<String>,
-        U: Display,
-    {
-        let mut v = vec![arg.name().to_owned()];
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} The argument '{}' cannot be used with {}\n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(&*arg.to_string()),
-                match other {
-                    Some(name) => {
-                        let n = name.into();
-                        v.push(n.clone());
-                        c.warning(format!("'{}'", n))
-                    }
-                    None => c.none("one or more of the other specified arguments".to_owned()),
-                },
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::ArgumentConflict,
-            info: Some(v),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn empty_value<U>(arg: &AnyArg, usage: U, color: ColorWhen) -> Self
-    where
-        U: Display,
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} The argument '{}' requires a value but none was supplied\
-                 \n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(arg.to_string()),
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::EmptyValue,
-            info: Some(vec![arg.name().to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn invalid_value<B, G, U>(
-        bad_val: B,
-        good_vals: &[G],
-        arg: &AnyArg,
-        usage: U,
-        color: ColorWhen,
-    ) -> Self
-    where
-        B: AsRef<str>,
-        G: AsRef<str> + Display,
-        U: Display,
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        let suffix = suggestions::did_you_mean_value_suffix(bad_val.as_ref(), good_vals.iter());
-
-        let mut sorted = vec![];
-        for v in good_vals {
-            let val = format!("{}", c.good(v));
-            sorted.push(val);
-        }
-        sorted.sort();
-        let valid_values = sorted.join(", ");
-        Error {
-            message: format!(
-                "{} '{}' isn't a valid value for '{}'\n\t\
-                 [possible values: {}]\n\
-                 {}\n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(bad_val.as_ref()),
-                c.warning(arg.to_string()),
-                valid_values,
-                suffix.0,
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::InvalidValue,
-            info: Some(vec![arg.name().to_owned(), bad_val.as_ref().to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn invalid_subcommand<S, D, N, U>(
-        subcmd: S,
-        did_you_mean: D,
-        name: N,
-        usage: U,
-        color: ColorWhen,
-    ) -> Self
-    where
-        S: Into<String>,
-        D: AsRef<str> + Display,
-        N: Display,
-        U: Display,
-    {
-        let s = subcmd.into();
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} The subcommand '{}' wasn't recognized\n\t\
-                 Did you mean '{}'?\n\n\
-                 If you believe you received this message in error, try \
-                 re-running with '{} {} {}'\n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(&*s),
-                c.good(did_you_mean.as_ref()),
-                name,
-                c.good("--"),
-                &*s,
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::InvalidSubcommand,
-            info: Some(vec![s]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn unrecognized_subcommand<S, N>(subcmd: S, name: N, color: ColorWhen) -> Self
-    where
-        S: Into<String>,
-        N: Display,
-    {
-        let s = subcmd.into();
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} The subcommand '{}' wasn't recognized\n\n\
-                 {}\n\t\
-                 {} help <subcommands>...\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(&*s),
-                c.warning("USAGE:"),
-                name,
-                c.good("--help")
-            ),
-            kind: ErrorKind::UnrecognizedSubcommand,
-            info: Some(vec![s]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn missing_required_argument<R, U>(required: R, usage: U, color: ColorWhen) -> Self
-    where
-        R: Display,
-        U: Display,
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} The following required arguments were not provided:{}\n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                required,
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::MissingRequiredArgument,
-            info: None,
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn missing_subcommand<N, U>(name: N, usage: U, color: ColorWhen) -> Self
-    where
-        N: AsRef<str> + Display,
-        U: Display,
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} '{}' requires a subcommand, but one was not provided\n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(name),
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::MissingSubcommand,
-            info: None,
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn invalid_utf8<U>(usage: U, color: ColorWhen) -> Self
-    where
-        U: Display,
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} Invalid UTF-8 was detected in one or more arguments\n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::InvalidUtf8,
-            info: None,
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn too_many_values<V, U>(val: V, arg: &AnyArg, usage: U, color: ColorWhen) -> Self
-    where
-        V: AsRef<str> + Display + ToOwned,
-        U: Display,
-    {
-        let v = val.as_ref();
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} The value '{}' was provided to '{}', but it wasn't expecting \
-                 any more values\n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(v),
-                c.warning(arg.to_string()),
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::TooManyValues,
-            info: Some(vec![arg.name().to_owned(), v.to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn too_few_values<U>(
-        arg: &AnyArg,
-        min_vals: u64,
-        curr_vals: usize,
-        usage: U,
-        color: ColorWhen,
-    ) -> Self
-    where
-        U: Display,
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} The argument '{}' requires at least {} values, but only {} w{} \
-                 provided\n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(arg.to_string()),
-                c.warning(min_vals.to_string()),
-                c.warning(curr_vals.to_string()),
-                if curr_vals > 1 { "ere" } else { "as" },
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::TooFewValues,
-            info: Some(vec![arg.name().to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn value_validation(arg: Option<&AnyArg>, err: String, color: ColorWhen) -> Self {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} Invalid value{}: {}",
-                c.error("error:"),
-                if let Some(a) = arg {
-                    format!(" for '{}'", c.warning(a.to_string()))
-                } else {
-                    "".to_string()
-                },
-                err
-            ),
-            kind: ErrorKind::ValueValidation,
-            info: None,
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn value_validation_auto(err: String) -> Self {
-        let n: Option<&AnyArg> = None;
-        Error::value_validation(n, err, ColorWhen::Auto)
-    }
-
-    #[doc(hidden)]
-    pub fn wrong_number_of_values<S, U>(
-        arg: &AnyArg,
-        num_vals: u64,
-        curr_vals: usize,
-        suffix: S,
-        usage: U,
-        color: ColorWhen,
-    ) -> Self
-    where
-        S: Display,
-        U: Display,
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} The argument '{}' requires {} values, but {} w{} \
-                 provided\n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(arg.to_string()),
-                c.warning(num_vals.to_string()),
-                c.warning(curr_vals.to_string()),
-                suffix,
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::WrongNumberOfValues,
-            info: Some(vec![arg.name().to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn unexpected_multiple_usage<U>(arg: &AnyArg, usage: U, color: ColorWhen) -> Self
-    where
-        U: Display,
-    {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} The argument '{}' was provided more than once, but cannot \
-                 be used multiple times\n\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(arg.to_string()),
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::UnexpectedMultipleUsage,
-            info: Some(vec![arg.name().to_owned()]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn unknown_argument<A, U>(arg: A, did_you_mean: &str, usage: U, color: ColorWhen) -> Self
-    where
-        A: Into<String>,
-        U: Display,
-    {
-        let a = arg.into();
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!(
-                "{} Found argument '{}' which wasn't expected, or isn't valid in \
-                 this context{}\n\
-                 {}\n\n\
-                 For more information try {}",
-                c.error("error:"),
-                c.warning(&*a),
-                if did_you_mean.is_empty() {
-                    "\n".to_owned()
-                } else {
-                    format!("{}\n", did_you_mean)
-                },
-                usage,
-                c.good("--help")
-            ),
-            kind: ErrorKind::UnknownArgument,
-            info: Some(vec![a]),
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn io_error(e: &Error, color: ColorWhen) -> Self {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: color,
-        });
-        Error {
-            message: format!("{} {}", c.error("error:"), e.description()),
-            kind: ErrorKind::Io,
-            info: None,
-        }
-    }
-
-    #[doc(hidden)]
-    pub fn argument_not_found_auto<A>(arg: A) -> Self
-    where
-        A: Into<String>,
-    {
-        let a = arg.into();
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: ColorWhen::Auto,
-        });
-        Error {
-            message: format!(
-                "{} The argument '{}' wasn't found",
-                c.error("error:"),
-                a.clone()
-            ),
-            kind: ErrorKind::ArgumentNotFound,
-            info: Some(vec![a]),
-        }
-    }
-
-    /// Create an error with a custom description.
-    ///
-    /// This can be used in combination with `Error::exit` to exit your program
-    /// with a custom error message.
-    pub fn with_description(description: &str, kind: ErrorKind) -> Self {
-        let c = Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: ColorWhen::Auto,
-        });
-        Error {
-            message: format!("{} {}", c.error("error:"), description),
-            kind: kind,
-            info: None,
-        }
-    }
-}
-
-impl StdError for Error {
-    fn description(&self) -> &str {
-        &*self.message
-    }
-}
-
-impl Display for Error {
-    fn fmt(&self, f: &mut std_fmt::Formatter) -> std_fmt::Result {
-        writeln!(f, "{}", self.message)
-    }
-}
-
-impl From<io::Error> for Error {
-    fn from(e: io::Error) -> Self {
-        Error::with_description(e.description(), ErrorKind::Io)
-    }
-}
-
-impl From<std_fmt::Error> for Error {
-    fn from(e: std_fmt::Error) -> Self {
-        Error::with_description(e.description(), ErrorKind::Format)
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/fmt.rs b/third_party/rust/clap/v2/crate/src/fmt.rs
deleted file mode 100644
index fa8b633..0000000
--- a/third_party/rust/clap/v2/crate/src/fmt.rs
+++ /dev/null
@@ -1,194 +0,0 @@
-#[cfg(all(feature = "color", not(target_os = "windows")))]
-use ansi_term::ANSIString;
-
-#[cfg(all(feature = "color", not(target_os = "windows")))]
-use ansi_term::Colour::{Green, Red, Yellow};
-
-#[cfg(feature = "color")]
-use atty;
-use std::env;
-use std::fmt;
-
-#[doc(hidden)]
-#[derive(Debug, Copy, Clone, PartialEq)]
-pub enum ColorWhen {
-    Auto,
-    Always,
-    Never,
-}
-
-#[cfg(feature = "color")]
-pub fn is_a_tty(stderr: bool) -> bool {
-    debugln!("is_a_tty: stderr={:?}", stderr);
-    let stream = if stderr {
-        atty::Stream::Stderr
-    } else {
-        atty::Stream::Stdout
-    };
-    atty::is(stream)
-}
-
-#[cfg(not(feature = "color"))]
-pub fn is_a_tty(_: bool) -> bool {
-    debugln!("is_a_tty;");
-    false
-}
-
-pub fn is_term_dumb() -> bool {
-    env::var("TERM").ok() == Some(String::from("dumb"))
-}
-
-#[doc(hidden)]
-pub struct ColorizerOption {
-    pub use_stderr: bool,
-    pub when: ColorWhen,
-}
-
-#[doc(hidden)]
-pub struct Colorizer {
-    when: ColorWhen,
-}
-
-macro_rules! color {
-    ($_self:ident, $c:ident, $m:expr) => {
-        match $_self.when {
-            ColorWhen::Auto => Format::$c($m),
-            ColorWhen::Always => Format::$c($m),
-            ColorWhen::Never => Format::None($m),
-        }
-    };
-}
-
-impl Colorizer {
-    pub fn new(option: ColorizerOption) -> Colorizer {
-        let is_a_tty = is_a_tty(option.use_stderr);
-        let is_term_dumb = is_term_dumb();
-        Colorizer {
-            when: match option.when {
-                ColorWhen::Auto if is_a_tty && !is_term_dumb => ColorWhen::Auto,
-                ColorWhen::Auto => ColorWhen::Never,
-                when => when,
-            },
-        }
-    }
-
-    pub fn good<T>(&self, msg: T) -> Format<T>
-    where
-        T: fmt::Display + AsRef<str>,
-    {
-        debugln!("Colorizer::good;");
-        color!(self, Good, msg)
-    }
-
-    pub fn warning<T>(&self, msg: T) -> Format<T>
-    where
-        T: fmt::Display + AsRef<str>,
-    {
-        debugln!("Colorizer::warning;");
-        color!(self, Warning, msg)
-    }
-
-    pub fn error<T>(&self, msg: T) -> Format<T>
-    where
-        T: fmt::Display + AsRef<str>,
-    {
-        debugln!("Colorizer::error;");
-        color!(self, Error, msg)
-    }
-
-    pub fn none<T>(&self, msg: T) -> Format<T>
-    where
-        T: fmt::Display + AsRef<str>,
-    {
-        debugln!("Colorizer::none;");
-        Format::None(msg)
-    }
-}
-
-impl Default for Colorizer {
-    fn default() -> Self {
-        Colorizer::new(ColorizerOption {
-            use_stderr: true,
-            when: ColorWhen::Auto,
-        })
-    }
-}
-
-/// Defines styles for different types of error messages. Defaults to Error=Red, Warning=Yellow,
-/// and Good=Green
-#[derive(Debug)]
-#[doc(hidden)]
-pub enum Format<T> {
-    /// Defines the style used for errors, defaults to Red
-    Error(T),
-    /// Defines the style used for warnings, defaults to Yellow
-    Warning(T),
-    /// Defines the style used for good values, defaults to Green
-    Good(T),
-    /// Defines no formatting style
-    None(T),
-}
-
-#[cfg(all(feature = "color", not(target_os = "windows")))]
-impl<T: AsRef<str>> Format<T> {
-    fn format(&self) -> ANSIString {
-        match *self {
-            Format::Error(ref e) => Red.bold().paint(e.as_ref()),
-            Format::Warning(ref e) => Yellow.paint(e.as_ref()),
-            Format::Good(ref e) => Green.paint(e.as_ref()),
-            Format::None(ref e) => ANSIString::from(e.as_ref()),
-        }
-    }
-}
-
-#[cfg(any(not(feature = "color"), target_os = "windows"))]
-#[cfg_attr(feature = "lints", allow(match_same_arms))]
-impl<T: fmt::Display> Format<T> {
-    fn format(&self) -> &T {
-        match *self {
-            Format::Error(ref e) => e,
-            Format::Warning(ref e) => e,
-            Format::Good(ref e) => e,
-            Format::None(ref e) => e,
-        }
-    }
-}
-
-#[cfg(all(feature = "color", not(target_os = "windows")))]
-impl<T: AsRef<str>> fmt::Display for Format<T> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}", &self.format())
-    }
-}
-
-#[cfg(any(not(feature = "color"), target_os = "windows"))]
-impl<T: fmt::Display> fmt::Display for Format<T> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        write!(f, "{}", &self.format())
-    }
-}
-
-#[cfg(all(test, feature = "color", not(target_os = "windows")))]
-mod test {
-    use super::Format;
-    use ansi_term::ANSIString;
-    use ansi_term::Colour::{Green, Red, Yellow};
-
-    #[test]
-    fn colored_output() {
-        let err = Format::Error("error");
-        assert_eq!(
-            &*format!("{}", err),
-            &*format!("{}", Red.bold().paint("error"))
-        );
-        let good = Format::Good("good");
-        assert_eq!(&*format!("{}", good), &*format!("{}", Green.paint("good")));
-        let warn = Format::Warning("warn");
-        assert_eq!(&*format!("{}", warn), &*format!("{}", Yellow.paint("warn")));
-        let none = Format::None("none");
-        assert_eq!(
-            &*format!("{}", none),
-            &*format!("{}", ANSIString::from("none"))
-        );
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/lib.rs b/third_party/rust/clap/v2/crate/src/lib.rs
deleted file mode 100644
index 17e2697b..0000000
--- a/third_party/rust/clap/v2/crate/src/lib.rs
+++ /dev/null
@@ -1,639 +0,0 @@
-// Copyright ⓒ 2015-2016 Kevin B. Knapp and [`clap-rs` contributors](https://github.com/clap-rs/clap/blob/v2.33.1/CONTRIBUTORS.md).
-// Licensed under the MIT license
-// (see LICENSE or <http://opensource.org/licenses/MIT>) All files in the project carrying such
-// notice may not be copied, modified, or distributed except according to those terms.
-
-//! `clap` is a simple-to-use, efficient, and full-featured library for parsing command line
-//! arguments and subcommands when writing console/terminal applications.
-//!
-//! ## About
-//!
-//! `clap` is used to parse *and validate* the string of command line arguments provided by the user
-//! at runtime. You provide the list of valid possibilities, and `clap` handles the rest. This means
-//! you focus on your *applications* functionality, and less on the parsing and validating of
-//! arguments.
-//!
-//! `clap` also provides the traditional version and help switches (or flags) 'for free' meaning
-//! automatically with no configuration. It does this by checking the list of valid possibilities you
-//! supplied and adding only the ones you haven't already defined. If you are using subcommands,
-//! `clap` will also auto-generate a `help` subcommand for you in addition to the traditional flags.
-//!
-//! Once `clap` parses the user provided string of arguments, it returns the matches along with any
-//! applicable values. If the user made an error or typo, `clap` informs them of the mistake and
-//! exits gracefully (or returns a `Result` type and allows you to perform any clean up prior to
-//! exit). Because of this, you can make reasonable assumptions in your code about the validity of
-//! the arguments.
-//!
-//!
-//! ## Quick Example
-//!
-//! The following examples show a quick example of some of the very basic functionality of `clap`.
-//! For more advanced usage, such as requirements, conflicts, groups, multiple values and
-//! occurrences see the [documentation](https://docs.rs/clap/), [examples/] directory of
-//! this repository or the [video tutorials].
-//!
-//! **NOTE:** All of these examples are functionally the same, but show different styles in which to
-//! use `clap`
-//!
-//! The first example shows a method that allows more advanced configuration options (not shown in
-//! this small example), or even dynamically generating arguments when desired. The downside is it's
-//! more verbose.
-//!
-//! ```no_run
-//! // (Full example with detailed comments in examples/01b_quick_example.rs)
-//! //
-//! // This example demonstrates clap's full 'builder pattern' style of creating arguments which is
-//! // more verbose, but allows easier editing, and at times more advanced options, or the possibility
-//! // to generate arguments dynamically.
-//! extern crate clap;
-//! use clap::{Arg, App, SubCommand};
-//!
-//! fn main() {
-//!     let matches = App::new("My Super Program")
-//!                           .version("1.0")
-//!                           .author("Kevin K. <kbknapp@gmail.com>")
-//!                           .about("Does awesome things")
-//!                           .arg(Arg::with_name("config")
-//!                                .short("c")
-//!                                .long("config")
-//!                                .value_name("FILE")
-//!                                .help("Sets a custom config file")
-//!                                .takes_value(true))
-//!                           .arg(Arg::with_name("INPUT")
-//!                                .help("Sets the input file to use")
-//!                                .required(true)
-//!                                .index(1))
-//!                           .arg(Arg::with_name("v")
-//!                                .short("v")
-//!                                .multiple(true)
-//!                                .help("Sets the level of verbosity"))
-//!                           .subcommand(SubCommand::with_name("test")
-//!                                       .about("controls testing features")
-//!                                       .version("1.3")
-//!                                       .author("Someone E. <someone_else@other.com>")
-//!                                       .arg(Arg::with_name("debug")
-//!                                           .short("d")
-//!                                           .help("print debug information verbosely")))
-//!                           .get_matches();
-//!
-//!     // Gets a value for config if supplied by user, or defaults to "default.conf"
-//!     let config = matches.value_of("config").unwrap_or("default.conf");
-//!     println!("Value for config: {}", config);
-//!
-//!     // Calling .unwrap() is safe here because "INPUT" is required (if "INPUT" wasn't
-//!     // required we could have used an 'if let' to conditionally get the value)
-//!     println!("Using input file: {}", matches.value_of("INPUT").unwrap());
-//!
-//!     // Vary the output based on how many times the user used the "verbose" flag
-//!     // (i.e. 'myprog -v -v -v' or 'myprog -vvv' vs 'myprog -v'
-//!     match matches.occurrences_of("v") {
-//!         0 => println!("No verbose info"),
-//!         1 => println!("Some verbose info"),
-//!         2 => println!("Tons of verbose info"),
-//!         3 | _ => println!("Don't be crazy"),
-//!     }
-//!
-//!     // You can handle information about subcommands by requesting their matches by name
-//!     // (as below), requesting just the name used, or both at the same time
-//!     if let Some(matches) = matches.subcommand_matches("test") {
-//!         if matches.is_present("debug") {
-//!             println!("Printing debug info...");
-//!         } else {
-//!             println!("Printing normally...");
-//!         }
-//!     }
-//!
-//!     // more program logic goes here...
-//! }
-//! ```
-//!
-//! The next example shows a far less verbose method, but sacrifices some of the advanced
-//! configuration options (not shown in this small example). This method also takes a *very* minor
-//! runtime penalty.
-//!
-//! ```no_run
-//! // (Full example with detailed comments in examples/01a_quick_example.rs)
-//! //
-//! // This example demonstrates clap's "usage strings" method of creating arguments
-//! // which is less verbose
-//! extern crate clap;
-//! use clap::{Arg, App, SubCommand};
-//!
-//! fn main() {
-//!     let matches = App::new("myapp")
-//!                           .version("1.0")
-//!                           .author("Kevin K. <kbknapp@gmail.com>")
-//!                           .about("Does awesome things")
-//!                           .args_from_usage(
-//!                               "-c, --config=[FILE] 'Sets a custom config file'
-//!                               <INPUT>              'Sets the input file to use'
-//!                               -v...                'Sets the level of verbosity'")
-//!                           .subcommand(SubCommand::with_name("test")
-//!                                       .about("controls testing features")
-//!                                       .version("1.3")
-//!                                       .author("Someone E. <someone_else@other.com>")
-//!                                       .arg_from_usage("-d, --debug 'Print debug information'"))
-//!                           .get_matches();
-//!
-//!     // Same as previous example...
-//! }
-//! ```
-//!
-//! This third method shows how you can use a YAML file to build your CLI and keep your Rust source
-//! tidy or support multiple localized translations by having different YAML files for each
-//! localization.
-//!
-//! First, create the `cli.yml` file to hold your CLI options, but it could be called anything we
-//! like:
-//!
-//! ```yaml
-//! name: myapp
-//! version: "1.0"
-//! author: Kevin K. <kbknapp@gmail.com>
-//! about: Does awesome things
-//! args:
-//!     - config:
-//!         short: c
-//!         long: config
-//!         value_name: FILE
-//!         help: Sets a custom config file
-//!         takes_value: true
-//!     - INPUT:
-//!         help: Sets the input file to use
-//!         required: true
-//!         index: 1
-//!     - verbose:
-//!         short: v
-//!         multiple: true
-//!         help: Sets the level of verbosity
-//! subcommands:
-//!     - test:
-//!         about: controls testing features
-//!         version: "1.3"
-//!         author: Someone E. <someone_else@other.com>
-//!         args:
-//!             - debug:
-//!                 short: d
-//!                 help: print debug information
-//! ```
-//!
-//! Since this feature requires additional dependencies that not everyone may want, it is *not*
-//! compiled in by default and we need to enable a feature flag in Cargo.toml:
-//!
-//! Simply change your `clap = "~2.27.0"` to `clap = {version = "~2.27.0", features = ["yaml"]}`.
-//!
-//! At last we create our `main.rs` file just like we would have with the previous two examples:
-//!
-//! ```ignore
-//! // (Full example with detailed comments in examples/17_yaml.rs)
-//! //
-//! // This example demonstrates clap's building from YAML style of creating arguments which is far
-//! // more clean, but takes a very small performance hit compared to the other two methods.
-//! #[macro_use]
-//! extern crate clap;
-//! use clap::App;
-//!
-//! fn main() {
-//!     // The YAML file is found relative to the current file, similar to how modules are found
-//!     let yaml = load_yaml!("cli.yml");
-//!     let matches = App::from_yaml(yaml).get_matches();
-//!
-//!     // Same as previous examples...
-//! }
-//! ```
-//!
-//! Finally there is a macro version, which is like a hybrid approach offering the speed of the
-//! builder pattern (the first example), but without all the verbosity.
-//!
-//! ```no_run
-//! #[macro_use]
-//! extern crate clap;
-//!
-//! fn main() {
-//!     let matches = clap_app!(myapp =>
-//!         (version: "1.0")
-//!         (author: "Kevin K. <kbknapp@gmail.com>")
-//!         (about: "Does awesome things")
-//!         (@arg CONFIG: -c --config +takes_value "Sets a custom config file")
-//!         (@arg INPUT: +required "Sets the input file to use")
-//!         (@arg debug: -d ... "Sets the level of debugging information")
-//!         (@subcommand test =>
-//!             (about: "controls testing features")
-//!             (version: "1.3")
-//!             (author: "Someone E. <someone_else@other.com>")
-//!             (@arg verbose: -v --verbose "Print test information verbosely")
-//!         )
-//!     ).get_matches();
-//!
-//!     // Same as before...
-//! }
-//! ```
-//!
-//! If you were to compile any of the above programs and run them with the flag `--help` or `-h` (or
-//! `help` subcommand, since we defined `test` as a subcommand) the following would be output
-//!
-//! ```text
-//! $ myprog --help
-//! My Super Program 1.0
-//! Kevin K. <kbknapp@gmail.com>
-//! Does awesome things
-//!
-//! USAGE:
-//!     MyApp [FLAGS] [OPTIONS] <INPUT> [SUBCOMMAND]
-//!
-//! FLAGS:
-//!     -h, --help       Prints this message
-//!     -v               Sets the level of verbosity
-//!     -V, --version    Prints version information
-//!
-//! OPTIONS:
-//!     -c, --config <FILE>    Sets a custom config file
-//!
-//! ARGS:
-//!     INPUT    The input file to use
-//!
-//! SUBCOMMANDS:
-//!     help    Prints this message
-//!     test    Controls testing features
-//! ```
-//!
-//! **NOTE:** You could also run `myapp test --help` to see similar output and options for the
-//! `test` subcommand.
-//!
-//! ## Try it!
-//!
-//! ### Pre-Built Test
-//!
-//! To try out the pre-built example, use the following steps:
-//!
-//! * Clone the repository `$ git clone https://github.com/clap-rs/clap && cd clap-rs/tests`
-//! * Compile the example `$ cargo build --release`
-//! * Run the help info `$ ./target/release/claptests --help`
-//! * Play with the arguments!
-//!
-//! ### BYOB (Build Your Own Binary)
-//!
-//! To test out `clap`'s default auto-generated help/version follow these steps:
-//!
-//! * Create a new cargo project `$ cargo new fake --bin && cd fake`
-//! * Add `clap` to your `Cargo.toml`
-//!
-//! ```toml
-//! [dependencies]
-//! clap = "2"
-//! ```
-//!
-//! * Add the following to your `src/main.rs`
-//!
-//! ```no_run
-//! extern crate clap;
-//! use clap::App;
-//!
-//! fn main() {
-//!   App::new("fake").version("v1.0-beta").get_matches();
-//! }
-//! ```
-//!
-//! * Build your program `$ cargo build --release`
-//! * Run with help or version `$ ./target/release/fake --help` or `$ ./target/release/fake
-//! --version`
-//!
-//! ## Usage
-//!
-//! For full usage, add `clap` as a dependency in your `Cargo.toml` (it is **highly** recommended to
-//! use the `~major.minor.patch` style versions in your `Cargo.toml`, for more information see
-//! [Compatibility Policy](#compatibility-policy)) to use from crates.io:
-//!
-//! ```toml
-//! [dependencies]
-//! clap = "~2.27.0"
-//! ```
-//!
-//! Or get the latest changes from the master branch at github:
-//!
-//! ```toml
-//! [dependencies.clap]
-//! git = "https://github.com/clap-rs/clap.git"
-//! ```
-//!
-//! Add `extern crate clap;` to your crate root.
-//!
-//! Define a list of valid arguments for your program (see the
-//! [documentation](https://docs.rs/clap/) or [examples/] directory of this repo)
-//!
-//! Then run `cargo build` or `cargo update && cargo build` for your project.
-//!
-//! ### Optional Dependencies / Features
-//!
-//! #### Features enabled by default
-//!
-//! * `suggestions`: Turns on the `Did you mean '--myoption'?` feature for when users make typos. (builds dependency `strsim`)
-//! * `color`: Turns on colored error messages. This feature only works on non-Windows OSs. (builds dependency `ansi-term` and `atty`)
-//! * `wrap_help`: Wraps the help at the actual terminal width when
-//!  available, instead of 120 characters. (builds dependency `textwrap`
-//! with feature `term_size`)
-//!
-//! To disable these, add this to your `Cargo.toml`:
-//!
-//! ```toml
-//! [dependencies.clap]
-//! version = "~2.27.0"
-//! default-features = false
-//! ```
-//!
-//! You can also selectively enable only the features you'd like to include, by adding:
-//!
-//! ```toml
-//! [dependencies.clap]
-//! version = "~2.27.0"
-//! default-features = false
-//!
-//! # Cherry-pick the features you'd like to use
-//! features = [ "suggestions", "color" ]
-//! ```
-//!
-//! #### Opt-in features
-//!
-//! * **"yaml"**: Enables building CLIs from YAML documents. (builds dependency `yaml-rust`)
-//! * **"unstable"**: Enables unstable `clap` features that may change from release to release
-//!
-//! ### Dependencies Tree
-//!
-//! The following graphic depicts `clap`s dependency graph (generated using
-//! [cargo-graph](https://github.com/kbknapp/cargo-graph)).
-//!
-//!  * **Dashed** Line: Optional dependency
-//!  * **Red** Color: **NOT** included by default (must use cargo `features` to enable)
-//!  * **Blue** Color: Dev dependency, only used while developing.
-//!
-//! ![clap dependencies](https://github.com/clap-rs/clap/blob/v2.33.1/clap_dep_graph.png)
-//!
-//! ### More Information
-//!
-//! You can find complete documentation on the [docs.rs](https://docs.rs/clap/) for this project.
-//!
-//! You can also find usage examples in the [examples/] directory of this repo.
-//!
-//! #### Video Tutorials
-//!
-//! There's also the video tutorial series [Argument Parsing with Rust v2][video tutorials].
-//!
-//! These videos slowly trickle out as I finish them and currently a work in progress.
-//!
-//! ## How to Contribute
-//!
-//! Contributions are always welcome! And there is a multitude of ways in which you can help
-//! depending on what you like to do, or are good at. Anything from documentation, code cleanup,
-//! issue completion, new features, you name it, even filing issues is contributing and greatly
-//! appreciated!
-//!
-//! Another really great way to help is if you find an interesting, or helpful way in which to use
-//! `clap`. You can either add it to the [examples/] directory, or file an issue and tell
-//! me. I'm all about giving credit where credit is due :)
-//!
-//! Please read [CONTRIBUTING.md](https://github.com/clap-rs/clap/blob/v2.33.1/.github/CONTRIBUTING.md) before you start contributing.
-//!
-//!
-//! ### Testing Code
-//!
-//! To test with all features both enabled and disabled, you can run theese commands:
-//!
-//! ```text
-//! $ cargo test --no-default-features
-//! $ cargo test --features "yaml unstable"
-//! ```
-//!
-//! Alternatively, if you have [`just`](https://github.com/casey/just) installed you can run the
-//! prebuilt recipes. *Not* using `just` is perfectly fine as well, it simply bundles commands
-//! automatically.
-//!
-//! For example, to test the code, as above simply run:
-//!
-//! ```text
-//! $ just run-tests
-//! ```
-//!
-//! From here on, I will list the appropriate `cargo` command as well as the `just` command.
-//!
-//! Sometimes it's helpful to only run a subset of the tests, which can be done via:
-//!
-//! ```text
-//! $ cargo test --test <test_name>
-//!
-//! # Or
-//!
-//! $ just run-test <test_name>
-//! ```
-//!
-//! ### Linting Code
-//!
-//! During the CI process `clap` runs against many different lints using
-//! [`clippy`](https://github.com/Manishearth/rust-clippy). In order to check if these lints pass on
-//! your own computer prior to submitting a PR you'll need a nightly compiler.
-//!
-//! In order to check the code for lints run either:
-//!
-//! ```text
-//! $ rustup override add nightly
-//! $ cargo build --features lints
-//! $ rustup override remove
-//!
-//! # Or
-//!
-//! $ just lint
-//! ```
-//!
-//! ### Debugging Code
-//!
-//! Another helpful technique is to see the `clap` debug output while developing features. In order
-//! to see the debug output while running the full test suite or individual tests, run:
-//!
-//! ```text
-//! $ cargo test --features debug
-//!
-//! # Or for individual tests
-//! $ cargo test --test <test_name> --features debug
-//!
-//! # The corresponding just command for individual debugging tests is:
-//! $ just debug <test_name>
-//! ```
-//!
-//! ### Goals
-//!
-//! There are a few goals of `clap` that I'd like to maintain throughout contributions. If your
-//! proposed changes break, or go against any of these goals we'll discuss the changes further
-//! before merging (but will *not* be ignored, all contributes are welcome!). These are by no means
-//! hard-and-fast rules, as I'm no expert and break them myself from time to time (even if by
-//! mistake or ignorance).
-//!
-//! * Remain backwards compatible when possible
-//!   - If backwards compatibility *must* be broken, use deprecation warnings if at all possible before
-//!   removing legacy code - This does not apply for security concerns
-//! * Parse arguments quickly
-//!   - Parsing of arguments shouldn't slow down usage of the main program - This is also true of
-//!   generating help and usage information (although *slightly* less stringent, as the program is about
-//!   to exit)
-//! * Try to be cognizant of memory usage
-//!   - Once parsing is complete, the memory footprint of `clap` should be low since the  main program
-//!   is the star of the show
-//! * `panic!` on *developer* error, exit gracefully on *end-user* error
-//!
-//! ### Compatibility Policy
-//!
-//! Because `clap` takes `SemVer` and compatibility seriously, this is the official policy regarding
-//! breaking changes and previous versions of Rust.
-//!
-//! `clap` will pin the minimum required version of Rust to the CI builds. Bumping the minimum
-//! version of Rust is considered a minor breaking change, meaning *at a minimum* the minor version
-//! of `clap` will be bumped.
-//!
-//! In order to keep from being surprised by breaking changes, it is **highly** recommended to use
-//! the `~major.minor.patch` style in your `Cargo.toml`:
-//!
-//! ```toml
-//! [dependencies] clap = "~2.27.0"
-//! ```
-//!
-//! This will cause *only* the patch version to be updated upon a `cargo update` call, and therefore
-//! cannot break due to new features, or bumped minimum versions of Rust.
-//!
-//! #### Minimum Version of Rust
-//!
-//! `clap` will officially support current stable Rust, minus two releases, but may work with prior
-//! releases as well. For example, current stable Rust at the time of this writing is 1.21.0,
-//! meaning `clap` is guaranteed to compile with 1.19.0 and beyond. At the 1.22.0 release, `clap`
-//! will be guaranteed to compile with 1.20.0 and beyond, etc.
-//!
-//! Upon bumping the minimum version of Rust (assuming it's within the stable-2 range), it *must* be
-//! clearly annotated in the `CHANGELOG.md`
-//!
-//! ## License
-//!
-//! `clap` is licensed under the MIT license. Please read the [LICENSE-MIT][license] file in
-//! this repository for more information.
-//!
-//! [examples/]: https://github.com/clap-rs/clap/tree/v2.33.1/examples
-//! [video tutorials]: https://www.youtube.com/playlist?list=PLza5oFLQGTl2Z5T8g1pRkIynR3E0_pc7U
-//! [license]: https://github.com/clap-rs/clap/blob/v2.33.1/LICENSE-MIT
-
-#![crate_type = "lib"]
-#![doc(html_root_url = "https://docs.rs/clap/2.33.3")]
-#![deny(
-    missing_docs,
-    missing_debug_implementations,
-    missing_copy_implementations,
-    trivial_casts,
-    unused_import_braces,
-    unused_allocation
-)]
-// Lints we'd like to deny but are currently failing for upstream crates
-//      unused_qualifications       (bitflags, clippy)
-//      trivial_numeric_casts       (bitflags)
-#![cfg_attr(
-    not(any(feature = "lints", feature = "nightly")),
-    forbid(unstable_features)
-)]
-#![cfg_attr(feature = "lints", feature(plugin))]
-#![cfg_attr(feature = "lints", plugin(clippy))]
-// Need to disable deny(warnings) while deprecations are active
-// #![cfg_attr(feature = "lints", deny(warnings))]
-#![cfg_attr(feature = "lints", allow(cyclomatic_complexity))]
-#![cfg_attr(feature = "lints", allow(doc_markdown))]
-#![cfg_attr(feature = "lints", allow(explicit_iter_loop))]
-
-#[cfg(all(feature = "color", not(target_os = "windows")))]
-extern crate ansi_term;
-#[cfg(feature = "color")]
-extern crate atty;
-#[macro_use]
-extern crate bitflags;
-#[cfg(feature = "suggestions")]
-extern crate strsim;
-#[cfg(feature = "wrap_help")]
-extern crate term_size;
-extern crate textwrap;
-extern crate unicode_width;
-#[cfg(feature = "vec_map")]
-extern crate vec_map;
-#[cfg(feature = "yaml")]
-extern crate yaml_rust;
-
-pub use app::{App, AppSettings};
-pub use args::{Arg, ArgGroup, ArgMatches, ArgSettings, OsValues, SubCommand, Values};
-pub use completions::Shell;
-pub use errors::{Error, ErrorKind, Result};
-pub use fmt::Format;
-#[cfg(feature = "yaml")]
-pub use yaml_rust::YamlLoader;
-
-#[macro_use]
-mod macros;
-mod app;
-mod args;
-mod completions;
-mod errors;
-mod fmt;
-mod map;
-mod osstringext;
-mod strext;
-mod suggestions;
-mod usage_parser;
-
-const INTERNAL_ERROR_MSG: &'static str = "Fatal internal error. Please consider filing a bug \
-                                          report at https://github.com/clap-rs/clap/issues";
-const INVALID_UTF8: &'static str = "unexpected invalid UTF-8 code point";
-
-#[cfg(unstable)]
-pub use derive::{ArgEnum, ClapApp, FromArgMatches, IntoApp};
-
-#[cfg(unstable)]
-mod derive {
-    /// @TODO @release @docs
-    pub trait ClapApp: IntoApp + FromArgMatches + Sized {
-        /// @TODO @release @docs
-        fn parse() -> Self {
-            Self::from_argmatches(Self::into_app().get_matches())
-        }
-
-        /// @TODO @release @docs
-        fn parse_from<I, T>(argv: I) -> Self
-        where
-            I: IntoIterator<Item = T>,
-            T: Into<OsString> + Clone,
-        {
-            Self::from_argmatches(Self::into_app().get_matches_from(argv))
-        }
-
-        /// @TODO @release @docs
-        fn try_parse() -> Result<Self, clap::Error> {
-            Self::try_from_argmatches(Self::into_app().get_matches_safe()?)
-        }
-
-        /// @TODO @release @docs
-        fn try_parse_from<I, T>(argv: I) -> Result<Self, clap::Error>
-        where
-            I: IntoIterator<Item = T>,
-            T: Into<OsString> + Clone,
-        {
-            Self::try_from_argmatches(Self::into_app().get_matches_from_safe(argv)?)
-        }
-    }
-
-    /// @TODO @release @docs
-    pub trait IntoApp {
-        /// @TODO @release @docs
-        fn into_app<'a, 'b>() -> clap::App<'a, 'b>;
-    }
-
-    /// @TODO @release @docs
-    pub trait FromArgMatches: Sized {
-        /// @TODO @release @docs
-        fn from_argmatches<'a>(matches: clap::ArgMatches<'a>) -> Self;
-
-        /// @TODO @release @docs
-        fn try_from_argmatches<'a>(matches: clap::ArgMatches<'a>) -> Result<Self, clap::Error>;
-    }
-
-    /// @TODO @release @docs
-    pub trait ArgEnum {}
-}
diff --git a/third_party/rust/clap/v2/crate/src/macros.rs b/third_party/rust/clap/v2/crate/src/macros.rs
deleted file mode 100644
index 3b5a36b9..0000000
--- a/third_party/rust/clap/v2/crate/src/macros.rs
+++ /dev/null
@@ -1,1126 +0,0 @@
-/// A convenience macro for loading the YAML file at compile time (relative to the current file,
-/// like modules work). That YAML object can then be passed to this function.
-///
-/// # Panics
-///
-/// The YAML file must be properly formatted or this function will panic!(). A good way to
-/// ensure this doesn't happen is to run your program with the `--help` switch. If this passes
-/// without error, you needn't worry because the YAML is properly formatted.
-///
-/// # Examples
-///
-/// The following example shows how to load a properly formatted YAML file to build an instance
-/// of an `App` struct.
-///
-/// ```ignore
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let yml = load_yaml!("app.yml");
-/// let app = App::from_yaml(yml);
-///
-/// // continued logic goes here, such as `app.get_matches()` etc.
-/// # }
-/// ```
-#[cfg(feature = "yaml")]
-#[macro_export]
-macro_rules! load_yaml {
-    ($yml:expr) => {
-        &::clap::YamlLoader::load_from_str(include_str!($yml)).expect("failed to load YAML file")[0]
-    };
-}
-
-/// Convenience macro getting a typed value `T` where `T` implements [`std::str::FromStr`] from an
-/// argument value. This macro returns a `Result<T,String>` which allows you as the developer to
-/// decide what you'd like to do on a failed parse. There are two types of errors, parse failures
-/// and those where the argument wasn't present (such as a non-required argument). You can use
-/// it to get a single value, or a iterator as with the [`ArgMatches::values_of`]
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let matches = App::new("myapp")
-///               .arg_from_usage("[length] 'Set the length to use as a pos whole num, i.e. 20'")
-///               .get_matches();
-///
-/// let len      = value_t!(matches.value_of("length"), u32).unwrap_or_else(|e| e.exit());
-/// let also_len = value_t!(matches, "length", u32).unwrap_or_else(|e| e.exit());
-///
-/// println!("{} + 2: {}", len, len + 2);
-/// # }
-/// ```
-/// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`ArgMatches::values_of`]: ./struct.ArgMatches.html#method.values_of
-/// [`Result<T,String>`]: https://doc.rust-lang.org/std/result/enum.Result.html
-#[macro_export]
-macro_rules! value_t {
-    ($m:ident, $v:expr, $t:ty) => {
-        value_t!($m.value_of($v), $t)
-    };
-    ($m:ident.value_of($v:expr), $t:ty) => {
-        if let Some(v) = $m.value_of($v) {
-            match v.parse::<$t>() {
-                Ok(val) => Ok(val),
-                Err(_) => Err(::clap::Error::value_validation_auto(format!(
-                    "The argument '{}' isn't a valid value",
-                    v
-                ))),
-            }
-        } else {
-            Err(::clap::Error::argument_not_found_auto($v))
-        }
-    };
-}
-
-/// Convenience macro getting a typed value `T` where `T` implements [`std::str::FromStr`] or
-/// exiting upon error, instead of returning a [`Result`] type.
-///
-/// **NOTE:** This macro is for backwards compatibility sake. Prefer
-/// [`value_t!(/* ... */).unwrap_or_else(|e| e.exit())`]
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let matches = App::new("myapp")
-///               .arg_from_usage("[length] 'Set the length to use as a pos whole num, i.e. 20'")
-///               .get_matches();
-///
-/// let len      = value_t_or_exit!(matches.value_of("length"), u32);
-/// let also_len = value_t_or_exit!(matches, "length", u32);
-///
-/// println!("{} + 2: {}", len, len + 2);
-/// # }
-/// ```
-/// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`Result`]: https://doc.rust-lang.org/std/result/enum.Result.html
-/// [`value_t!(/* ... */).unwrap_or_else(|e| e.exit())`]: ./macro.value_t!.html
-#[macro_export]
-macro_rules! value_t_or_exit {
-    ($m:ident, $v:expr, $t:ty) => {
-        value_t_or_exit!($m.value_of($v), $t)
-    };
-    ($m:ident.value_of($v:expr), $t:ty) => {
-        if let Some(v) = $m.value_of($v) {
-            match v.parse::<$t>() {
-                Ok(val) => val,
-                Err(_) => ::clap::Error::value_validation_auto(format!(
-                    "The argument '{}' isn't a valid value",
-                    v
-                ))
-                .exit(),
-            }
-        } else {
-            ::clap::Error::argument_not_found_auto($v).exit()
-        }
-    };
-}
-
-/// Convenience macro getting a typed value [`Vec<T>`] where `T` implements [`std::str::FromStr`]
-/// This macro returns a [`clap::Result<Vec<T>>`] which allows you as the developer to decide
-/// what you'd like to do on a failed parse.
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let matches = App::new("myapp")
-///               .arg_from_usage("[seq]... 'A sequence of pos whole nums, i.e. 20 45'")
-///               .get_matches();
-///
-/// let vals = values_t!(matches.values_of("seq"), u32).unwrap_or_else(|e| e.exit());
-/// for v in &vals {
-///     println!("{} + 2: {}", v, v + 2);
-/// }
-///
-/// let vals = values_t!(matches, "seq", u32).unwrap_or_else(|e| e.exit());
-/// for v in &vals {
-///     println!("{} + 2: {}", v, v + 2);
-/// }
-/// # }
-/// ```
-/// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`Vec<T>`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
-/// [`clap::Result<Vec<T>>`]: ./type.Result.html
-#[macro_export]
-macro_rules! values_t {
-    ($m:ident, $v:expr, $t:ty) => {
-        values_t!($m.values_of($v), $t)
-    };
-    ($m:ident.values_of($v:expr), $t:ty) => {
-        if let Some(vals) = $m.values_of($v) {
-            let mut tmp = vec![];
-            let mut err = None;
-            for pv in vals {
-                match pv.parse::<$t>() {
-                    Ok(rv) => tmp.push(rv),
-                    Err(..) => {
-                        err = Some(::clap::Error::value_validation_auto(format!(
-                            "The argument '{}' isn't a valid value",
-                            pv
-                        )));
-                        break;
-                    }
-                }
-            }
-            match err {
-                Some(e) => Err(e),
-                None => Ok(tmp),
-            }
-        } else {
-            Err(::clap::Error::argument_not_found_auto($v))
-        }
-    };
-}
-
-/// Convenience macro getting a typed value [`Vec<T>`] where `T` implements [`std::str::FromStr`]
-/// or exiting upon error.
-///
-/// **NOTE:** This macro is for backwards compatibility sake. Prefer
-/// [`values_t!(/* ... */).unwrap_or_else(|e| e.exit())`]
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let matches = App::new("myapp")
-///               .arg_from_usage("[seq]... 'A sequence of pos whole nums, i.e. 20 45'")
-///               .get_matches();
-///
-/// let vals = values_t_or_exit!(matches.values_of("seq"), u32);
-/// for v in &vals {
-///     println!("{} + 2: {}", v, v + 2);
-/// }
-///
-/// // type for example only
-/// let vals: Vec<u32> = values_t_or_exit!(matches, "seq", u32);
-/// for v in &vals {
-///     println!("{} + 2: {}", v, v + 2);
-/// }
-/// # }
-/// ```
-/// [`values_t!(/* ... */).unwrap_or_else(|e| e.exit())`]: ./macro.values_t!.html
-/// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`Vec<T>`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
-#[macro_export]
-macro_rules! values_t_or_exit {
-    ($m:ident, $v:expr, $t:ty) => {
-        values_t_or_exit!($m.values_of($v), $t)
-    };
-    ($m:ident.values_of($v:expr), $t:ty) => {
-        if let Some(vals) = $m.values_of($v) {
-            vals.map(|v| {
-                v.parse::<$t>().unwrap_or_else(|_| {
-                    ::clap::Error::value_validation_auto(format!(
-                        "One or more arguments aren't valid values"
-                    ))
-                    .exit()
-                })
-            })
-            .collect::<Vec<$t>>()
-        } else {
-            ::clap::Error::argument_not_found_auto($v).exit()
-        }
-    };
-}
-
-// _clap_count_exprs! is derived from https://github.com/DanielKeep/rust-grabbag
-// commit: 82a35ca5d9a04c3b920622d542104e3310ee5b07
-// License: MIT
-// Copyright ⓒ 2015 grabbag contributors.
-// Licensed under the MIT license (see LICENSE or <http://opensource.org
-// /licenses/MIT>) or the Apache License, Version 2.0 (see LICENSE of
-// <http://www.apache.org/licenses/LICENSE-2.0>), at your option. All
-// files in the project carrying such notice may not be copied, modified,
-// or distributed except according to those terms.
-//
-/// Counts the number of comma-delimited expressions passed to it.  The result is a compile-time
-/// evaluable expression, suitable for use as a static array size, or the value of a `const`.
-///
-/// # Examples
-///
-/// ```
-/// # #[macro_use] extern crate clap;
-/// # fn main() {
-/// const COUNT: usize = _clap_count_exprs!(a, 5+1, "hi there!".into_string());
-/// assert_eq!(COUNT, 3);
-/// # }
-/// ```
-#[macro_export]
-macro_rules! _clap_count_exprs {
-    () => { 0 };
-    ($e:expr) => { 1 };
-    ($e:expr, $($es:expr),+) => { 1 + $crate::_clap_count_exprs!($($es),*) };
-}
-
-/// Convenience macro to generate more complete enums with variants to be used as a type when
-/// parsing arguments. This enum also provides a `variants()` function which can be used to
-/// retrieve a `Vec<&'static str>` of the variant names, as well as implementing [`FromStr`] and
-/// [`Display`] automatically.
-///
-/// **NOTE:** Case insensitivity is supported for ASCII characters only. It's highly recommended to
-/// use [`Arg::case_insensitive(true)`] for args that will be used with these enums
-///
-/// **NOTE:** This macro automatically implements [`std::str::FromStr`] and [`std::fmt::Display`]
-///
-/// **NOTE:** These enums support pub (or not) and uses of the `#[derive()]` traits
-///
-/// # Examples
-///
-/// ```rust
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::{App, Arg};
-/// arg_enum!{
-///     #[derive(PartialEq, Debug)]
-///     pub enum Foo {
-///         Bar,
-///         Baz,
-///         Qux
-///     }
-/// }
-/// // Foo enum can now be used via Foo::Bar, or Foo::Baz, etc
-/// // and implements std::str::FromStr to use with the value_t! macros
-/// fn main() {
-///     let m = App::new("app")
-///                 .arg(Arg::from_usage("<foo> 'the foo'")
-///                     .possible_values(&Foo::variants())
-///                     .case_insensitive(true))
-///                 .get_matches_from(vec![
-///                     "app", "baz"
-///                 ]);
-///     let f = value_t!(m, "foo", Foo).unwrap_or_else(|e| e.exit());
-///
-///     assert_eq!(f, Foo::Baz);
-/// }
-/// ```
-/// [`FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`std::str::FromStr`]: https://doc.rust-lang.org/std/str/trait.FromStr.html
-/// [`Display`]: https://doc.rust-lang.org/std/fmt/trait.Display.html
-/// [`std::fmt::Display`]: https://doc.rust-lang.org/std/fmt/trait.Display.html
-/// [`Arg::case_insensitive(true)`]: ./struct.Arg.html#method.case_insensitive
-#[macro_export]
-macro_rules! arg_enum {
-    (@as_item $($i:item)*) => ($($i)*);
-    (@impls ( $($tts:tt)* ) -> ($e:ident, $($v:ident),+)) => {
-        arg_enum!(@as_item
-        $($tts)*
-
-        impl ::std::str::FromStr for $e {
-            type Err = String;
-
-            fn from_str(s: &str) -> ::std::result::Result<Self,Self::Err> {
-                #[allow(deprecated, unused_imports)]
-                use ::std::ascii::AsciiExt;
-                match s {
-                    $(stringify!($v) |
-                    _ if s.eq_ignore_ascii_case(stringify!($v)) => Ok($e::$v)),+,
-                    _ => Err({
-                        let v = vec![
-                            $(stringify!($v),)+
-                        ];
-                        format!("valid values: {}",
-                            v.join(", "))
-                    }),
-                }
-            }
-        }
-        impl ::std::fmt::Display for $e {
-            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-                match *self {
-                    $($e::$v => write!(f, stringify!($v)),)+
-                }
-            }
-        }
-        impl $e {
-            #[allow(dead_code)]
-            pub fn variants() -> [&'static str; $crate::_clap_count_exprs!($(stringify!($v)),+)] {
-                [
-                    $(stringify!($v),)+
-                ]
-            }
-        });
-    };
-    ($(#[$($m:meta),+])+ pub enum $e:ident { $($v:ident $(=$val:expr)*,)+ } ) => {
-        arg_enum!(@impls
-            ($(#[$($m),+])+
-            pub enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-    ($(#[$($m:meta),+])+ pub enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
-        arg_enum!(@impls
-            ($(#[$($m),+])+
-            pub enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-    ($(#[$($m:meta),+])+ enum $e:ident { $($v:ident $(=$val:expr)*,)+ } ) => {
-        arg_enum!(@impls
-            ($(#[$($m),+])+
-             enum $e {
-                 $($v$(=$val)*),+
-             }) -> ($e, $($v),+)
-        );
-    };
-    ($(#[$($m:meta),+])+ enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
-        arg_enum!(@impls
-            ($(#[$($m),+])+
-            enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-    (pub enum $e:ident { $($v:ident $(=$val:expr)*,)+ } ) => {
-        arg_enum!(@impls
-            (pub enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-    (pub enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
-        arg_enum!(@impls
-            (pub enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-    (enum $e:ident { $($v:ident $(=$val:expr)*,)+ } ) => {
-        arg_enum!(@impls
-            (enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-    (enum $e:ident { $($v:ident $(=$val:expr)*),+ } ) => {
-        arg_enum!(@impls
-            (enum $e {
-                $($v$(=$val)*),+
-            }) -> ($e, $($v),+)
-        );
-    };
-}
-
-/// Allows you to pull the version from your Cargo.toml at compile time as
-/// `MAJOR.MINOR.PATCH_PKGVERSION_PRE`
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let m = App::new("app")
-///             .version(crate_version!())
-///             .get_matches();
-/// # }
-/// ```
-#[cfg(not(feature = "no_cargo"))]
-#[macro_export]
-macro_rules! crate_version {
-    () => {
-        env!("CARGO_PKG_VERSION")
-    };
-}
-
-/// Allows you to pull the authors for the app from your Cargo.toml at
-/// compile time in the form:
-/// `"author1 lastname <author1@example.com>:author2 lastname <author2@example.com>"`
-///
-/// You can replace the colons with a custom separator by supplying a
-/// replacement string, so, for example,
-/// `crate_authors!(",\n")` would become
-/// `"author1 lastname <author1@example.com>,\nauthor2 lastname <author2@example.com>,\nauthor3 lastname <author3@example.com>"`
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let m = App::new("app")
-///             .author(crate_authors!("\n"))
-///             .get_matches();
-/// # }
-/// ```
-#[cfg(not(feature = "no_cargo"))]
-#[macro_export]
-macro_rules! crate_authors {
-    ($sep:expr) => {{
-        use std::ops::Deref;
-        #[allow(deprecated)]
-        use std::sync::{Once, ONCE_INIT};
-
-        #[allow(missing_copy_implementations)]
-        #[allow(dead_code)]
-        struct CargoAuthors {
-            __private_field: (),
-        };
-
-        impl Deref for CargoAuthors {
-            type Target = str;
-
-            #[allow(unsafe_code)]
-            fn deref(&self) -> &'static str {
-                #[allow(deprecated)]
-                static ONCE: Once = ONCE_INIT;
-                static mut VALUE: *const String = 0 as *const String;
-
-                unsafe {
-                    ONCE.call_once(|| {
-                        let s = env!("CARGO_PKG_AUTHORS").replace(':', $sep);
-                        VALUE = Box::into_raw(Box::new(s));
-                    });
-
-                    &(*VALUE)[..]
-                }
-            }
-        }
-
-        &*CargoAuthors {
-            __private_field: (),
-        }
-    }};
-    () => {
-        env!("CARGO_PKG_AUTHORS")
-    };
-}
-
-/// Allows you to pull the description from your Cargo.toml at compile time.
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let m = App::new("app")
-///             .about(crate_description!())
-///             .get_matches();
-/// # }
-/// ```
-#[cfg(not(feature = "no_cargo"))]
-#[macro_export]
-macro_rules! crate_description {
-    () => {
-        env!("CARGO_PKG_DESCRIPTION")
-    };
-}
-
-/// Allows you to pull the name from your Cargo.toml at compile time.
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # use clap::App;
-/// # fn main() {
-/// let m = App::new(crate_name!())
-///             .get_matches();
-/// # }
-/// ```
-#[cfg(not(feature = "no_cargo"))]
-#[macro_export]
-macro_rules! crate_name {
-    () => {
-        env!("CARGO_PKG_NAME")
-    };
-}
-
-/// Allows you to build the `App` instance from your Cargo.toml at compile time.
-///
-/// Equivalent to using the `crate_*!` macros with their respective fields.
-///
-/// Provided separator is for the [`crate_authors!`](macro.crate_authors.html) macro,
-/// refer to the documentation therefor.
-///
-/// **NOTE:** Changing the values in your `Cargo.toml` does not trigger a re-build automatically,
-/// and therefore won't change the generated output until you recompile.
-///
-/// **Pro Tip:** In some cases you can "trick" the compiler into triggering a rebuild when your
-/// `Cargo.toml` is changed by including this in your `src/main.rs` file
-/// `include_str!("../Cargo.toml");`
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # fn main() {
-/// let m = app_from_crate!().get_matches();
-/// # }
-/// ```
-#[cfg(not(feature = "no_cargo"))]
-#[macro_export]
-macro_rules! app_from_crate {
-    () => {
-        $crate::App::new(crate_name!())
-            .version(crate_version!())
-            .author(crate_authors!())
-            .about(crate_description!())
-    };
-    ($sep:expr) => {
-        $crate::App::new(crate_name!())
-            .version(crate_version!())
-            .author(crate_authors!($sep))
-            .about(crate_description!())
-    };
-}
-
-/// Build `App`, `Arg`s, `SubCommand`s and `Group`s with Usage-string like input
-/// but without the associated parsing runtime cost.
-///
-/// `clap_app!` also supports several shorthand syntaxes.
-///
-/// # Examples
-///
-/// ```no_run
-/// # #[macro_use]
-/// # extern crate clap;
-/// # fn main() {
-/// let matches = clap_app!(myapp =>
-///     (version: "1.0")
-///     (author: "Kevin K. <kbknapp@gmail.com>")
-///     (about: "Does awesome things")
-///     (@arg CONFIG: -c --config +takes_value "Sets a custom config file")
-///     (@arg INPUT: +required "Sets the input file to use")
-///     (@arg debug: -d ... "Sets the level of debugging information")
-///     (@group difficulty =>
-///         (@arg hard: -h --hard "Sets hard mode")
-///         (@arg normal: -n --normal "Sets normal mode")
-///         (@arg easy: -e --easy "Sets easy mode")
-///     )
-///     (@subcommand test =>
-///         (about: "controls testing features")
-///         (version: "1.3")
-///         (author: "Someone E. <someone_else@other.com>")
-///         (@arg verbose: -v --verbose "Print test information verbosely")
-///     )
-/// )
-/// .get_matches();
-/// # }
-/// ```
-/// # Shorthand Syntax for Args
-///
-/// * A single hyphen followed by a character (such as `-c`) sets the [`Arg::short`]
-/// * A double hyphen followed by a character or word (such as `--config`) sets [`Arg::long`]
-///   * If one wishes to use a [`Arg::long`] with a hyphen inside (i.e. `--config-file`), you
-///     must use `--("config-file")` due to limitations of the Rust macro system.
-/// * Three dots (`...`) sets [`Arg::multiple(true)`]
-/// * Angled brackets after either a short or long will set [`Arg::value_name`] and
-/// `Arg::required(true)` such as `--config <FILE>` = `Arg::value_name("FILE")` and
-/// `Arg::required(true)`
-/// * Square brackets after either a short or long will set [`Arg::value_name`] and
-/// `Arg::required(false)` such as `--config [FILE]` = `Arg::value_name("FILE")` and
-/// `Arg::required(false)`
-/// * There are short hand syntaxes for Arg methods that accept booleans
-///   * A plus sign will set that method to `true` such as `+required` = `Arg::required(true)`
-///   * An exclamation will set that method to `false` such as `!required` = `Arg::required(false)`
-/// * A `#{min, max}` will set [`Arg::min_values(min)`] and [`Arg::max_values(max)`]
-/// * An asterisk (`*`) will set `Arg::required(true)`
-/// * Curly brackets around a `fn` will set [`Arg::validator`] as in `{fn}` = `Arg::validator(fn)`
-/// * An Arg method that accepts a string followed by square brackets will set that method such as
-/// `conflicts_with[FOO]` will set `Arg::conflicts_with("FOO")` (note the lack of quotes around
-/// `FOO` in the macro)
-/// * An Arg method that takes a string and can be set multiple times (such as
-/// [`Arg::conflicts_with`]) followed by square brackets and a list of values separated by spaces
-/// will set that method such as `conflicts_with[FOO BAR BAZ]` will set
-/// `Arg::conflicts_with("FOO")`, `Arg::conflicts_with("BAR")`, and `Arg::conflicts_with("BAZ")`
-/// (note the lack of quotes around the values in the macro)
-///
-/// # Shorthand Syntax for Groups
-///
-/// * There are short hand syntaxes for `ArgGroup` methods that accept booleans
-///   * A plus sign will set that method to `true` such as `+required` = `ArgGroup::required(true)`
-///   * An exclamation will set that method to `false` such as `!required` = `ArgGroup::required(false)`
-///
-/// [`Arg::short`]: ./struct.Arg.html#method.short
-/// [`Arg::long`]: ./struct.Arg.html#method.long
-/// [`Arg::multiple(true)`]: ./struct.Arg.html#method.multiple
-/// [`Arg::value_name`]: ./struct.Arg.html#method.value_name
-/// [`Arg::min_values(min)`]: ./struct.Arg.html#method.min_values
-/// [`Arg::max_values(max)`]: ./struct.Arg.html#method.max_values
-/// [`Arg::validator`]: ./struct.Arg.html#method.validator
-/// [`Arg::conflicts_with`]: ./struct.Arg.html#method.conflicts_with
-#[macro_export]
-macro_rules! clap_app {
-    (@app ($builder:expr)) => { $builder };
-    (@app ($builder:expr) (@arg ($name:expr): $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app
-            ($builder.arg(
-                clap_app!{ @arg ($crate::Arg::with_name($name)) (-) $($tail)* }))
-            $($tt)*
-        }
-    };
-    (@app ($builder:expr) (@arg $name:ident: $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app
-            ($builder.arg(
-                clap_app!{ @arg ($crate::Arg::with_name(stringify!($name))) (-) $($tail)* }))
-            $($tt)*
-        }
-    };
-    (@app ($builder:expr) (@setting $setting:ident) $($tt:tt)*) => {
-        clap_app!{ @app
-            ($builder.setting($crate::AppSettings::$setting))
-            $($tt)*
-        }
-    };
-// Treat the application builder as an argument to set its attributes
-    (@app ($builder:expr) (@attributes $($attr:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app (clap_app!{ @arg ($builder) $($attr)* }) $($tt)* }
-    };
-    (@app ($builder:expr) (@group $name:ident => $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app
-            (clap_app!{ @group ($builder, $crate::ArgGroup::with_name(stringify!($name))) $($tail)* })
-            $($tt)*
-        }
-    };
-    (@app ($builder:expr) (@group $name:ident !$ident:ident => $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app
-            (clap_app!{ @group ($builder, $crate::ArgGroup::with_name(stringify!($name)).$ident(false)) $($tail)* })
-            $($tt)*
-        }
-    };
-    (@app ($builder:expr) (@group $name:ident +$ident:ident => $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app
-            (clap_app!{ @group ($builder, $crate::ArgGroup::with_name(stringify!($name)).$ident(true)) $($tail)* })
-            $($tt)*
-        }
-    };
-// Handle subcommand creation
-    (@app ($builder:expr) (@subcommand $name:ident => $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @app
-            ($builder.subcommand(
-                clap_app!{ @app ($crate::SubCommand::with_name(stringify!($name))) $($tail)* }
-            ))
-            $($tt)*
-        }
-    };
-// Yaml like function calls - used for setting various meta directly against the app
-    (@app ($builder:expr) ($ident:ident: $($v:expr),*) $($tt:tt)*) => {
-// clap_app!{ @app ($builder.$ident($($v),*)) $($tt)* }
-        clap_app!{ @app
-            ($builder.$ident($($v),*))
-            $($tt)*
-        }
-    };
-
-// Add members to group and continue argument handling with the parent builder
-    (@group ($builder:expr, $group:expr)) => { $builder.group($group) };
-    // Treat the group builder as an argument to set its attributes
-    (@group ($builder:expr, $group:expr) (@attributes $($attr:tt)*) $($tt:tt)*) => {
-        clap_app!{ @group ($builder, clap_app!{ @arg ($group) (-) $($attr)* }) $($tt)* }
-    };
-    (@group ($builder:expr, $group:expr) (@arg $name:ident: $($tail:tt)*) $($tt:tt)*) => {
-        clap_app!{ @group
-            (clap_app!{ @app ($builder) (@arg $name: $($tail)*) },
-             $group.arg(stringify!($name)))
-            $($tt)*
-        }
-    };
-
-// No more tokens to munch
-    (@arg ($arg:expr) $modes:tt) => { $arg };
-// Shorthand tokens influenced by the usage_string
-    (@arg ($arg:expr) $modes:tt --($long:expr) $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.long($long)) $modes $($tail)* }
-    };
-    (@arg ($arg:expr) $modes:tt --$long:ident $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.long(stringify!($long))) $modes $($tail)* }
-    };
-    (@arg ($arg:expr) $modes:tt -$short:ident $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.short(stringify!($short))) $modes $($tail)* }
-    };
-    (@arg ($arg:expr) (-) <$var:ident> $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.value_name(stringify!($var))) (+) +takes_value +required $($tail)* }
-    };
-    (@arg ($arg:expr) (+) <$var:ident> $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.value_name(stringify!($var))) (+) $($tail)* }
-    };
-    (@arg ($arg:expr) (-) [$var:ident] $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.value_name(stringify!($var))) (+) +takes_value $($tail)* }
-    };
-    (@arg ($arg:expr) (+) [$var:ident] $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.value_name(stringify!($var))) (+) $($tail)* }
-    };
-    (@arg ($arg:expr) $modes:tt ... $($tail:tt)*) => {
-        clap_app!{ @arg ($arg) $modes +multiple $($tail)* }
-    };
-// Shorthand magic
-    (@arg ($arg:expr) $modes:tt #{$n:expr, $m:expr} $($tail:tt)*) => {
-        clap_app!{ @arg ($arg) $modes min_values($n) max_values($m) $($tail)* }
-    };
-    (@arg ($arg:expr) $modes:tt * $($tail:tt)*) => {
-        clap_app!{ @arg ($arg) $modes +required $($tail)* }
-    };
-// !foo -> .foo(false)
-    (@arg ($arg:expr) $modes:tt !$ident:ident $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.$ident(false)) $modes $($tail)* }
-    };
-// +foo -> .foo(true)
-    (@arg ($arg:expr) $modes:tt +$ident:ident $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.$ident(true)) $modes $($tail)* }
-    };
-// Validator
-    (@arg ($arg:expr) $modes:tt {$fn_:expr} $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.validator($fn_)) $modes $($tail)* }
-    };
-    (@as_expr $expr:expr) => { $expr };
-// Help
-    (@arg ($arg:expr) $modes:tt $desc:tt) => { $arg.help(clap_app!{ @as_expr $desc }) };
-// Handle functions that need to be called multiple times for each argument
-    (@arg ($arg:expr) $modes:tt $ident:ident[$($target:ident)*] $($tail:tt)*) => {
-        clap_app!{ @arg ($arg $( .$ident(stringify!($target)) )*) $modes $($tail)* }
-    };
-// Inherit builder's functions, e.g. `index(2)`, `requires_if("val", "arg")`
-    (@arg ($arg:expr) $modes:tt $ident:ident($($expr:expr),*) $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.$ident($($expr),*)) $modes $($tail)* }
-    };
-// Inherit builder's functions with trailing comma, e.g. `index(2,)`, `requires_if("val", "arg",)`
-    (@arg ($arg:expr) $modes:tt $ident:ident($($expr:expr,)*) $($tail:tt)*) => {
-        clap_app!{ @arg ($arg.$ident($($expr),*)) $modes $($tail)* }
-    };
-
-// Build a subcommand outside of an app.
-    (@subcommand $name:ident => $($tail:tt)*) => {
-        clap_app!{ @app ($crate::SubCommand::with_name(stringify!($name))) $($tail)* }
-    };
-// Start the magic
-    (($name:expr) => $($tail:tt)*) => {{
-        clap_app!{ @app ($crate::App::new($name)) $($tail)*}
-    }};
-
-    ($name:ident => $($tail:tt)*) => {{
-        clap_app!{ @app ($crate::App::new(stringify!($name))) $($tail)*}
-    }};
-}
-
-macro_rules! impl_settings {
-    ($n:ident, $($v:ident => $c:path),+) => {
-        pub fn set(&mut self, s: $n) {
-            match s {
-                $($n::$v => self.0.insert($c)),+
-            }
-        }
-
-        pub fn unset(&mut self, s: $n) {
-            match s {
-                $($n::$v => self.0.remove($c)),+
-            }
-        }
-
-        pub fn is_set(&self, s: $n) -> bool {
-            match s {
-                $($n::$v => self.0.contains($c)),+
-            }
-        }
-    };
-}
-
-// Convenience for writing to stderr thanks to https://github.com/BurntSushi
-macro_rules! wlnerr(
-    ($($arg:tt)*) => ({
-        use std::io::{Write, stderr};
-        writeln!(&mut stderr(), $($arg)*).ok();
-    })
-);
-
-#[cfg(feature = "debug")]
-#[cfg_attr(feature = "debug", macro_use)]
-#[cfg_attr(feature = "debug", allow(unused_macros))]
-mod debug_macros {
-    macro_rules! debugln {
-        ($fmt:expr) => (println!(concat!("DEBUG:clap:", $fmt)));
-        ($fmt:expr, $($arg:tt)*) => (println!(concat!("DEBUG:clap:",$fmt), $($arg)*));
-    }
-    macro_rules! sdebugln {
-        ($fmt:expr) => (println!($fmt));
-        ($fmt:expr, $($arg:tt)*) => (println!($fmt, $($arg)*));
-    }
-    macro_rules! debug {
-        ($fmt:expr) => (print!(concat!("DEBUG:clap:", $fmt)));
-        ($fmt:expr, $($arg:tt)*) => (print!(concat!("DEBUG:clap:",$fmt), $($arg)*));
-    }
-    macro_rules! sdebug {
-        ($fmt:expr) => (print!($fmt));
-        ($fmt:expr, $($arg:tt)*) => (print!($fmt, $($arg)*));
-    }
-}
-
-#[cfg(not(feature = "debug"))]
-#[cfg_attr(not(feature = "debug"), macro_use)]
-mod debug_macros {
-    macro_rules! debugln {
-        ($fmt:expr) => {};
-        ($fmt:expr, $($arg:tt)*) => {};
-    }
-    macro_rules! sdebugln {
-        ($fmt:expr) => {};
-        ($fmt:expr, $($arg:tt)*) => {};
-    }
-    macro_rules! debug {
-        ($fmt:expr) => {};
-        ($fmt:expr, $($arg:tt)*) => {};
-    }
-}
-
-// Helper/deduplication macro for printing the correct number of spaces in help messages
-// used in:
-//    src/args/arg_builder/*.rs
-//    src/app/mod.rs
-macro_rules! write_nspaces {
-    ($dst:expr, $num:expr) => {{
-        debugln!("write_spaces!: num={}", $num);
-        for _ in 0..$num {
-            $dst.write_all(b" ")?;
-        }
-    }};
-}
-
-// convenience macro for remove an item from a vec
-//macro_rules! vec_remove_all {
-//    ($vec:expr, $to_rem:expr) => {
-//        debugln!("vec_remove_all! to_rem={:?}", $to_rem);
-//        for i in (0 .. $vec.len()).rev() {
-//            let should_remove = $to_rem.any(|name| name == &$vec[i]);
-//            if should_remove { $vec.swap_remove(i); }
-//        }
-//    };
-//}
-macro_rules! find_from {
-    ($_self:expr, $arg_name:expr, $from:ident, $matcher:expr) => {{
-        let mut ret = None;
-        for k in $matcher.arg_names() {
-            if let Some(f) = find_by_name!($_self, k, flags, iter) {
-                if let Some(ref v) = f.$from() {
-                    if v.contains($arg_name) {
-                        ret = Some(f.to_string());
-                    }
-                }
-            }
-            if let Some(o) = find_by_name!($_self, k, opts, iter) {
-                if let Some(ref v) = o.$from() {
-                    if v.contains(&$arg_name) {
-                        ret = Some(o.to_string());
-                    }
-                }
-            }
-            if let Some(pos) = find_by_name!($_self, k, positionals, values) {
-                if let Some(ref v) = pos.$from() {
-                    if v.contains($arg_name) {
-                        ret = Some(pos.b.name.to_owned());
-                    }
-                }
-            }
-        }
-        ret
-    }};
-}
-
-//macro_rules! find_name_from {
-//    ($_self:expr, $arg_name:expr, $from:ident, $matcher:expr) => {{
-//        let mut ret = None;
-//        for k in $matcher.arg_names() {
-//            if let Some(f) = find_by_name!($_self, k, flags, iter) {
-//                if let Some(ref v) = f.$from() {
-//                    if v.contains($arg_name) {
-//                        ret = Some(f.b.name);
-//                    }
-//                }
-//            }
-//            if let Some(o) = find_by_name!($_self, k, opts, iter) {
-//                if let Some(ref v) = o.$from() {
-//                    if v.contains(&$arg_name) {
-//                        ret = Some(o.b.name);
-//                    }
-//                }
-//            }
-//            if let Some(pos) = find_by_name!($_self, k, positionals, values) {
-//                if let Some(ref v) = pos.$from() {
-//                    if v.contains($arg_name) {
-//                        ret = Some(pos.b.name);
-//                    }
-//                }
-//            }
-//        }
-//        ret
-//    }};
-//}
-
-macro_rules! find_any_by_name {
-    ($p:expr, $name:expr) => {{
-        fn as_trait_obj<'a, 'b, T: AnyArg<'a, 'b>>(x: &T) -> &AnyArg<'a, 'b> {
-            x
-        }
-        find_by_name!($p, $name, flags, iter)
-            .map(as_trait_obj)
-            .or(find_by_name!($p, $name, opts, iter)
-                .map(as_trait_obj)
-                .or(find_by_name!($p, $name, positionals, values).map(as_trait_obj)))
-    }};
-}
-// Finds an arg by name
-macro_rules! find_by_name {
-    ($p:expr, $name:expr, $what:ident, $how:ident) => {
-        $p.$what.$how().find(|o| o.b.name == $name)
-    };
-}
-
-// Finds an option including if it's aliased
-macro_rules! find_opt_by_long {
-    (@os $_self:ident, $long:expr) => {{
-        _find_by_long!($_self, $long, opts)
-    }};
-    ($_self:ident, $long:expr) => {{
-        _find_by_long!($_self, $long, opts)
-    }};
-}
-
-macro_rules! find_flag_by_long {
-    (@os $_self:ident, $long:expr) => {{
-        _find_by_long!($_self, $long, flags)
-    }};
-    ($_self:ident, $long:expr) => {{
-        _find_by_long!($_self, $long, flags)
-    }};
-}
-
-macro_rules! _find_by_long {
-    ($_self:ident, $long:expr, $what:ident) => {{
-        $_self
-            .$what
-            .iter()
-            .filter(|a| a.s.long.is_some())
-            .find(|a| {
-                a.s.long.unwrap() == $long
-                    || (a.s.aliases.is_some()
-                        && a.s
-                            .aliases
-                            .as_ref()
-                            .unwrap()
-                            .iter()
-                            .any(|&(alias, _)| alias == $long))
-            })
-    }};
-}
-
-// Finds an option
-macro_rules! find_opt_by_short {
-    ($_self:ident, $short:expr) => {{
-        _find_by_short!($_self, $short, opts)
-    }};
-}
-
-macro_rules! find_flag_by_short {
-    ($_self:ident, $short:expr) => {{
-        _find_by_short!($_self, $short, flags)
-    }};
-}
-
-macro_rules! _find_by_short {
-    ($_self:ident, $short:expr, $what:ident) => {{
-        $_self
-            .$what
-            .iter()
-            .filter(|a| a.s.short.is_some())
-            .find(|a| a.s.short.unwrap() == $short)
-    }};
-}
-
-macro_rules! find_subcmd {
-    ($_self:expr, $sc:expr) => {{
-        $_self.subcommands.iter().find(|s| {
-            &*s.p.meta.name == $sc
-                || (s.p.meta.aliases.is_some()
-                    && s.p
-                        .meta
-                        .aliases
-                        .as_ref()
-                        .unwrap()
-                        .iter()
-                        .any(|&(n, _)| n == $sc))
-        })
-    }};
-}
-
-macro_rules! shorts {
-    ($_self:ident) => {{
-        _shorts_longs!($_self, short)
-    }};
-}
-
-macro_rules! longs {
-    ($_self:ident) => {{
-        _shorts_longs!($_self, long)
-    }};
-}
-
-macro_rules! _shorts_longs {
-    ($_self:ident, $what:ident) => {{
-        $_self
-            .flags
-            .iter()
-            .filter(|f| f.s.$what.is_some())
-            .map(|f| f.s.$what.as_ref().unwrap())
-            .chain(
-                $_self
-                    .opts
-                    .iter()
-                    .filter(|o| o.s.$what.is_some())
-                    .map(|o| o.s.$what.as_ref().unwrap()),
-            )
-    }};
-}
-
-macro_rules! arg_names {
-    ($_self:ident) => {{
-        _names!(@args $_self)
-    }};
-}
-
-macro_rules! sc_names {
-    ($_self:ident) => {{
-        _names!(@sc $_self)
-    }};
-}
-
-macro_rules! _names {
-    (@args $_self:ident) => {{
-        $_self.flags.iter().map(|f| &*f.b.name).chain(
-            $_self
-                .opts
-                .iter()
-                .map(|o| &*o.b.name)
-                .chain($_self.positionals.values().map(|p| &*p.b.name)),
-        )
-    }};
-    (@sc $_self:ident) => {{
-        $_self.subcommands.iter().map(|s| &*s.p.meta.name).chain(
-            $_self
-                .subcommands
-                .iter()
-                .filter(|s| s.p.meta.aliases.is_some())
-                .flat_map(|s| s.p.meta.aliases.as_ref().unwrap().iter().map(|&(n, _)| n)),
-        )
-    }};
-}
diff --git a/third_party/rust/clap/v2/crate/src/map.rs b/third_party/rust/clap/v2/crate/src/map.rs
deleted file mode 100644
index 13497834..0000000
--- a/third_party/rust/clap/v2/crate/src/map.rs
+++ /dev/null
@@ -1,88 +0,0 @@
-#[cfg(feature = "vec_map")]
-pub use vec_map::{Values, VecMap};
-
-#[cfg(not(feature = "vec_map"))]
-pub use self::vec_map::{Values, VecMap};
-
-#[cfg(not(feature = "vec_map"))]
-mod vec_map {
-    use std::collections::btree_map;
-    use std::collections::BTreeMap;
-    use std::fmt::{self, Debug, Formatter};
-
-    #[derive(Clone, Default, Debug)]
-    pub struct VecMap<V> {
-        inner: BTreeMap<usize, V>,
-    }
-
-    impl<V> VecMap<V> {
-        pub fn new() -> Self {
-            VecMap {
-                inner: Default::default(),
-            }
-        }
-
-        pub fn len(&self) -> usize {
-            self.inner.len()
-        }
-
-        pub fn is_empty(&self) -> bool {
-            self.inner.is_empty()
-        }
-
-        pub fn insert(&mut self, key: usize, value: V) -> Option<V> {
-            self.inner.insert(key, value)
-        }
-
-        pub fn values(&self) -> Values<V> {
-            self.inner.values()
-        }
-
-        pub fn iter(&self) -> Iter<V> {
-            Iter {
-                inner: self.inner.iter(),
-            }
-        }
-
-        pub fn contains_key(&self, key: usize) -> bool {
-            self.inner.contains_key(&key)
-        }
-
-        pub fn entry(&mut self, key: usize) -> Entry<V> {
-            self.inner.entry(key)
-        }
-
-        pub fn get(&self, key: usize) -> Option<&V> {
-            self.inner.get(&key)
-        }
-    }
-
-    pub type Values<'a, V> = btree_map::Values<'a, usize, V>;
-
-    pub type Entry<'a, V> = btree_map::Entry<'a, usize, V>;
-
-    #[derive(Clone)]
-    pub struct Iter<'a, V: 'a> {
-        inner: btree_map::Iter<'a, usize, V>,
-    }
-
-    impl<'a, V: 'a + Debug> Debug for Iter<'a, V> {
-        fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-            f.debug_list().entries(self.inner.clone()).finish()
-        }
-    }
-
-    impl<'a, V: 'a> Iterator for Iter<'a, V> {
-        type Item = (usize, &'a V);
-
-        fn next(&mut self) -> Option<Self::Item> {
-            self.inner.next().map(|(k, v)| (*k, v))
-        }
-    }
-
-    impl<'a, V: 'a> DoubleEndedIterator for Iter<'a, V> {
-        fn next_back(&mut self) -> Option<Self::Item> {
-            self.inner.next_back().map(|(k, v)| (*k, v))
-        }
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/osstringext.rs b/third_party/rust/clap/v2/crate/src/osstringext.rs
deleted file mode 100644
index ee0de302..0000000
--- a/third_party/rust/clap/v2/crate/src/osstringext.rs
+++ /dev/null
@@ -1,200 +0,0 @@
-use std::ffi::OsStr;
-#[cfg(not(any(target_os = "windows", target_arch = "wasm32")))]
-use std::os::unix::ffi::OsStrExt;
-#[cfg(any(target_os = "windows", target_arch = "wasm32"))]
-use INVALID_UTF8;
-
-#[cfg(any(target_os = "windows", target_arch = "wasm32"))]
-pub trait OsStrExt3 {
-    fn from_bytes(b: &[u8]) -> &Self;
-    fn as_bytes(&self) -> &[u8];
-}
-
-#[doc(hidden)]
-pub trait OsStrExt2 {
-    fn starts_with(&self, s: &[u8]) -> bool;
-    fn split_at_byte(&self, b: u8) -> (&OsStr, &OsStr);
-    fn split_at(&self, i: usize) -> (&OsStr, &OsStr);
-    fn trim_left_matches(&self, b: u8) -> &OsStr;
-    fn contains_byte(&self, b: u8) -> bool;
-    fn split(&self, b: u8) -> OsSplit;
-}
-
-// A starts-with implementation that does not panic when the OsStr contains
-// invalid Unicode.
-//
-// A Windows OsStr is usually UTF-16. If `prefix` is valid UTF-8, we can
-// re-encode it as UTF-16, and ask whether `osstr` starts with the same series
-// of u16 code units. If `prefix` is not valid UTF-8, then this comparison
-// isn't meaningful, and we just return false.
-#[cfg(target_os = "windows")]
-fn windows_osstr_starts_with(osstr: &OsStr, prefix: &[u8]) -> bool {
-    use std::os::windows::ffi::OsStrExt;
-    let prefix_str = if let Ok(s) = std::str::from_utf8(prefix) {
-        s
-    } else {
-        return false;
-    };
-    let mut osstr_units = osstr.encode_wide();
-    let mut prefix_units = prefix_str.encode_utf16();
-    loop {
-        match (osstr_units.next(), prefix_units.next()) {
-            // These code units match. Keep looping.
-            (Some(o), Some(p)) if o == p => continue,
-            // We've reached the end of the prefix. It's a match.
-            (_, None) => return true,
-            // Otherwise, it's not a match.
-            _ => return false,
-        }
-    }
-}
-
-#[test]
-#[cfg(target_os = "windows")]
-fn test_windows_osstr_starts_with() {
-    use std::ffi::OsString;
-    use std::os::windows::ffi::OsStringExt;
-
-    fn from_ascii(ascii: &[u8]) -> OsString {
-        let u16_vec: Vec<u16> = ascii.iter().map(|&c| c as u16).collect();
-        OsString::from_wide(&u16_vec)
-    }
-
-    // Test all the basic cases.
-    assert!(windows_osstr_starts_with(&from_ascii(b"abcdef"), b"abc"));
-    assert!(windows_osstr_starts_with(&from_ascii(b"abcdef"), b"abcdef"));
-    assert!(!windows_osstr_starts_with(&from_ascii(b"abcdef"), b"def"));
-    assert!(!windows_osstr_starts_with(&from_ascii(b"abc"), b"abcd"));
-
-    // Test the case where the candidate prefix is not valid UTF-8. Note that a
-    // standalone \xff byte is valid ASCII but not valid UTF-8. Thus although
-    // these strings look identical, they do not match.
-    assert!(!windows_osstr_starts_with(&from_ascii(b"\xff"), b"\xff"));
-
-    // Test the case where the OsString is not valid UTF-16. It should still be
-    // possible to match the valid characters at the front.
-    //
-    // UTF-16 surrogate characters are only valid in pairs. Including one on
-    // the end by itself makes this invalid UTF-16.
-    let surrogate_char: u16 = 0xDC00;
-    let mut invalid_unicode =
-        OsString::from_wide(&['a' as u16, 'b' as u16, 'c' as u16, surrogate_char]);
-    assert!(
-        invalid_unicode.to_str().is_none(),
-        "This string is invalid Unicode, and conversion to &str should fail.",
-    );
-    assert!(windows_osstr_starts_with(&invalid_unicode, b"abc"));
-    assert!(!windows_osstr_starts_with(&invalid_unicode, b"abcd"));
-}
-
-#[cfg(any(target_os = "windows", target_arch = "wasm32"))]
-impl OsStrExt3 for OsStr {
-    fn from_bytes(b: &[u8]) -> &Self {
-        use std::mem;
-        unsafe { mem::transmute(b) }
-    }
-    fn as_bytes(&self) -> &[u8] {
-        self.to_str().map(|s| s.as_bytes()).expect(INVALID_UTF8)
-    }
-}
-
-impl OsStrExt2 for OsStr {
-    fn starts_with(&self, s: &[u8]) -> bool {
-        #[cfg(target_os = "windows")]
-        {
-            // On Windows, the as_bytes() method will panic if the OsStr
-            // contains invalid Unicode. To avoid this, we use a
-            // Windows-specific starts-with function that doesn't rely on
-            // as_bytes(). This is necessary for Windows command line
-            // applications to handle non-Unicode arguments successfully. This
-            // allows common cases like `clap.exe [invalid]` to succeed, though
-            // cases that require string splitting will still fail, like
-            // `clap.exe --arg=[invalid]`. Note that this entire module is
-            // replaced in Clap 3.x, so this workaround is specific to the 2.x
-            // branch.
-            return windows_osstr_starts_with(self, s);
-        }
-        self.as_bytes().starts_with(s)
-    }
-
-    fn contains_byte(&self, byte: u8) -> bool {
-        for b in self.as_bytes() {
-            if b == &byte {
-                return true;
-            }
-        }
-        false
-    }
-
-    fn split_at_byte(&self, byte: u8) -> (&OsStr, &OsStr) {
-        for (i, b) in self.as_bytes().iter().enumerate() {
-            if b == &byte {
-                return (
-                    OsStr::from_bytes(&self.as_bytes()[..i]),
-                    OsStr::from_bytes(&self.as_bytes()[i + 1..]),
-                );
-            }
-        }
-        (
-            &*self,
-            OsStr::from_bytes(&self.as_bytes()[self.len()..self.len()]),
-        )
-    }
-
-    fn trim_left_matches(&self, byte: u8) -> &OsStr {
-        let mut found = false;
-        for (i, b) in self.as_bytes().iter().enumerate() {
-            if b != &byte {
-                return OsStr::from_bytes(&self.as_bytes()[i..]);
-            } else {
-                found = true;
-            }
-        }
-        if found {
-            return OsStr::from_bytes(&self.as_bytes()[self.len()..]);
-        }
-        &*self
-    }
-
-    fn split_at(&self, i: usize) -> (&OsStr, &OsStr) {
-        (
-            OsStr::from_bytes(&self.as_bytes()[..i]),
-            OsStr::from_bytes(&self.as_bytes()[i..]),
-        )
-    }
-
-    fn split(&self, b: u8) -> OsSplit {
-        OsSplit {
-            sep: b,
-            val: self.as_bytes(),
-            pos: 0,
-        }
-    }
-}
-
-#[doc(hidden)]
-#[derive(Clone, Debug)]
-pub struct OsSplit<'a> {
-    sep: u8,
-    val: &'a [u8],
-    pos: usize,
-}
-
-impl<'a> Iterator for OsSplit<'a> {
-    type Item = &'a OsStr;
-
-    fn next(&mut self) -> Option<&'a OsStr> {
-        debugln!("OsSplit::next: self={:?}", self);
-        if self.pos == self.val.len() {
-            return None;
-        }
-        let start = self.pos;
-        for b in &self.val[start..] {
-            self.pos += 1;
-            if *b == self.sep {
-                return Some(OsStr::from_bytes(&self.val[start..self.pos - 1]));
-            }
-        }
-        Some(OsStr::from_bytes(&self.val[start..]))
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/strext.rs b/third_party/rust/clap/v2/crate/src/strext.rs
deleted file mode 100644
index 6f81367..0000000
--- a/third_party/rust/clap/v2/crate/src/strext.rs
+++ /dev/null
@@ -1,16 +0,0 @@
-pub trait _StrExt {
-    fn _is_char_boundary(&self, index: usize) -> bool;
-}
-
-impl _StrExt for str {
-    #[inline]
-    fn _is_char_boundary(&self, index: usize) -> bool {
-        if index == self.len() {
-            return true;
-        }
-        match self.as_bytes().get(index) {
-            None => false,
-            Some(&b) => b < 128 || b >= 192,
-        }
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/suggestions.rs b/third_party/rust/clap/v2/crate/src/suggestions.rs
deleted file mode 100644
index 1157b26..0000000
--- a/third_party/rust/clap/v2/crate/src/suggestions.rs
+++ /dev/null
@@ -1,147 +0,0 @@
-use app::App;
-// Third Party
-#[cfg(feature = "suggestions")]
-use strsim;
-
-// Internal
-use fmt::Format;
-
-/// Produces a string from a given list of possible values which is similar to
-/// the passed in value `v` with a certain confidence.
-/// Thus in a list of possible values like ["foo", "bar"], the value "fop" will yield
-/// `Some("foo")`, whereas "blark" would yield `None`.
-#[cfg(feature = "suggestions")]
-#[cfg_attr(feature = "lints", allow(needless_lifetimes))]
-pub fn did_you_mean<'a, T: ?Sized, I>(v: &str, possible_values: I) -> Option<&'a str>
-where
-    T: AsRef<str> + 'a,
-    I: IntoIterator<Item = &'a T>,
-{
-    let mut candidate: Option<(f64, &str)> = None;
-    for pv in possible_values {
-        let confidence = strsim::jaro_winkler(v, pv.as_ref());
-        if confidence > 0.8 && (candidate.is_none() || (candidate.as_ref().unwrap().0 < confidence))
-        {
-            candidate = Some((confidence, pv.as_ref()));
-        }
-    }
-    match candidate {
-        None => None,
-        Some((_, candidate)) => Some(candidate),
-    }
-}
-
-#[cfg(not(feature = "suggestions"))]
-pub fn did_you_mean<'a, T: ?Sized, I>(_: &str, _: I) -> Option<&'a str>
-where
-    T: AsRef<str> + 'a,
-    I: IntoIterator<Item = &'a T>,
-{
-    None
-}
-
-/// Returns a suffix that can be empty, or is the standard 'did you mean' phrase
-#[cfg_attr(feature = "lints", allow(needless_lifetimes))]
-pub fn did_you_mean_flag_suffix<'z, T, I>(
-    arg: &str,
-    args_rest: &'z [&str],
-    longs: I,
-    subcommands: &'z [App],
-) -> (String, Option<&'z str>)
-where
-    T: AsRef<str> + 'z,
-    I: IntoIterator<Item = &'z T>,
-{
-    if let Some(candidate) = did_you_mean(arg, longs) {
-        let suffix = format!(
-            "\n\tDid you mean {}{}?",
-            Format::Good("--"),
-            Format::Good(candidate)
-        );
-        return (suffix, Some(candidate));
-    }
-
-    subcommands
-        .into_iter()
-        .filter_map(|subcommand| {
-            let opts = subcommand
-                .p
-                .flags
-                .iter()
-                .filter_map(|f| f.s.long)
-                .chain(subcommand.p.opts.iter().filter_map(|o| o.s.long));
-
-            let candidate = match did_you_mean(arg, opts) {
-                Some(candidate) => candidate,
-                None => return None,
-            };
-            let score = match args_rest.iter().position(|x| *x == subcommand.get_name()) {
-                Some(score) => score,
-                None => return None,
-            };
-
-            let suffix = format!(
-                "\n\tDid you mean to put '{}{}' after the subcommand '{}'?",
-                Format::Good("--"),
-                Format::Good(candidate),
-                Format::Good(subcommand.get_name())
-            );
-
-            Some((score, (suffix, Some(candidate))))
-        })
-        .min_by_key(|&(score, _)| score)
-        .map(|(_, suggestion)| suggestion)
-        .unwrap_or_else(|| (String::new(), None))
-}
-
-/// Returns a suffix that can be empty, or is the standard 'did you mean' phrase
-pub fn did_you_mean_value_suffix<'z, T, I>(arg: &str, values: I) -> (String, Option<&'z str>)
-where
-    T: AsRef<str> + 'z,
-    I: IntoIterator<Item = &'z T>,
-{
-    match did_you_mean(arg, values) {
-        Some(candidate) => {
-            let suffix = format!("\n\tDid you mean '{}'?", Format::Good(candidate));
-            (suffix, Some(candidate))
-        }
-        None => (String::new(), None),
-    }
-}
-
-#[cfg(all(test, features = "suggestions"))]
-mod test {
-    use super::*;
-
-    #[test]
-    fn possible_values_match() {
-        let p_vals = ["test", "possible", "values"];
-        assert_eq!(did_you_mean("tst", p_vals.iter()), Some("test"));
-    }
-
-    #[test]
-    fn possible_values_nomatch() {
-        let p_vals = ["test", "possible", "values"];
-        assert!(did_you_mean("hahaahahah", p_vals.iter()).is_none());
-    }
-
-    #[test]
-    fn suffix_long() {
-        let p_vals = ["test", "possible", "values"];
-        let suffix = "\n\tDid you mean \'--test\'?";
-        assert_eq!(
-            did_you_mean_flag_suffix("tst", p_vals.iter(), []),
-            (suffix, Some("test"))
-        );
-    }
-
-    #[test]
-    fn suffix_enum() {
-        let p_vals = ["test", "possible", "values"];
-        let suffix = "\n\tDid you mean \'test\'?";
-        assert_eq!(
-            did_you_mean_value_suffix("tst", p_vals.iter()),
-            (suffix, Some("test"))
-        );
-    }
-}
diff --git a/third_party/rust/clap/v2/crate/src/usage_parser.rs b/third_party/rust/clap/v2/crate/src/usage_parser.rs
deleted file mode 100644
index 0a383eb..0000000
--- a/third_party/rust/clap/v2/crate/src/usage_parser.rs
+++ /dev/null
@@ -1,1358 +0,0 @@
-// Internal
-use args::settings::ArgSettings;
-use args::Arg;
-use map::VecMap;
-use INTERNAL_ERROR_MSG;
-
-#[derive(PartialEq, Debug)]
-enum UsageToken {
-    Name,
-    ValName,
-    Short,
-    Long,
-    Help,
-    Multiple,
-    Unknown,
-}
-
-#[doc(hidden)]
-#[derive(Debug)]
-pub struct UsageParser<'a> {
-    usage: &'a str,
-    pos: usize,
-    start: usize,
-    prev: UsageToken,
-    explicit_name_set: bool,
-}
-
-impl<'a> UsageParser<'a> {
-    fn new(usage: &'a str) -> Self {
-        debugln!("UsageParser::new: usage={:?}", usage);
-        UsageParser {
-            usage: usage,
-            pos: 0,
-            start: 0,
-            prev: UsageToken::Unknown,
-            explicit_name_set: false,
-        }
-    }
-
-    pub fn from_usage(usage: &'a str) -> Self {
-        debugln!("UsageParser::from_usage;");
-        UsageParser::new(usage)
-    }
-
-    pub fn parse(mut self) -> Arg<'a, 'a> {
-        debugln!("UsageParser::parse;");
-        let mut arg = Arg::default();
-        loop {
-            debugln!("UsageParser::parse:iter: pos={};", self.pos);
-            self.stop_at(token);
-            if let Some(&c) = self.usage.as_bytes().get(self.pos) {
-                match c {
-                    b'-' => self.short_or_long(&mut arg),
-                    b'.' => self.multiple(&mut arg),
-                    b'\'' => self.help(&mut arg),
-                    _ => self.name(&mut arg),
-                }
-            } else {
-                break;
-            }
-        }
-        debug_assert!(
-            !arg.b.name.is_empty(),
-            format!(
-                "No name found for Arg when parsing usage string: {}",
-                self.usage
-            )
-        );
-        arg.v.num_vals = match arg.v.val_names {
-            Some(ref v) if v.len() >= 2 => Some(v.len() as u64),
-            _ => None,
-        };
-        debugln!("UsageParser::parse: vals...{:?}", arg.v.val_names);
-        arg
-    }
-
-    fn name(&mut self, arg: &mut Arg<'a, 'a>) {
-        debugln!("UsageParser::name;");
-        if *self
-            .usage
-            .as_bytes()
-            .get(self.pos)
-            .expect(INTERNAL_ERROR_MSG)
-            == b'<'
-            && !self.explicit_name_set
-        {
-            arg.setb(ArgSettings::Required);
-        }
-        self.pos += 1;
-        self.stop_at(name_end);
-        let name = &self.usage[self.start..self.pos];
-        if self.prev == UsageToken::Unknown {
-            debugln!("UsageParser::name: setting name...{}", name);
-            arg.b.name = name;
-            if arg.s.long.is_none() && arg.s.short.is_none() {
-                debugln!("UsageParser::name: explicit name set...");
-                self.explicit_name_set = true;
-                self.prev = UsageToken::Name;
-            }
-        } else {
-            debugln!("UsageParser::name: setting val name...{}", name);
-            if let Some(ref mut v) = arg.v.val_names {
-                let len = v.len();
-                v.insert(len, name);
-            } else {
-                let mut v = VecMap::new();
-                v.insert(0, name);
-                arg.v.val_names = Some(v);
-                arg.setb(ArgSettings::TakesValue);
-            }
-            self.prev = UsageToken::ValName;
-        }
-    }
-
-    fn stop_at<F>(&mut self, f: F)
-    where
-        F: Fn(u8) -> bool,
-    {
-        debugln!("UsageParser::stop_at;");
-        self.start = self.pos;
-        self.pos += self.usage[self.start..]
-            .bytes()
-            .take_while(|&b| f(b))
-            .count();
-    }
-
-    fn short_or_long(&mut self, arg: &mut Arg<'a, 'a>) {
-        debugln!("UsageParser::short_or_long;");
-        self.pos += 1;
-        if *self
-            .usage
-            .as_bytes()
-            .get(self.pos)
-            .expect(INTERNAL_ERROR_MSG)
-            == b'-'
-        {
-            self.pos += 1;
-            self.long(arg);
-            return;
-        }
-        self.short(arg)
-    }
-
-    fn long(&mut self, arg: &mut Arg<'a, 'a>) {
-        debugln!("UsageParser::long;");
-        self.stop_at(long_end);
-        let name = &self.usage[self.start..self.pos];
-        if !self.explicit_name_set {
-            debugln!("UsageParser::long: setting name...{}", name);
-            arg.b.name = name;
-        }
-        debugln!("UsageParser::long: setting long...{}", name);
-        arg.s.long = Some(name);
-        self.prev = UsageToken::Long;
-    }
-
-    fn short(&mut self, arg: &mut Arg<'a, 'a>) {
-        debugln!("UsageParser::short;");
-        let start = &self.usage[self.pos..];
-        let short = start.chars().nth(0).expect(INTERNAL_ERROR_MSG);
-        debugln!("UsageParser::short: setting short...{}", short);
-        arg.s.short = Some(short);
-        if arg.b.name.is_empty() {
-            // --long takes precedence but doesn't set self.explicit_name_set
-            let name = &start[..short.len_utf8()];
-            debugln!("UsageParser::short: setting name...{}", name);
-            arg.b.name = name;
-        }
-        self.prev = UsageToken::Short;
-    }
-
-    // "something..."
-    fn multiple(&mut self, arg: &mut Arg) {
-        debugln!("UsageParser::multiple;");
-        let mut dot_counter = 1;
-        let start = self.pos;
-        let mut bytes = self.usage[start..].bytes();
-        while bytes.next() == Some(b'.') {
-            dot_counter += 1;
-            self.pos += 1;
-            if dot_counter == 3 {
-                debugln!("UsageParser::multiple: setting multiple");
-                arg.setb(ArgSettings::Multiple);
-                if arg.is_set(ArgSettings::TakesValue) {
-                    arg.setb(ArgSettings::UseValueDelimiter);
-                    arg.unsetb(ArgSettings::ValueDelimiterNotSet);
-                    if arg.v.val_delim.is_none() {
-                        arg.v.val_delim = Some(',');
-                    }
-                }
-                self.prev = UsageToken::Multiple;
-                self.pos += 1;
-                break;
-            }
-        }
-    }
-
-    fn help(&mut self, arg: &mut Arg<'a, 'a>) {
-        debugln!("UsageParser::help;");
-        self.stop_at(help_start);
-        self.start = self.pos + 1;
-        self.pos = self.usage.len() - 1;
-        debugln!(
-            "UsageParser::help: setting help...{}",
-            &self.usage[self.start..self.pos]
-        );
-        arg.b.help = Some(&self.usage[self.start..self.pos]);
-        self.pos += 1; // Move to next byte to keep from thinking ending ' is a start
-        self.prev = UsageToken::Help;
-    }
-}
-
-#[inline]
-fn name_end(b: u8) -> bool {
-    b != b']' && b != b'>'
-}
-
-#[inline]
-fn token(b: u8) -> bool {
-    b != b'\'' && b != b'.' && b != b'<' && b != b'[' && b != b'-'
-}
-
-#[inline]
-fn long_end(b: u8) -> bool {
-    b != b'\'' && b != b'.' && b != b'<' && b != b'[' && b != b'=' && b != b' '
-}
-
-#[inline]
-fn help_start(b: u8) -> bool {
-    b != b'\''
-}
-
-#[cfg(test)]
-mod test {
-    use args::Arg;
-    use args::ArgSettings;
-
-    #[test]
-    fn create_flag_usage() {
-        let a = Arg::from_usage("[flag] -f 'some help info'");
-        assert_eq!(a.b.name, "flag");
-        assert_eq!(a.s.short.unwrap(), 'f');
-        assert!(a.s.long.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.v.val_names.is_none());
-        assert!(a.v.num_vals.is_none());
-
-        let b = Arg::from_usage("[flag] --flag 'some help info'");
-        assert_eq!(b.b.name, "flag");
-        assert_eq!(b.s.long.unwrap(), "flag");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(a.v.val_names.is_none());
-        assert!(a.v.num_vals.is_none());
-
-        let b = Arg::from_usage("--flag 'some help info'");
-        assert_eq!(b.b.name, "flag");
-        assert_eq!(b.s.long.unwrap(), "flag");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.v.val_names.is_none());
-        assert!(b.v.num_vals.is_none());
-
-        let c = Arg::from_usage("[flag] -f --flag 'some help info'");
-        assert_eq!(c.b.name, "flag");
-        assert_eq!(c.s.short.unwrap(), 'f');
-        assert_eq!(c.s.long.unwrap(), "flag");
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-
-        let d = Arg::from_usage("[flag] -f... 'some help info'");
-        assert_eq!(d.b.name, "flag");
-        assert_eq!(d.s.short.unwrap(), 'f');
-        assert!(d.s.long.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.v.val_names.is_none());
-        assert!(d.v.num_vals.is_none());
-
-        let e = Arg::from_usage("[flag] -f --flag... 'some help info'");
-        assert_eq!(e.b.name, "flag");
-        assert_eq!(e.s.long.unwrap(), "flag");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert_eq!(e.b.help.unwrap(), "some help info");
-        assert!(e.is_set(ArgSettings::Multiple));
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("-f --flag... 'some help info'");
-        assert_eq!(e.b.name, "flag");
-        assert_eq!(e.s.long.unwrap(), "flag");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert_eq!(e.b.help.unwrap(), "some help info");
-        assert!(e.is_set(ArgSettings::Multiple));
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("--flags");
-        assert_eq!(e.b.name, "flags");
-        assert_eq!(e.s.long.unwrap(), "flags");
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("--flags...");
-        assert_eq!(e.b.name, "flags");
-        assert_eq!(e.s.long.unwrap(), "flags");
-        assert!(e.is_set(ArgSettings::Multiple));
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("[flags] -f");
-        assert_eq!(e.b.name, "flags");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("[flags] -f...");
-        assert_eq!(e.b.name, "flags");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert!(e.is_set(ArgSettings::Multiple));
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let a = Arg::from_usage("-f 'some help info'");
-        assert_eq!(a.b.name, "f");
-        assert_eq!(a.s.short.unwrap(), 'f');
-        assert!(a.s.long.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.v.val_names.is_none());
-        assert!(a.v.num_vals.is_none());
-
-        let e = Arg::from_usage("-f");
-        assert_eq!(e.b.name, "f");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-
-        let e = Arg::from_usage("-f...");
-        assert_eq!(e.b.name, "f");
-        assert_eq!(e.s.short.unwrap(), 'f');
-        assert!(e.is_set(ArgSettings::Multiple));
-        assert!(e.v.val_names.is_none());
-        assert!(e.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage0() {
-        // Short only
-        let a = Arg::from_usage("[option] -o [opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert!(a.s.long.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage1() {
-        let b = Arg::from_usage("-o [opt] 'some help info'");
-        assert_eq!(b.b.name, "o");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert!(b.s.long.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(
-            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage2() {
-        let c = Arg::from_usage("<option> -o <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert!(c.s.long.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage3() {
-        let d = Arg::from_usage("-o <opt> 'some help info'");
-        assert_eq!(d.b.name, "o");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert!(d.s.long.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage4() {
-        let a = Arg::from_usage("[option] -o [opt]... 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert!(a.s.long.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage5() {
-        let a = Arg::from_usage("[option]... -o [opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert!(a.s.long.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage6() {
-        let b = Arg::from_usage("-o [opt]... 'some help info'");
-        assert_eq!(b.b.name, "o");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert!(b.s.long.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(
-            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage7() {
-        let c = Arg::from_usage("<option> -o <opt>... 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert!(c.s.long.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage8() {
-        let c = Arg::from_usage("<option>... -o <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert!(c.s.long.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage9() {
-        let d = Arg::from_usage("-o <opt>... 'some help info'");
-        assert_eq!(d.b.name, "o");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert!(d.s.long.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long1() {
-        let a = Arg::from_usage("[option] --opt [opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long2() {
-        let b = Arg::from_usage("--opt [option] 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(
-            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long3() {
-        let c = Arg::from_usage("<option> --opt <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long4() {
-        let d = Arg::from_usage("--opt <option> 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long5() {
-        let a = Arg::from_usage("[option] --opt [opt]... 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long6() {
-        let a = Arg::from_usage("[option]... --opt [opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long7() {
-        let b = Arg::from_usage("--opt [option]... 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(
-            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long8() {
-        let c = Arg::from_usage("<option> --opt <opt>... 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long9() {
-        let c = Arg::from_usage("<option>... --opt <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long10() {
-        let d = Arg::from_usage("--opt <option>... 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals1() {
-        let a = Arg::from_usage("[option] --opt=[opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals2() {
-        let b = Arg::from_usage("--opt=[option] 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(
-            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals3() {
-        let c = Arg::from_usage("<option> --opt=<opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals4() {
-        let d = Arg::from_usage("--opt=<option> 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals5() {
-        let a = Arg::from_usage("[option] --opt=[opt]... 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals6() {
-        let a = Arg::from_usage("[option]... --opt=[opt] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert!(a.s.short.is_none());
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals7() {
-        let b = Arg::from_usage("--opt=[option]... 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert!(b.s.short.is_none());
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(
-            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals8() {
-        let c = Arg::from_usage("<option> --opt=<opt>... 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals9() {
-        let c = Arg::from_usage("<option>... --opt=<opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert!(c.s.short.is_none());
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_long_equals10() {
-        let d = Arg::from_usage("--opt=<option>... 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both1() {
-        let a = Arg::from_usage("[option] -o --opt [option] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both2() {
-        let b = Arg::from_usage("-o --opt [option] 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(
-            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both3() {
-        let c = Arg::from_usage("<option> -o --opt <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both4() {
-        let d = Arg::from_usage("-o --opt <option> 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both5() {
-        let a = Arg::from_usage("[option]... -o --opt [option] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both6() {
-        let b = Arg::from_usage("-o --opt [option]... 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(
-            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both7() {
-        let c = Arg::from_usage("<option>... -o --opt <opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both8() {
-        let d = Arg::from_usage("-o --opt <option>... 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals1() {
-        let a = Arg::from_usage("[option] -o --opt=[option] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals2() {
-        let b = Arg::from_usage("-o --opt=[option] 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(
-            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals3() {
-        let c = Arg::from_usage("<option> -o --opt=<opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(!c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals4() {
-        let d = Arg::from_usage("-o --opt=<option> 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals5() {
-        let a = Arg::from_usage("[option]... -o --opt=[option] 'some help info'");
-        assert_eq!(a.b.name, "option");
-        assert_eq!(a.s.long.unwrap(), "opt");
-        assert_eq!(a.s.short.unwrap(), 'o');
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(a.is_set(ArgSettings::Multiple));
-        assert!(a.is_set(ArgSettings::TakesValue));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals6() {
-        let b = Arg::from_usage("-o --opt=[option]... 'some help info'");
-        assert_eq!(b.b.name, "opt");
-        assert_eq!(b.s.long.unwrap(), "opt");
-        assert_eq!(b.s.short.unwrap(), 'o');
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::TakesValue));
-        assert!(!b.is_set(ArgSettings::Required));
-        assert_eq!(
-            b.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals7() {
-        let c = Arg::from_usage("<option>... -o --opt=<opt> 'some help info'");
-        assert_eq!(c.b.name, "option");
-        assert_eq!(c.s.long.unwrap(), "opt");
-        assert_eq!(c.s.short.unwrap(), 'o');
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(c.is_set(ArgSettings::TakesValue));
-        assert!(c.is_set(ArgSettings::Required));
-        assert_eq!(
-            c.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"opt"]
-        );
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_usage_both_equals8() {
-        let d = Arg::from_usage("-o --opt=<option>... 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"option"]
-        );
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_option_with_vals1() {
-        let d = Arg::from_usage("-o <file> <mode> 'some help info'");
-        assert_eq!(d.b.name, "o");
-        assert!(d.s.long.is_none());
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"file", &"mode"]
-        );
-        assert_eq!(d.v.num_vals.unwrap(), 2);
-    }
-
-    #[test]
-    fn create_option_with_vals2() {
-        let d = Arg::from_usage("-o <file> <mode>... 'some help info'");
-        assert_eq!(d.b.name, "o");
-        assert!(d.s.long.is_none());
-        assert_eq!(d.s.short.unwrap(), 'o');
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"file", &"mode"]
-        );
-        assert_eq!(d.v.num_vals.unwrap(), 2);
-    }
-
-    #[test]
-    fn create_option_with_vals3() {
-        let d = Arg::from_usage("--opt <file> <mode>... 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"file", &"mode"]
-        );
-        assert_eq!(d.v.num_vals.unwrap(), 2);
-    }
-
-    #[test]
-    fn create_option_with_vals4() {
-        let d = Arg::from_usage("[myopt] --opt <file> <mode> 'some help info'");
-        assert_eq!(d.b.name, "myopt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(!d.is_set(ArgSettings::Required));
-        assert_eq!(
-            d.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"file", &"mode"]
-        );
-        assert_eq!(d.v.num_vals.unwrap(), 2);
-    }
-
-    #[test]
-    fn create_option_with_vals5() {
-        let d = Arg::from_usage("--opt <file> <mode> 'some help info'");
-        assert_eq!(d.b.name, "opt");
-        assert!(d.s.short.is_none());
-        assert_eq!(d.s.long.unwrap(), "opt");
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(!d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::TakesValue));
-        assert!(d.is_set(ArgSettings::Required));
-        assert_eq!(d.v.num_vals.unwrap(), 2);
-    }
-
-    #[test]
-    fn create_positional_usage() {
-        let a = Arg::from_usage("[pos] 'some help info'");
-        assert_eq!(a.b.name, "pos");
-        assert_eq!(a.b.help.unwrap(), "some help info");
-        assert!(!a.is_set(ArgSettings::Multiple));
-        assert!(!a.is_set(ArgSettings::Required));
-        assert!(a.v.val_names.is_none());
-        assert!(a.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn create_positional_usage0() {
-        let b = Arg::from_usage("<pos> 'some help info'");
-        assert_eq!(b.b.name, "pos");
-        assert_eq!(b.b.help.unwrap(), "some help info");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::Required));
-        assert!(b.v.val_names.is_none());
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_mult_help() {
-        let c = Arg::from_usage("[pos]... 'some help info'");
-        assert_eq!(c.b.name, "pos");
-        assert_eq!(c.b.help.unwrap(), "some help info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_help_lit_single_quote() {
-        let c = Arg::from_usage("[pos]... 'some help\' info'");
-        assert_eq!(c.b.name, "pos");
-        assert_eq!(c.b.help.unwrap(), "some help' info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_help_double_lit_single_quote() {
-        let c = Arg::from_usage("[pos]... 'some \'help\' info'");
-        assert_eq!(c.b.name, "pos");
-        assert_eq!(c.b.help.unwrap(), "some 'help' info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_help_newline() {
-        let c = Arg::from_usage(
-            "[pos]... 'some help{n}\
-             info'",
-        );
-        assert_eq!(c.b.name, "pos");
-        assert_eq!(c.b.help.unwrap(), "some help{n}info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_help_newline_lit_sq() {
-        let c = Arg::from_usage(
-            "[pos]... 'some help\' stuff{n}\
-             info'",
-        );
-        assert_eq!(c.b.name, "pos");
-        assert_eq!(c.b.help.unwrap(), "some help' stuff{n}info");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_req_mult_help() {
-        let d = Arg::from_usage("<pos>... 'some help info'");
-        assert_eq!(d.b.name, "pos");
-        assert_eq!(d.b.help.unwrap(), "some help info");
-        assert!(d.is_set(ArgSettings::Multiple));
-        assert!(d.is_set(ArgSettings::Required));
-        assert!(d.v.val_names.is_none());
-        assert!(d.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_req() {
-        let b = Arg::from_usage("<pos>");
-        assert_eq!(b.b.name, "pos");
-        assert!(!b.is_set(ArgSettings::Multiple));
-        assert!(b.is_set(ArgSettings::Required));
-        assert!(b.v.val_names.is_none());
-        assert!(b.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn pos_mult() {
-        let c = Arg::from_usage("[pos]...");
-        assert_eq!(c.b.name, "pos");
-        assert!(c.is_set(ArgSettings::Multiple));
-        assert!(!c.is_set(ArgSettings::Required));
-        assert!(c.v.val_names.is_none());
-        assert!(c.v.num_vals.is_none());
-    }
-
-    #[test]
-    fn nonascii() {
-        let a = Arg::from_usage("<ASCII> 'üñíčöĐ€'");
-        assert_eq!(a.b.name, "ASCII");
-        assert_eq!(a.b.help, Some("üñíčöĐ€"));
-        let a = Arg::from_usage("<üñíčöĐ€> 'ASCII'");
-        assert_eq!(a.b.name, "üñíčöĐ€");
-        assert_eq!(a.b.help, Some("ASCII"));
-        let a = Arg::from_usage("<üñíčöĐ€> 'üñíčöĐ€'");
-        assert_eq!(a.b.name, "üñíčöĐ€");
-        assert_eq!(a.b.help, Some("üñíčöĐ€"));
-        let a = Arg::from_usage("-ø 'ø'");
-        assert_eq!(a.b.name, "ø");
-        assert_eq!(a.s.short, Some('ø'));
-        assert_eq!(a.b.help, Some("ø"));
-        let a = Arg::from_usage("--üñíčöĐ€ 'Nōṫ ASCII'");
-        assert_eq!(a.b.name, "üñíčöĐ€");
-        assert_eq!(a.s.long, Some("üñíčöĐ€"));
-        assert_eq!(a.b.help, Some("Nōṫ ASCII"));
-        let a = Arg::from_usage("[ñämê] --ôpt=[üñíčöĐ€] 'hælp'");
-        assert_eq!(a.b.name, "ñämê");
-        assert_eq!(a.s.long, Some("ôpt"));
-        assert_eq!(
-            a.v.val_names.unwrap().values().collect::<Vec<_>>(),
-            [&"üñíčöĐ€"]
-        );
-        assert_eq!(a.b.help, Some("hælp"));
-    }
-}
diff --git a/third_party/rust/crates_py_build_patch b/third_party/rust/crates_py_build_patch
index c347130..fb88a74 100644
--- a/third_party/rust/crates_py_build_patch
+++ b/third_party/rust/crates_py_build_patch
@@ -1,7 +1,7 @@
-diff --git a/third_party/rust/autocxx_bindgen/v0_59/BUILD.gn b/third_party/rust/autocxx_bindgen/v0_59/BUILD.gn
+diff --git a/third_party/rust/autocxx_bindgen/v0_60/BUILD.gn b/third_party/rust/autocxx_bindgen/v0_60/BUILD.gn
 index 921f25e254ce5..c583713f7792b 100644
---- a/third_party/rust/autocxx_bindgen/v0_59/BUILD.gn
-+++ b/third_party/rust/autocxx_bindgen/v0_59/BUILD.gn
+--- a/third_party/rust/autocxx_bindgen/v0_60/BUILD.gn
++++ b/third_party/rust/autocxx_bindgen/v0_60/BUILD.gn
 @@ -41,7 +41,8 @@ cargo_crate("lib") {
      "env_logger",
      "log",
@@ -42,10 +42,10 @@
 +    "//third_party/rust/quote/v1:lib",
 +  ]
 +}
-diff --git a/third_party/rust/bindgen/v0_59/BUILD.gn b/third_party/rust/bindgen/v0_59/BUILD.gn
+diff --git a/third_party/rust/bindgen/v0_60/BUILD.gn b/third_party/rust/bindgen/v0_60/BUILD.gn
 index f3e62a1b4f857..bf4d94452f9ef 100644
---- a/third_party/rust/bindgen/v0_59/BUILD.gn
-+++ b/third_party/rust/bindgen/v0_59/BUILD.gn
+--- a/third_party/rust/bindgen/v0_60/BUILD.gn
++++ b/third_party/rust/bindgen/v0_60/BUILD.gn
 @@ -15,6 +15,8 @@ cargo_crate("bindgen") {
    cargo_pkg_description =
        "Automatically generates Rust FFI bindings to C and C++ libraries."
diff --git a/third_party/rust/gnrt_build_patch b/third_party/rust/gnrt_build_patch
index 1d9bedc..f52e2b0 100644
--- a/third_party/rust/gnrt_build_patch
+++ b/third_party/rust/gnrt_build_patch
@@ -24,10 +24,10 @@
      "static",
      "which",
      "which-rustfmt",
-diff --git a/third_party/rust/bindgen/v0_59/BUILD.gn b/third_party/rust/bindgen/v0_59/BUILD.gn
-index 92399f19804e6..b22eee5268d53 100644
---- a/third_party/rust/bindgen/v0_59/BUILD.gn
-+++ b/third_party/rust/bindgen/v0_59/BUILD.gn
+diff --git a/third_party/rust/bindgen/v0_60/BUILD.gn b/third_party/rust/bindgen/v0_60/BUILD.gn
+index 277bfc5d8cda8..b826004e73899 100644
+--- a/third_party/rust/bindgen/v0_60/BUILD.gn
++++ b/third_party/rust/bindgen/v0_60/BUILD.gn
 @@ -40,7 +40,9 @@ cargo_crate("bindgen") {
      "env_logger",
      "log",
diff --git a/third_party/rust/strsim/v0_8/BUILD.gn b/third_party/rust/strsim/v0_8/BUILD.gn
deleted file mode 100644
index c9cb7f49b..0000000
--- a/third_party/rust/strsim/v0_8/BUILD.gn
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2022 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/rust/cargo_crate.gni")
-
-cargo_crate("lib") {
-  crate_name = "strsim"
-  epoch = "0.8"
-  crate_type = "rlib"
-
-  # Only for usage from third-party crates. Add the crate to
-  # third_party.toml to use it from first-party code.
-  visibility = [ "//third_party/rust/*" ]
-  crate_root = "crate/src/lib.rs"
-
-  # Unit tests skipped. Generate with --with-tests to include them.
-  build_native_rust_unit_tests = false
-  sources = [ "crate/src/lib.rs" ]
-  edition = "2015"
-  cargo_pkg_version = "0.8.0"
-  cargo_pkg_authors = "Danny Guo <dannyguo91@gmail.com>"
-  cargo_pkg_name = "strsim"
-  cargo_pkg_description = "Implementations of string similarity metrics.Includes Hamming, Levenshtein, OSA, Damerau-Levenshtein, Jaro, and Jaro-Winkler."
-}
diff --git a/third_party/rust/strsim/v0_8/README.chromium b/third_party/rust/strsim/v0_8/README.chromium
deleted file mode 100644
index 51f5491..0000000
--- a/third_party/rust/strsim/v0_8/README.chromium
+++ /dev/null
@@ -1,8 +0,0 @@
-Name: strsim
-URL: https://crates.io/crates/strsim
-Description: Implementations of string similarity metrics.
-Includes Hamming, Levenshtein, OSA, Damerau-Levenshtein, Jaro, and Jaro-Winkler.
-
-Version: 0.8.0
-Security Critical: no
-License: MIT
diff --git a/third_party/rust/strsim/v0_8/crate/.editorconfig b/third_party/rust/strsim/v0_8/crate/.editorconfig
deleted file mode 100644
index ee63547..0000000
--- a/third_party/rust/strsim/v0_8/crate/.editorconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-# editorconfig.org
-root = true
-
-[*]
-charset = utf-8
-end_of_line = lf
-indent_brace_style = K&R
-indent_size = 4
-indent_style = space
-insert_final_newline = true
-max_line_length = 80
-trim_trailing_whitespace = true
-
diff --git a/third_party/rust/strsim/v0_8/crate/.gitattributes b/third_party/rust/strsim/v0_8/crate/.gitattributes
deleted file mode 100644
index 80cd9fef..0000000
--- a/third_party/rust/strsim/v0_8/crate/.gitattributes
+++ /dev/null
@@ -1,3 +0,0 @@
-# Override core.autocrlf settings to keep line endings consistent (LF)
-* text=auto
-
diff --git a/third_party/rust/strsim/v0_8/crate/.gitignore b/third_party/rust/strsim/v0_8/crate/.gitignore
deleted file mode 100644
index 41ddad1a6..0000000
--- a/third_party/rust/strsim/v0_8/crate/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-/target
-/Cargo.lock
-*.swp
-*.swo
-.DS_Store
diff --git a/third_party/rust/strsim/v0_8/crate/.travis.yml b/third_party/rust/strsim/v0_8/crate/.travis.yml
deleted file mode 100644
index 3078661..0000000
--- a/third_party/rust/strsim/v0_8/crate/.travis.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-language: rust
-
-rust:
-    - nightly
-    - beta
-    - stable
-
-matrix:
-    allow_failures:
-        - rust: nightly
-
diff --git a/third_party/rust/strsim/v0_8/crate/CHANGELOG.md b/third_party/rust/strsim/v0_8/crate/CHANGELOG.md
deleted file mode 100644
index 48d6359..0000000
--- a/third_party/rust/strsim/v0_8/crate/CHANGELOG.md
+++ /dev/null
@@ -1,123 +0,0 @@
-# Change Log
-This project attempts to adhere to [Semantic Versioning](http://semver.org).
-
-## [Unreleased]
-
-## [0.8.0] - (2018-08-19)
-### Added
-- Normalized versions of Levenshtein and Damerau-Levenshtein (thanks [@gentoid](https://github.com/gentoid))
-
-## [0.7.0] - (2018-01-17)
-### Changed
-- Faster Levenshtein implementation (thanks [@wdv4758h](https://github.com/wdv4758h))
-
-### Removed
-- Remove the "against_vec" functions. They are one-liners now, so they don't
-  seem to add enough value to justify making the API larger. I didn't find
-  anybody using them when I skimmed through a GitHub search. If you do use them,
-  you can change the calls to something like:
-```rust
-let distances = strings.iter().map(|a| jaro(target, a)).collect();
-```
-
-## [0.6.0] - (2016-12-26)
-### Added
-- Add optimal string alignment distance
-
-### Fixed
-- Fix Damerau-Levenshtein implementation (previous implementation was actually
-  optimal string alignment; see this [Damerau-Levenshtein explanation])
-
-## [0.5.2] - (2016-11-21)
-### Changed
-- Remove Cargo generated documentation in favor of a [docs.rs] link
-
-## [0.5.1] - (2016-08-23)
-### Added
-- Add Cargo generated documentation
-
-### Fixed
-- Fix panic when Jaro or Jaro-Winkler are given strings both with a length of
-  one
-
-## [0.5.0] - (2016-08-11)
-### Changed
-- Make Hamming faster (thanks @IBUzPE9) when the two strings have the same
-  length but slower when they have different lengths
-
-## [0.4.1] - (2016-04-18)
-### Added
-- Add Vagrant setup for development
-- Add AppVeyor configuration for Windows CI
-
-### Fixed
-- Fix metrics when given strings with multibyte characters (thanks @WanzenBug)
-
-## [0.4.0] - (2015-06-10)
-### Added
-- For each metric, add a function that takes a vector of strings and returns a
-vector of results (thanks @ovarene)
-
-## [0.3.0] - (2015-04-30)
-### Changed
-- Remove usage of unstable Rust features
-
-## [0.2.5] - (2015-04-24)
-### Fixed
-- Remove unnecessary `Float` import from doc tests
-
-## [0.2.4] - (2015-04-15)
-### Fixed
-- Remove unused `core` feature flag
-
-## [0.2.3] - (2015-04-01)
-### Fixed
-- Remove now unnecessary `Float` import
-
-## [0.2.2] - (2015-03-29)
-### Fixed
-- Remove usage of `char_at` (marked as unstable)
-
-## [0.2.1] - (2015-02-20)
-### Fixed
-- Update bit vector import to match Rust update
-
-## [0.2.0] - (2015-02-19)
-### Added
-- Implement Damerau-Levenshtein
-- Add tests in docs
-
-## [0.1.1] - (2015-02-10)
-### Added
-- Configure Travis for CI
-- Add rustdoc comments
-
-### Fixed
-- Limit Jaro-Winkler return value to a maximum of 1.0
-- Fix float comparisons in tests
-
-## [0.1.0] - (2015-02-09)
-### Added
-- Implement Hamming, Jaro, Jaro-Winkler, and Levenshtein
-
-[Unreleased]: https://github.com/dguo/strsim-rs/compare/0.8.0...HEAD
-[0.8.0]: https://github.com/dguo/strsim-rs/compare/0.7.0...0.8.0
-[0.7.0]: https://github.com/dguo/strsim-rs/compare/0.6.0...0.7.0
-[0.6.0]: https://github.com/dguo/strsim-rs/compare/0.5.2...0.6.0
-[0.5.2]: https://github.com/dguo/strsim-rs/compare/0.5.1...0.5.2
-[0.5.1]: https://github.com/dguo/strsim-rs/compare/0.5.0...0.5.1
-[0.5.0]: https://github.com/dguo/strsim-rs/compare/0.4.1...0.5.0
-[0.4.1]: https://github.com/dguo/strsim-rs/compare/0.4.0...0.4.1
-[0.4.0]: https://github.com/dguo/strsim-rs/compare/0.3.0...0.4.0
-[0.3.0]: https://github.com/dguo/strsim-rs/compare/0.2.5...0.3.0
-[0.2.5]: https://github.com/dguo/strsim-rs/compare/0.2.4...0.2.5
-[0.2.4]: https://github.com/dguo/strsim-rs/compare/0.2.3...0.2.4
-[0.2.3]: https://github.com/dguo/strsim-rs/compare/0.2.2...0.2.3
-[0.2.2]: https://github.com/dguo/strsim-rs/compare/0.2.1...0.2.2
-[0.2.1]: https://github.com/dguo/strsim-rs/compare/0.2.0...0.2.1
-[0.2.0]: https://github.com/dguo/strsim-rs/compare/0.1.1...0.2.0
-[0.1.1]: https://github.com/dguo/strsim-rs/compare/0.1.0...0.1.1
-[0.1.0]: https://github.com/dguo/strsim-rs/compare/fabad4...0.1.0
-[docs.rs]: https://docs.rs/strsim/
-[Damerau-Levenshtein explanation]:
-http://scarcitycomputing.blogspot.com/2013/04/damerau-levenshtein-edit-distance.html
diff --git a/third_party/rust/strsim/v0_8/crate/Cargo.toml b/third_party/rust/strsim/v0_8/crate/Cargo.toml
deleted file mode 100644
index 38d37aee..0000000
--- a/third_party/rust/strsim/v0_8/crate/Cargo.toml
+++ /dev/null
@@ -1,28 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g. crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-name = "strsim"
-version = "0.8.0"
-authors = ["Danny Guo <dannyguo91@gmail.com>"]
-description = "Implementations of string similarity metrics.\nIncludes Hamming, Levenshtein, OSA, Damerau-Levenshtein, Jaro, and Jaro-Winkler.\n"
-homepage = "https://github.com/dguo/strsim-rs"
-documentation = "https://docs.rs/strsim/"
-readme = "README.md"
-keywords = ["string", "similarity", "Hamming", "Levenshtein", "Jaro"]
-license = "MIT"
-repository = "https://github.com/dguo/strsim-rs"
-[badges.appveyor]
-repository = "dguo/strsim-rs"
-
-[badges.travis-ci]
-repository = "dguo/strsim-rs"
diff --git a/third_party/rust/strsim/v0_8/crate/Cargo.toml.orig b/third_party/rust/strsim/v0_8/crate/Cargo.toml.orig
deleted file mode 100644
index f0696e0..0000000
--- a/third_party/rust/strsim/v0_8/crate/Cargo.toml.orig
+++ /dev/null
@@ -1,18 +0,0 @@
-[package]
-name = "strsim"
-version = "0.8.0"
-authors = ["Danny Guo <dannyguo91@gmail.com>"]
-description = """
-Implementations of string similarity metrics.
-Includes Hamming, Levenshtein, OSA, Damerau-Levenshtein, Jaro, and Jaro-Winkler.
-"""
-license = "MIT"
-readme = "README.md"
-keywords = ["string", "similarity", "Hamming", "Levenshtein", "Jaro"]
-homepage = "https://github.com/dguo/strsim-rs"
-repository = "https://github.com/dguo/strsim-rs"
-documentation = "https://docs.rs/strsim/"
-
-[badges]
-travis-ci = { repository = "dguo/strsim-rs" }
-appveyor = { repository = "dguo/strsim-rs" }
diff --git a/third_party/rust/strsim/v0_8/crate/LICENSE b/third_party/rust/strsim/v0_8/crate/LICENSE
deleted file mode 100644
index 1aacdb8..0000000
--- a/third_party/rust/strsim/v0_8/crate/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Danny Guo
-Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>
-
-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/rust/strsim/v0_8/crate/README.md b/third_party/rust/strsim/v0_8/crate/README.md
deleted file mode 100644
index 8765ea8..0000000
--- a/third_party/rust/strsim/v0_8/crate/README.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# strsim-rs [![Crates.io](https://img.shields.io/crates/v/strsim.svg)](https://crates.io/crates/strsim) [![Crates.io](https://img.shields.io/crates/l/strsim.svg?maxAge=2592000)](https://github.com/dguo/strsim-rs/blob/master/LICENSE) [![Linux build status](https://travis-ci.org/dguo/strsim-rs.svg?branch=master)](https://travis-ci.org/dguo/strsim-rs) [![Windows build status](https://ci.appveyor.com/api/projects/status/ggue6i785618a39w?svg=true)](https://ci.appveyor.com/project/dguo/strsim-rs)
-
-[Rust](https://www.rust-lang.org) implementations of [string similarity metrics]:
-  - [Hamming]
-  - [Levenshtein] - distance & normalized
-  - [Optimal string alignment]
-  - [Damerau-Levenshtein] - distance & normalized
-  - [Jaro and Jaro-Winkler] - this implementation of Jaro-Winkler does not limit the common prefix length
-
-### Installation
-```toml
-# Cargo.toml
-[dependencies]
-strsim = "0.8.0"
-```
-
-### [Documentation](https://docs.rs/strsim/)
-You can change the version in the url to see the documentation for an older
-version in the
-[changelog](https://github.com/dguo/strsim-rs/blob/master/CHANGELOG.md).
-
-### Usage
-```rust
-extern crate strsim;
-
-use strsim::{hamming, levenshtein, normalized_levenshtein, osa_distance,
-             damerau_levenshtein, normalized_damerau_levenshtein, jaro,
-             jaro_winkler};
-
-fn main() {
-    match hamming("hamming", "hammers") {
-        Ok(distance) => assert_eq!(3, distance),
-        Err(why) => panic!("{:?}", why)
-    }
-
-    assert_eq!(3, levenshtein("kitten", "sitting"));
-
-    assert!((normalized_levenshtein("kitten", "sitting") - 0.57142).abs() < 0.00001);
-
-    assert_eq!(3, osa_distance("ac", "cba"));
-
-    assert_eq!(2, damerau_levenshtein("ac", "cba"));
-
-    assert!((normalized_damerau_levenshtein("levenshtein", "löwenbräu") - 0.27272).abs() < 0.00001)
-
-    assert!((0.392 - jaro("Friedrich Nietzsche", "Jean-Paul Sartre")).abs() <
-            0.001);
-
-    assert!((0.911 - jaro_winkler("cheeseburger", "cheese fries")).abs() <
-            0.001);
-}
-```
-
-### Development
-If you don't want to install Rust itself, you can run `$ ./dev` for a
-development CLI if you have [Docker] installed.
-
-Benchmarks require a Nightly toolchain. They are run by `cargo +nightly bench`.
-
-### License
-[MIT](https://github.com/dguo/strsim-rs/blob/master/LICENSE)
-
-[string similarity metrics]:http://en.wikipedia.org/wiki/String_metric
-[Damerau-Levenshtein]:http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance
-[Jaro and Jaro-Winkler]:http://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance
-[Levenshtein]:http://en.wikipedia.org/wiki/Levenshtein_distance
-[Hamming]:http://en.wikipedia.org/wiki/Hamming_distance
-[Optimal string alignment]:https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance#Optimal_string_alignment_distance
-[Docker]:https://docs.docker.com/engine/installation/
diff --git a/third_party/rust/strsim/v0_8/crate/appveyor.yml b/third_party/rust/strsim/v0_8/crate/appveyor.yml
deleted file mode 100644
index fb992db82b..0000000
--- a/third_party/rust/strsim/v0_8/crate/appveyor.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-install:
-  - ps: Start-FileDownload 'https://static.rust-lang.org/dist/rust-beta-x86_64-pc-windows-gnu.exe'
-  - rust-beta-x86_64-pc-windows-gnu.exe /VERYSILENT /NORESTART /DIR="C:\Program Files (x86)\Rust"
-  - SET PATH=%PATH%;C:\Program Files (x86)\Rust\bin
-  - rustc -V
-  - cargo -V
-
-build: false
-
-test_script:
-  - cargo build
-  - cargo test --verbose
-
diff --git a/third_party/rust/strsim/v0_8/crate/benches/benches.rs b/third_party/rust/strsim/v0_8/crate/benches/benches.rs
deleted file mode 100644
index a6d5372e..0000000
--- a/third_party/rust/strsim/v0_8/crate/benches/benches.rs
+++ /dev/null
@@ -1,84 +0,0 @@
-//! Benchmarks for strsim.
-
-#![feature(test)]
-
-extern crate strsim;
-
-mod benches {
-    use super::*;
-
-    extern crate test;
-    use self::test::Bencher;
-
-    #[bench]
-    fn bench_hamming(bencher: &mut Bencher) {
-        let a = "ACAAGATGCCATTGTCCCCCGGCCTCCTGCTGCTGCTGCTCTCCGGGG";
-        let b = "CCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGC";
-        bencher.iter(|| {
-            strsim::hamming(&a, &b).unwrap();
-        })
-    }
-
-    #[bench]
-    fn bench_jaro(bencher: &mut Bencher) {
-        let a = "Philosopher Friedrich Nietzsche";
-        let b = "Philosopher Jean-Paul Sartre";
-        bencher.iter(|| {
-            strsim::jaro(&a, &b);
-        })
-    }
-
-    #[bench]
-    fn bench_jaro_winkler(bencher: &mut Bencher) {
-        let a = "Philosopher Friedrich Nietzsche";
-        let b = "Philosopher Jean-Paul Sartre";
-        bencher.iter(|| {
-            strsim::jaro_winkler(&a, &b);
-        })
-    }
-
-    #[bench]
-    fn bench_levenshtein(bencher: &mut Bencher) {
-        let a = "Philosopher Friedrich Nietzsche";
-        let b = "Philosopher Jean-Paul Sartre";
-        bencher.iter(|| {
-            strsim::levenshtein(&a, &b);
-        })
-    }
-
-    #[bench]
-    fn bench_normalized_levenshtein(bencher: &mut Bencher) {
-        let a = "Philosopher Friedrich Nietzsche";
-        let b = "Philosopher Jean-Paul Sartre";
-        bencher.iter(|| {
-            strsim::normalized_levenshtein(&a, &b);
-        })
-    }
-
-    #[bench]
-    fn bench_osa_distance(bencher: &mut Bencher) {
-        let a = "Philosopher Friedrich Nietzsche";
-        let b = "Philosopher Jean-Paul Sartre";
-        bencher.iter(|| {
-            strsim::osa_distance(&a, &b);
-        })
-    }
-
-    #[bench]
-    fn bench_damerau_levenshtein(bencher: &mut Bencher) {
-        let a = "Philosopher Friedrich Nietzsche";
-        let b = "Philosopher Jean-Paul Sartre";
-        bencher.iter(|| {
-            strsim::damerau_levenshtein(&a, &b);
-        })
-    }
-
-    #[bench]
-    fn bench_normalized_damerau_levenshtein(bencher: &mut Bencher) {
-        let a = "Philosopher Friedrich Nietzsche";
-        let b = "Philosopher Jean-Paul Sartre";
-        bencher.iter(|| {
-            strsim::normalized_damerau_levenshtein(&a, &b);
-        })
-    }
-}
diff --git a/third_party/rust/strsim/v0_8/crate/dev b/third_party/rust/strsim/v0_8/crate/dev
deleted file mode 100755
index 4c85a49..0000000
--- a/third_party/rust/strsim/v0_8/crate/dev
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env python3
-# ./dev --help
-
-import argparse
-import os
-from subprocess import run
-import sys
-
-parser = argparse.ArgumentParser(prog='./dev')
-subparsers = parser.add_subparsers(metavar='<command>', title='commands')
-command = [
-    'docker', 'run', '-it', '--rm', '-v', os.getcwd() + ':/src:cached',
-    '-w=/src', 'rust:1.21.0'
-]
-
-def cargo(args, remaining):
-    sys.exit(run(command + ['cargo'] + remaining or []).returncode)
-
-parser_cargo = subparsers.add_parser('cargo', help='run a cargo command')
-parser_cargo.set_defaults(func=cargo)
-
-def sh(args, remaining):
-    sys.exit(run(command + ['bash']).returncode)
-
-parser_sh = subparsers.add_parser('sh', help='bring up a shell')
-parser_sh.set_defaults(func=sh)
-
-def test(args, remaining):
-    sys.exit(run(command + ['cargo', 'test']).returncode)
-
-parser_test = subparsers.add_parser('test', help='run tests')
-parser_test.set_defaults(func=test)
-
-if len(sys.argv) > 1:
-    args, remaining = parser.parse_known_args()
-    try:
-        args.func(args, remaining)
-    except FileNotFoundError:
-        sys.exit('Please install Docker.')
-else:
-    parser.print_help()
diff --git a/third_party/rust/strsim/v0_8/crate/src/lib.rs b/third_party/rust/strsim/v0_8/crate/src/lib.rs
deleted file mode 100644
index 8c56843..0000000
--- a/third_party/rust/strsim/v0_8/crate/src/lib.rs
+++ /dev/null
@@ -1,786 +0,0 @@
-//! This library implements string similarity metrics.
-
-use std::char;
-use std::cmp::{max, min};
-use std::collections::HashMap;
-
-#[derive(Debug, PartialEq)]
-pub enum StrSimError {
-    DifferentLengthArgs
-}
-
-pub type HammingResult = Result<usize, StrSimError>;
-
-/// Calculates the number of positions in the two strings where the characters
-/// differ. Returns an error if the strings have different lengths.
-///
-/// ```
-/// use strsim::hamming;
-///
-/// match hamming("hamming", "hammers") {
-///     Ok(distance) => assert_eq!(3, distance),
-///     Err(why) => panic!("{:?}", why)
-/// }
-/// ```
-pub fn hamming(a: &str, b: &str) -> HammingResult {
-    let (mut ita, mut itb, mut count) = (a.chars(), b.chars(), 0);
-    loop {
-        match (ita.next(), itb.next()){
-            (Some(x), Some(y)) => if x != y { count += 1 },
-            (None, None) => return Ok(count),
-            _ => return Err(StrSimError::DifferentLengthArgs),
-        }
-    }
-}
-
-/// Calculates the Jaro similarity between two strings. The returned value
-/// is between 0.0 and 1.0 (higher value means more similar).
-///
-/// ```
-/// use strsim::jaro;
-///
-/// assert!((0.392 - jaro("Friedrich Nietzsche", "Jean-Paul Sartre")).abs() <
-///         0.001);
-/// ```
-pub fn jaro(a: &str, b: &str) -> f64 {
-    if a == b { return 1.0; }
-
-    let a_len = a.chars().count();
-    let b_len = b.chars().count();
-
-    // The check for lengths of one here is to prevent integer overflow when
-    // calculating the search range.
-    if a_len == 0 || b_len == 0 || (a_len == 1 && b_len == 1) {
-        return 0.0;
-    }
-
-    let search_range = (max(a_len, b_len) / 2) - 1;
-
-    let mut b_consumed = Vec::with_capacity(b_len);
-    for _ in 0..b_len {
-        b_consumed.push(false);
-    }
-    let mut matches = 0.0;
-
-    let mut transpositions = 0.0;
-    let mut b_match_index = 0;
-
-    for (i, a_char) in a.chars().enumerate() {
-        let min_bound =
-            // prevent integer wrapping
-            if i > search_range {
-                max(0, i - search_range)
-            } else {
-                0
-            };
-
-        let max_bound = min(b_len - 1, i + search_range);
-
-        if min_bound > max_bound {
-            continue;
-        }
-
-        for (j, b_char) in b.chars().enumerate() {
-            if min_bound <= j && j <= max_bound && a_char == b_char &&
-               !b_consumed[j] {
-                b_consumed[j] = true;
-                matches += 1.0;
-
-                if j < b_match_index {
-                    transpositions += 1.0;
-                }
-                b_match_index = j;
-
-                break;
-            }
-        }
-    }
-
-    if matches == 0.0 {
-        0.0
-    } else {
-        (1.0 / 3.0) * ((matches / a_len as f64) +
-                       (matches / b_len as f64) +
-                       ((matches - transpositions) / matches))
-    }
-}
-
-/// Like Jaro but gives a boost to strings that have a common prefix.
-///
-/// ```
-/// use strsim::jaro_winkler;
-///
-/// assert!((0.911 - jaro_winkler("cheeseburger", "cheese fries")).abs() <
-///         0.001);
-/// ```
-pub fn jaro_winkler(a: &str, b: &str) -> f64 {
-    let jaro_distance = jaro(a, b);
-
-    // Don't limit the length of the common prefix
-    let prefix_length = a.chars()
-                         .zip(b.chars())
-                         .take_while(|&(a_char, b_char)| a_char == b_char)
-                         .count();
-
-    let jaro_winkler_distance =
-        jaro_distance + (0.1 * prefix_length as f64 * (1.0 - jaro_distance));
-
-    if jaro_winkler_distance <= 1.0 {
-        jaro_winkler_distance
-    } else {
-        1.0
-    }
-}
-
-/// Calculates the minimum number of insertions, deletions, and substitutions
-/// required to change one string into the other.
-///
-/// ```
-/// use strsim::levenshtein;
-///
-/// assert_eq!(3, levenshtein("kitten", "sitting"));
-/// ```
-pub fn levenshtein(a: &str, b: &str) -> usize {
-    if a == b { return 0; }
-
-    let a_len = a.chars().count();
-    let b_len = b.chars().count();
-
-    if a_len == 0 { return b_len; }
-    if b_len == 0 { return a_len; }
-
-    let mut cache: Vec<usize> = (1..b_len+1).collect();
-
-    let mut result = 0;
-    let mut distance_a;
-    let mut distance_b;
-
-    for (i, a_char) in a.chars().enumerate() {
-        result = i;
-        distance_b = i;
-
-        for (j, b_char) in b.chars().enumerate() {
-            let cost = if a_char == b_char { 0 } else { 1 };
-            distance_a = distance_b + cost;
-            distance_b = cache[j];
-            result = min(result + 1, min(distance_a, distance_b + 1));
-            cache[j] = result;
-        }
-    }
-
-    result
-}
-
-/// Calculates a normalized score of the Levenshtein algorithm between 0.0 and
-/// 1.0 (inclusive), where 1.0 means the strings are the same.
-///
-/// ```
-/// use strsim::normalized_levenshtein;
-///
-/// assert!((normalized_levenshtein("kitten", "sitting") - 0.57142).abs() < 0.00001);
-/// assert!((normalized_levenshtein("", "") - 1.0).abs() < 0.00001);
-/// assert!(normalized_levenshtein("", "second").abs() < 0.00001);
-/// assert!(normalized_levenshtein("first", "").abs() < 0.00001);
-/// assert!((normalized_levenshtein("string", "string") - 1.0).abs() < 0.00001);
-/// ```
-pub fn normalized_levenshtein(a: &str, b: &str) -> f64 {
-    if a.is_empty() && b.is_empty() {
-        return 1.0;
-    }
-    1.0 - (levenshtein(a, b) as f64) / (a.chars().count().max(b.chars().count()) as f64)
-}
-
-/// Like Levenshtein but allows for adjacent transpositions. Each substring can
-/// only be edited once.
-///
-/// ```
-/// use strsim::osa_distance;
-///
-/// assert_eq!(3, osa_distance("ab", "bca"));
-/// ```
-pub fn osa_distance(a: &str, b: &str) -> usize {
-    let a_len = a.chars().count();
-    let b_len = b.chars().count();
-    if a == b { return 0; }
-    else if a_len == 0 { return b_len; }
-    else if b_len == 0 { return a_len; }
-
-    let mut prev_two_distances: Vec<usize> = Vec::with_capacity(b_len + 1);
-    let mut prev_distances: Vec<usize> = Vec::with_capacity(b_len + 1);
-    let mut curr_distances: Vec<usize> = Vec::with_capacity(b_len + 1);
-
-    let mut prev_a_char = char::MAX;
-    let mut prev_b_char = char::MAX;
-
-    for i in 0..(b_len + 1) {
-        prev_two_distances.push(i);
-        prev_distances.push(i);
-        curr_distances.push(0);
-    }
-
-    for (i, a_char) in a.chars().enumerate() {
-        curr_distances[0] = i + 1;
-
-        for (j, b_char) in b.chars().enumerate() {
-            let cost = if a_char == b_char { 0 } else { 1 };
-            curr_distances[j + 1] = min(curr_distances[j] + 1,
-                                        min(prev_distances[j + 1] + 1,
-                                            prev_distances[j] + cost));
-            if i > 0 && j > 0 && a_char != b_char &&
-               a_char == prev_b_char && b_char == prev_a_char {
-                curr_distances[j + 1] = min(curr_distances[j + 1],
-                                            prev_two_distances[j - 1] + 1);
-            }
-
-            prev_b_char = b_char;
-        }
-
-        prev_two_distances.clone_from(&prev_distances);
-        prev_distances.clone_from(&curr_distances);
-        prev_a_char = a_char;
-    }
-
-    curr_distances[b_len]
-
-}
-
-/// Like optimal string alignment, but substrings can be edited an unlimited
-/// number of times, and the triangle inequality holds.
-///
-/// ```
-/// use strsim::damerau_levenshtein;
-///
-/// assert_eq!(2, damerau_levenshtein("ab", "bca"));
-/// ```
-pub fn damerau_levenshtein(a: &str, b: &str) -> usize {
-    if a == b { return 0; }
-
-    let a_chars: Vec<char> = a.chars().collect();
-    let b_chars: Vec<char> = b.chars().collect();
-    let a_len = a_chars.len();
-    let b_len = b_chars.len();
-
-    if a_len == 0 { return b_len; }
-    if b_len == 0 { return a_len; }
-
-    let mut distances = vec![vec![0; b_len + 2]; a_len + 2];
-    let max_distance = a_len + b_len;
-    distances[0][0] = max_distance;
-
-    for i in 0..(a_len + 1) {
-        distances[i + 1][0] = max_distance;
-        distances[i + 1][1] = i;
-    }
-
-    for j in 0..(b_len + 1) {
-        distances[0][j + 1] = max_distance;
-        distances[1][j + 1] = j;
-    }
-
-    let mut chars: HashMap<char, usize> = HashMap::new();
-
-    for i in 1..(a_len + 1) {
-        let mut db = 0;
-
-        for j in 1..(b_len + 1) {
-            let k = match chars.get(&b_chars[j - 1]) {
-                Some(value) => value.clone(),
-                None => 0
-            };
-
-            let l = db;
-
-            let mut cost = 1;
-            if a_chars[i - 1] == b_chars[j - 1] {
-                cost = 0;
-                db = j;
-            }
-
-            let substitution_cost = distances[i][j] + cost;
-            let insertion_cost = distances[i][j + 1] + 1;
-            let deletion_cost = distances[i + 1][j] + 1;
-            let transposition_cost = distances[k][l] + (i - k - 1) + 1 +
-                                     (j - l - 1);
-
-            distances[i + 1][j + 1] = min(substitution_cost,
-                                      min(insertion_cost,
-                                      min(deletion_cost,
-                                          transposition_cost)));
-        }
-
-        chars.insert(a_chars[i - 1], i);
-    }
-
-    distances[a_len + 1][b_len + 1]
-}
-
-/// Calculates a normalized score of the Damerau–Levenshtein algorithm between
-/// 0.0 and 1.0 (inclusive), where 1.0 means the strings are the same.
-///
-/// ```
-/// use strsim::normalized_damerau_levenshtein;
-///
-/// assert!((normalized_damerau_levenshtein("levenshtein", "löwenbräu") - 0.27272).abs() < 0.00001);
-/// assert!((normalized_damerau_levenshtein("", "") - 1.0).abs() < 0.00001);
-/// assert!(normalized_damerau_levenshtein("", "flower").abs() < 0.00001);
-/// assert!(normalized_damerau_levenshtein("tree", "").abs() < 0.00001);
-/// assert!((normalized_damerau_levenshtein("sunglasses", "sunglasses") - 1.0).abs() < 0.00001);
-/// ```
-pub fn normalized_damerau_levenshtein(a: &str, b: &str) -> f64 {
-    if a.is_empty() && b.is_empty() {
-        return 1.0;
-    }
-    1.0 - (damerau_levenshtein(a, b) as f64) / (a.chars().count().max(b.chars().count()) as f64)
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    #[test]
-    fn hamming_empty() {
-        match hamming("", "") {
-            Ok(distance) => { assert_eq!(0, distance); },
-            Err(why) => { panic!("{:?}", why); }
-        }
-    }
-
-    #[test]
-    fn hamming_same() {
-        match hamming("hamming", "hamming") {
-            Ok(distance) => { assert_eq!(0, distance); },
-            Err(why) => { panic!("{:?}", why); }
-        }
-    }
-
-    #[test]
-    fn hamming_diff() {
-        match hamming("hamming", "hammers") {
-            Ok(distance) => { assert_eq!(3, distance); },
-            Err(why) => { panic!("{:?}", why); }
-        }
-    }
-
-    #[test]
-    fn hamming_diff_multibyte() {
-        match hamming("hamming", "h香mmüng") {
-            Ok(distance) => { assert_eq!(2, distance); },
-            Err(why) => { panic!("{:?}", why); }
-        }
-    }
-
-    #[test]
-    fn hamming_unequal_length() {
-        match hamming("ham", "hamming") {
-            Ok(_) => { panic!(); },
-            Err(why) => { assert_eq!(why, StrSimError::DifferentLengthArgs); }
-        }
-    }
-
-    #[test]
-    fn hamming_names() {
-        match hamming("Friedrich Nietzs", "Jean-Paul Sartre") {
-            Ok(distance) => { assert_eq!(14, distance); },
-            Err(why) => { panic!("{:?}", why); }
-        }
-    }
-
-    #[test]
-    fn jaro_both_empty() {
-       assert_eq!(1.0, jaro("", ""));
-    }
-
-    #[test]
-    fn jaro_first_empty() {
-        assert_eq!(0.0, jaro("", "jaro"));
-    }
-
-    #[test]
-    fn jaro_second_empty() {
-        assert_eq!(0.0, jaro("distance", ""));
-    }
-
-    #[test]
-    fn jaro_same() {
-        assert_eq!(1.0, jaro("jaro", "jaro"));
-    }
-
-    #[test]
-    fn jaro_multibyte() {
-        assert!((0.818 - jaro("testabctest", "testöঙ香test")) < 0.001);
-        assert!((0.818 - jaro("testöঙ香test", "testabctest")) < 0.001);
-    }
-
-    #[test]
-    fn jaro_diff_short() {
-        assert!((0.767 - jaro("dixon", "dicksonx")).abs() < 0.001);
-    }
-
-    #[test]
-    fn jaro_diff_one_character() {
-        assert_eq!(0.0, jaro("a", "b"));
-    }
-
-    #[test]
-    fn jaro_diff_one_and_two() {
-        assert!((0.83 - jaro("a", "ab")).abs() < 0.01);
-    }
-
-    #[test]
-    fn jaro_diff_two_and_one() {
-        assert!((0.83 - jaro("ab", "a")).abs() < 0.01);
-    }
-
-    #[test]
-    fn jaro_diff_no_transposition() {
-        assert!((0.822 - jaro("dwayne", "duane")).abs() < 0.001);
-    }
-
-    #[test]
-    fn jaro_diff_with_transposition() {
-        assert!((0.944 - jaro("martha", "marhta")).abs() < 0.001);
-    }
-
-    #[test]
-    fn jaro_names() {
-        assert!((0.392 - jaro("Friedrich Nietzsche",
-                              "Jean-Paul Sartre")).abs() < 0.001);
-    }
-
-    #[test]
-    fn jaro_winkler_both_empty() {
-        assert_eq!(1.0, jaro_winkler("", ""));
-    }
-
-    #[test]
-    fn jaro_winkler_first_empty() {
-        assert_eq!(0.0, jaro_winkler("", "jaro-winkler"));
-    }
-
-    #[test]
-    fn jaro_winkler_second_empty() {
-        assert_eq!(0.0, jaro_winkler("distance", ""));
-    }
-
-    #[test]
-    fn jaro_winkler_same() {
-        assert_eq!(1.0, jaro_winkler("Jaro-Winkler", "Jaro-Winkler"));
-    }
-
-    #[test]
-    fn jaro_winkler_multibyte() {
-        assert!((0.89 - jaro_winkler("testabctest", "testöঙ香test")).abs() <
-                0.001);
-        assert!((0.89 - jaro_winkler("testöঙ香test", "testabctest")).abs() <
-                0.001);
-    }
-
-    #[test]
-    fn jaro_winkler_diff_short() {
-        assert!((0.813 - jaro_winkler("dixon", "dicksonx")).abs() < 0.001);
-        assert!((0.813 - jaro_winkler("dicksonx", "dixon")).abs() < 0.001);
-    }
-
-    #[test]
-    fn jaro_winkler_diff_one_character() {
-        assert_eq!(0.0, jaro_winkler("a", "b"));
-    }
-
-    #[test]
-    fn jaro_winkler_diff_no_transposition() {
-        assert!((0.840 - jaro_winkler("dwayne", "duane")).abs() < 0.001);
-    }
-
-    #[test]
-    fn jaro_winkler_diff_with_transposition() {
-        assert!((0.961 - jaro_winkler("martha", "marhta")).abs() < 0.001);
-    }
-
-    #[test]
-    fn jaro_winkler_names() {
-        assert!((0.562 - jaro_winkler("Friedrich Nietzsche",
-                                      "Fran-Paul Sartre")).abs() < 0.001);
-    }
-
-    #[test]
-    fn jaro_winkler_long_prefix() {
-        assert!((0.911 - jaro_winkler("cheeseburger", "cheese fries")).abs() <
-                0.001);
-    }
-
-    #[test]
-    fn jaro_winkler_more_names() {
-        assert!((0.868 - jaro_winkler("Thorkel", "Thorgier")).abs() < 0.001);
-    }
-
-    #[test]
-    fn jaro_winkler_length_of_one() {
-        assert!((0.738 - jaro_winkler("Dinsdale", "D")).abs() < 0.001);
-    }
-
-    #[test]
-    fn jaro_winkler_very_long_prefix() {
-        assert!((1.0 - jaro_winkler("thequickbrownfoxjumpedoverx",
-                                    "thequickbrownfoxjumpedovery")).abs() <
-                0.001);
-    }
-
-    #[test]
-    fn levenshtein_empty() {
-        assert_eq!(0, levenshtein("", ""));
-    }
-
-    #[test]
-    fn levenshtein_same() {
-        assert_eq!(0, levenshtein("levenshtein", "levenshtein"));
-    }
-
-    #[test]
-    fn levenshtein_diff_short() {
-        assert_eq!(3, levenshtein("kitten", "sitting"));
-    }
-
-    #[test]
-    fn levenshtein_diff_with_space() {
-        assert_eq!(5, levenshtein("hello, world", "bye, world"));
-    }
-
-    #[test]
-    fn levenshtein_diff_multibyte() {
-        assert_eq!(3, levenshtein("öঙ香", "abc"));
-        assert_eq!(3, levenshtein("abc", "öঙ香"));
-    }
-
-    #[test]
-    fn levenshtein_diff_longer() {
-        let a = "The quick brown fox jumped over the angry dog.";
-        let b = "Lorem ipsum dolor sit amet, dicta latine an eam.";
-        assert_eq!(37, levenshtein(a, b));
-    }
-
-    #[test]
-    fn levenshtein_first_empty() {
-        assert_eq!(7, levenshtein("", "sitting"));
-    }
-
-    #[test]
-    fn levenshtein_second_empty() {
-        assert_eq!(6, levenshtein("kitten", ""));
-    }
-
-    #[test]
-    fn normalized_levenshtein_diff_short() {
-        assert!((normalized_levenshtein("kitten", "sitting") - 0.57142).abs() < 0.00001);
-    }
-
-    #[test]
-    fn normalized_levenshtein_for_empty_strings() {
-        assert!((normalized_levenshtein("", "") - 1.0).abs() < 0.00001);
-    }
-
-    #[test]
-    fn normalized_levenshtein_first_empty() {
-        assert!(normalized_levenshtein("", "second").abs() < 0.00001);
-    }
-
-    #[test]
-    fn normalized_levenshtein_second_empty() {
-        assert!(normalized_levenshtein("first", "").abs() < 0.00001);
-    }
-
-    #[test]
-    fn normalized_levenshtein_identical_strings() {
-        assert!((normalized_levenshtein("identical", "identical") - 1.0).abs() < 0.00001);
-    }
-
-    #[test]
-    fn osa_distance_empty() {
-        assert_eq!(0, osa_distance("", ""));
-    }
-
-    #[test]
-    fn osa_distance_same() {
-        assert_eq!(0, osa_distance("damerau", "damerau"));
-    }
-
-    #[test]
-    fn osa_distance_first_empty() {
-        assert_eq!(7, osa_distance("", "damerau"));
-    }
-
-    #[test]
-    fn osa_distance_second_empty() {
-        assert_eq!(7, osa_distance("damerau", ""));
-    }
-
-    #[test]
-    fn osa_distance_diff() {
-        assert_eq!(3, osa_distance("ca", "abc"));
-    }
-
-    #[test]
-    fn osa_distance_diff_short() {
-        assert_eq!(3, osa_distance("damerau", "aderua"));
-    }
-
-    #[test]
-    fn osa_distance_diff_reversed() {
-        assert_eq!(3, osa_distance("aderua", "damerau"));
-    }
-
-    #[test]
-    fn osa_distance_diff_multibyte() {
-        assert_eq!(3, osa_distance("öঙ香", "abc"));
-        assert_eq!(3, osa_distance("abc", "öঙ香"));
-    }
-
-    #[test]
-    fn osa_distance_diff_unequal_length() {
-        assert_eq!(6, osa_distance("damerau", "aderuaxyz"));
-    }
-
-    #[test]
-    fn osa_distance_diff_unequal_length_reversed() {
-        assert_eq!(6, osa_distance("aderuaxyz", "damerau"));
-    }
-
-    #[test]
-    fn osa_distance_diff_comedians() {
-        assert_eq!(5, osa_distance("Stewart", "Colbert"));
-    }
-
-    #[test]
-    fn osa_distance_many_transpositions() {
-        assert_eq!(4, osa_distance("abcdefghijkl", "bacedfgihjlk"));
-    }
-
-    #[test]
-    fn osa_distance_diff_longer() {
-        let a = "The quick brown fox jumped over the angry dog.";
-        let b = "Lehem ipsum dolor sit amet, dicta latine an eam.";
-        assert_eq!(36, osa_distance(a, b));
-    }
-
-    #[test]
-    fn osa_distance_beginning_transposition() {
-        assert_eq!(1, osa_distance("foobar", "ofobar"));
-    }
-
-    #[test]
-    fn osa_distance_end_transposition() {
-        assert_eq!(1, osa_distance("specter", "spectre"));
-    }
-
-    #[test]
-    fn osa_distance_restricted_edit() {
-        assert_eq!(4, osa_distance("a cat", "an abct"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_empty() {
-        assert_eq!(0, damerau_levenshtein("", ""));
-    }
-
-    #[test]
-    fn damerau_levenshtein_same() {
-        assert_eq!(0, damerau_levenshtein("damerau", "damerau"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_first_empty() {
-        assert_eq!(7, damerau_levenshtein("", "damerau"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_second_empty() {
-        assert_eq!(7, damerau_levenshtein("damerau", ""));
-    }
-
-    #[test]
-    fn damerau_levenshtein_diff() {
-        assert_eq!(2, damerau_levenshtein("ca", "abc"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_diff_short() {
-        assert_eq!(3, damerau_levenshtein("damerau", "aderua"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_diff_reversed() {
-        assert_eq!(3, damerau_levenshtein("aderua", "damerau"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_diff_multibyte() {
-        assert_eq!(3, damerau_levenshtein("öঙ香", "abc"));
-        assert_eq!(3, damerau_levenshtein("abc", "öঙ香"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_diff_unequal_length() {
-        assert_eq!(6, damerau_levenshtein("damerau", "aderuaxyz"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_diff_unequal_length_reversed() {
-        assert_eq!(6, damerau_levenshtein("aderuaxyz", "damerau"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_diff_comedians() {
-        assert_eq!(5, damerau_levenshtein("Stewart", "Colbert"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_many_transpositions() {
-        assert_eq!(4, damerau_levenshtein("abcdefghijkl", "bacedfgihjlk"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_diff_longer() {
-        let a = "The quick brown fox jumped over the angry dog.";
-        let b = "Lehem ipsum dolor sit amet, dicta latine an eam.";
-        assert_eq!(36, damerau_levenshtein(a, b));
-    }
-
-    #[test]
-    fn damerau_levenshtein_beginning_transposition() {
-        assert_eq!(1, damerau_levenshtein("foobar", "ofobar"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_end_transposition() {
-        assert_eq!(1, damerau_levenshtein("specter", "spectre"));
-    }
-
-    #[test]
-    fn damerau_levenshtein_unrestricted_edit() {
-        assert_eq!(3, damerau_levenshtein("a cat", "an abct"));
-    }
-
-    #[test]
-    fn normalized_damerau_levenshtein_diff_short() {
-        assert!((normalized_damerau_levenshtein("levenshtein", "löwenbräu") - 0.27272).abs() < 0.00001);
-    }
-
-    #[test]
-    fn normalized_damerau_levenshtein_for_empty_strings() {
-        assert!((normalized_damerau_levenshtein("", "") - 1.0).abs() < 0.00001);
-    }
-
-    #[test]
-    fn normalized_damerau_levenshtein_first_empty() {
-        assert!(normalized_damerau_levenshtein("", "flower").abs() < 0.00001);
-    }
-
-    #[test]
-    fn normalized_damerau_levenshtein_second_empty() {
-        assert!(normalized_damerau_levenshtein("tree", "").abs() < 0.00001);
-    }
-
-    #[test]
-    fn normalized_damerau_levenshtein_identical_strings() {
-        assert!((normalized_damerau_levenshtein("sunglasses", "sunglasses") - 1.0).abs() < 0.00001);
-    }
-}
diff --git a/third_party/rust/strsim/v0_8/crate/tests/lib.rs b/third_party/rust/strsim/v0_8/crate/tests/lib.rs
deleted file mode 100644
index ad7af51..0000000
--- a/third_party/rust/strsim/v0_8/crate/tests/lib.rs
+++ /dev/null
@@ -1,49 +0,0 @@
-extern crate strsim;
-
-use strsim::{hamming, levenshtein, normalized_levenshtein, osa_distance,damerau_levenshtein,
-             normalized_damerau_levenshtein, jaro, jaro_winkler};
-
-#[test]
-fn hamming_works() {
-    match hamming("hamming", "hammers") {
-        Ok(distance) => assert_eq!(3, distance),
-        Err(why) => panic!("{:?}", why)
-    }
-}
-
-#[test]
-fn levenshtein_works() {
-    assert_eq!(3, levenshtein("kitten", "sitting"));
-}
-
-#[test]
-fn normalized_levenshtein_works() {
-    assert!((normalized_levenshtein("kitten", "sitting") - 0.57142).abs() < 0.00001);
-}
-
-#[test]
-fn osa_distance_works() {
-    assert_eq!(3, osa_distance("ac", "cba"));
-}
-
-#[test]
-fn damerau_levenshtein_works() {
-    assert_eq!(2, damerau_levenshtein("ac", "cba"));
-}
-
-#[test]
-fn normalized_damerau_levenshtein_works() {
-    assert!((normalized_damerau_levenshtein("levenshtein", "löwenbräu") - 0.27272).abs() < 0.00001);
-}
-
-#[test]
-fn jaro_works() {
-    assert!((0.392 - jaro("Friedrich Nietzsche", "Jean-Paul Sartre")).abs() <
-            0.001);
-}
-
-#[test]
-fn jaro_winkler_works() {
-    assert!((0.911 - jaro_winkler("cheeseburger", "cheese fries")).abs() <
-            0.001);
-}
diff --git a/third_party/rust/textwrap/v0_11/BUILD.gn b/third_party/rust/textwrap/v0_11/BUILD.gn
deleted file mode 100644
index e57340b..0000000
--- a/third_party/rust/textwrap/v0_11/BUILD.gn
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2022 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/rust/cargo_crate.gni")
-
-cargo_crate("lib") {
-  crate_name = "textwrap"
-  epoch = "0.11"
-  crate_type = "rlib"
-
-  # Only for usage from third-party crates. Add the crate to
-  # third_party.toml to use it from first-party code.
-  visibility = [ "//third_party/rust/*" ]
-  crate_root = "crate/src/lib.rs"
-
-  # Unit tests skipped. Generate with --with-tests to include them.
-  build_native_rust_unit_tests = false
-  sources = [ "crate/src/lib.rs" ]
-  edition = "2015"
-  cargo_pkg_version = "0.11.0"
-  cargo_pkg_authors = "Martin Geisler <martin@geisler.net>"
-  cargo_pkg_name = "textwrap"
-  cargo_pkg_description = "Textwrap is a small library for word wrapping, indenting, anddedenting strings.You can use it to format strings (such as help and error messages) fordisplay in commandline applications. It is designed to be efficientand handle Unicode characters correctly."
-  deps = [ "//third_party/rust/unicode_width/v0_1:lib" ]
-}
diff --git a/third_party/rust/textwrap/v0_11/README.chromium b/third_party/rust/textwrap/v0_11/README.chromium
deleted file mode 100644
index cab27b16..0000000
--- a/third_party/rust/textwrap/v0_11/README.chromium
+++ /dev/null
@@ -1,12 +0,0 @@
-Name: textwrap
-URL: https://crates.io/crates/textwrap
-Description: Textwrap is a small library for word wrapping, indenting, and
-dedenting strings.
-
-You can use it to format strings (such as help and error messages) for
-display in commandline applications. It is designed to be efficient
-and handle Unicode characters correctly.
-
-Version: 0.11.0
-Security Critical: no
-License: MIT
diff --git a/third_party/rust/textwrap/v0_11/crate/.appveyor.yml b/third_party/rust/textwrap/v0_11/crate/.appveyor.yml
deleted file mode 100644
index 3555d73..0000000
--- a/third_party/rust/textwrap/v0_11/crate/.appveyor.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-environment:
-  matrix:
-  - TOOLCHAIN: stable
-  - TOOLCHAIN: nightly
-
-matrix:
-  allow_failures:
-    - TOOLCHAIN: nightly
-
-install:
-  - ps: Start-FileDownload 'https://static.rust-lang.org/rustup/dist/i686-pc-windows-gnu/rustup-init.exe'
-  - rustup-init.exe -y --default-toolchain %TOOLCHAIN%
-  - set PATH=%PATH%;%USERPROFILE%\.cargo\bin
-
-build_script:
-  - cargo build --verbose --all-features
-
-test_script:
-  - cargo test --verbose --all-features
-
-cache:
-  - '%USERPROFILE%\.cargo'
-  - target
diff --git a/third_party/rust/textwrap/v0_11/crate/.cargo_vcs_info.json b/third_party/rust/textwrap/v0_11/crate/.cargo_vcs_info.json
deleted file mode 100644
index 67bb225..0000000
--- a/third_party/rust/textwrap/v0_11/crate/.cargo_vcs_info.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "git": {
-    "sha1": "abcd618beae3f74841032aa5b53c1086b0a57ca2"
-  }
-}
diff --git a/third_party/rust/textwrap/v0_11/crate/.circleci/config.yml b/third_party/rust/textwrap/v0_11/crate/.circleci/config.yml
deleted file mode 100644
index 4f928a6c..0000000
--- a/third_party/rust/textwrap/v0_11/crate/.circleci/config.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-version: 2
-jobs:
-  build:
-    docker:
-      - image: xd009642/tarpaulin
-    steps:
-      - checkout
-      - run:
-          name: Generate coverage report
-          command: cargo tarpaulin --out Xml --all-features
-      - run:
-          name: Upload to codecov.io
-          command: bash <(curl -s https://codecov.io/bash) -Z -f cobertura.xml
diff --git a/third_party/rust/textwrap/v0_11/crate/.codecov.yml b/third_party/rust/textwrap/v0_11/crate/.codecov.yml
deleted file mode 100644
index a9b0bd2..0000000
--- a/third_party/rust/textwrap/v0_11/crate/.codecov.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-codecov:
-  # Do not wait for these CI providers since they will not upload any
-  # coverage reports.
-  ci:
-    - !appveyor
-    - !travis
-
-coverage:
-  status:
-    project:
-      default:
-        # Allow a 5% drop in overall project coverage on a PR.
-        threshold: 5%
diff --git a/third_party/rust/textwrap/v0_11/crate/.gitignore b/third_party/rust/textwrap/v0_11/crate/.gitignore
deleted file mode 100644
index 6513848c..0000000
--- a/third_party/rust/textwrap/v0_11/crate/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-Cargo.lock
-target/
-
-*~
-*.orig
diff --git a/third_party/rust/textwrap/v0_11/crate/.travis.yml b/third_party/rust/textwrap/v0_11/crate/.travis.yml
deleted file mode 100644
index 156418b..0000000
--- a/third_party/rust/textwrap/v0_11/crate/.travis.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-language: rust
-
-rust:
-  - stable
-  - beta
-  - nightly
-  - 1.22.0
-
-cache: cargo
-
-script:
-  - cargo build --verbose --all-features
-  - cargo test --verbose --all-features
-
-matrix:
-  allow_failures:
-    - rust: nightly
diff --git a/third_party/rust/textwrap/v0_11/crate/Cargo.toml b/third_party/rust/textwrap/v0_11/crate/Cargo.toml
deleted file mode 100644
index 4ec570f..0000000
--- a/third_party/rust/textwrap/v0_11/crate/Cargo.toml
+++ /dev/null
@@ -1,56 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g. crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-name = "textwrap"
-version = "0.11.0"
-authors = ["Martin Geisler <martin@geisler.net>"]
-exclude = [".dir-locals.el"]
-description = "Textwrap is a small library for word wrapping, indenting, and\ndedenting strings.\n\nYou can use it to format strings (such as help and error messages) for\ndisplay in commandline applications. It is designed to be efficient\nand handle Unicode characters correctly.\n"
-documentation = "https://docs.rs/textwrap/"
-readme = "README.md"
-keywords = ["text", "formatting", "wrap", "typesetting", "hyphenation"]
-categories = ["text-processing", "command-line-interface"]
-license = "MIT"
-repository = "https://github.com/mgeisler/textwrap"
-[package.metadata.docs.rs]
-all-features = true
-[dependencies.hyphenation]
-version = "0.7.1"
-features = ["embed_all"]
-optional = true
-
-[dependencies.term_size]
-version = "0.3.0"
-optional = true
-
-[dependencies.unicode-width]
-version = "0.1.3"
-[dev-dependencies.lipsum]
-version = "0.6"
-
-[dev-dependencies.rand]
-version = "0.6"
-
-[dev-dependencies.rand_xorshift]
-version = "0.1"
-
-[dev-dependencies.version-sync]
-version = "0.6"
-[badges.appveyor]
-repository = "mgeisler/textwrap"
-
-[badges.codecov]
-repository = "mgeisler/textwrap"
-
-[badges.travis-ci]
-repository = "mgeisler/textwrap"
diff --git a/third_party/rust/textwrap/v0_11/crate/LICENSE b/third_party/rust/textwrap/v0_11/crate/LICENSE
deleted file mode 100644
index 0d37ec3..0000000
--- a/third_party/rust/textwrap/v0_11/crate/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2016 Martin Geisler
-
-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/rust/textwrap/v0_11/crate/README.md b/third_party/rust/textwrap/v0_11/crate/README.md
deleted file mode 100644
index 23a5439..0000000
--- a/third_party/rust/textwrap/v0_11/crate/README.md
+++ /dev/null
@@ -1,337 +0,0 @@
-# Textwrap
-
-[![](https://img.shields.io/crates/v/textwrap.svg)][crates-io]
-[![](https://docs.rs/textwrap/badge.svg)][api-docs]
-[![](https://travis-ci.org/mgeisler/textwrap.svg?branch=master)][travis-ci]
-[![](https://ci.appveyor.com/api/projects/status/github/mgeisler/textwrap?branch=master&svg=true)][appveyor]
-[![](https://codecov.io/gh/mgeisler/textwrap/branch/master/graph/badge.svg)][codecov]
-
-Textwrap is a small Rust crate for word wrapping text. You can use it
-to format strings for display in commandline applications. The crate
-name and interface is inspired by
-the [Python textwrap module][py-textwrap].
-
-## Usage
-
-Add this to your `Cargo.toml`:
-```toml
-[dependencies]
-textwrap = "0.11"
-```
-
-and this to your crate root:
-```rust
-extern crate textwrap;
-```
-
-If you would like to have automatic hyphenation, specify the
-dependency as:
-```toml
-[dependencies]
-textwrap = { version = "0.11", features = ["hyphenation"] }
-```
-
-To conveniently wrap text at the current terminal width, enable the
-`term_size` feature:
-
-```toml
-[dependencies]
-textwrap = { version = "0.11", features = ["term_size"] }
-```
-
-## Documentation
-
-**[API documentation][api-docs]**
-
-## Getting Started
-
-Word wrapping single strings is easy using the `fill` function:
-```rust
-extern crate textwrap;
-use textwrap::fill;
-
-fn main() {
-    let text = "textwrap: a small library for wrapping text.";
-    println!("{}", fill(text, 18));
-}
-```
-The output is
-```
-textwrap: a small
-library for
-wrapping text.
-```
-
-With the `hyphenation` feature, you can get automatic hyphenation
-for [about 70 languages][patterns]. Your program must load and
-configure the hyphenation patterns to use:
-```rust
-extern crate hyphenation;
-extern crate textwrap;
-
-use hyphenation::{Language, Load, Standard};
-use textwrap::Wrapper;
-
-fn main() {
-    let hyphenator = Standard::from_embedded(Language::EnglishUS).unwrap();
-    let wrapper = Wrapper::with_splitter(18, hyphenator);
-    let text = "textwrap: a small library for wrapping text.";
-    println!("{}", wrapper.fill(text))
-}
-```
-
-The output now looks like this:
-```
-textwrap: a small
-library for wrap-
-ping text.
-```
-
-The hyphenation uses high-quality TeX hyphenation patterns.
-
-## Examples
-
-The library comes with some small example programs that shows various
-features.
-
-### Layout Example
-
-The `layout` example shows how a fixed example string is wrapped at
-different widths. Run the example with:
-
-```shell
-$ cargo run --features hyphenation --example layout
-```
-
-The program will use the following string:
-
-> Memory safety without garbage collection. Concurrency without data
-> races. Zero-cost abstractions.
-
-The string is wrapped at all widths between 15 and 60 columns. With
-narrow columns the output looks like this:
-
-```
-.--- Width: 15 ---.
-| Memory safety   |
-| without garbage |
-| collection.     |
-| Concurrency     |
-| without data    |
-| races. Zero-    |
-| cost abstrac-   |
-| tions.          |
-.--- Width: 16 ----.
-| Memory safety    |
-| without garbage  |
-| collection. Con- |
-| currency without |
-| data races. Ze-  |
-| ro-cost abstrac- |
-| tions.           |
-```
-
-Later, longer lines are used and the output now looks like this:
-
-```
-.-------------------- Width: 49 --------------------.
-| Memory safety without garbage collection. Concur- |
-| rency without data races. Zero-cost abstractions. |
-.---------------------- Width: 53 ----------------------.
-| Memory safety without garbage collection. Concurrency |
-| without data races. Zero-cost abstractions.           |
-.------------------------- Width: 59 -------------------------.
-| Memory safety without garbage collection. Concurrency with- |
-| out data races. Zero-cost abstractions.                     |
-```
-
-Notice how words are split at hyphens (such as "zero-cost") but also
-how words are hyphenated using automatic/machine hyphenation.
-
-### Terminal Width Example
-
-The `termwidth` example simply shows how the width can be set
-automatically to the current terminal width. Run it with this command:
-
-```
-$ cargo run --example termwidth
-```
-
-If you run it in a narrow terminal, you'll see output like this:
-```
-Formatted in within 60 columns:
-----
-Memory safety without garbage collection. Concurrency
-without data races. Zero-cost abstractions.
-----
-```
-
-If `stdout` is not connected to the terminal, the program will use a
-default of 80 columns for the width:
-
-```
-$ cargo run --example termwidth | cat
-Formatted in within 80 columns:
-----
-Memory safety without garbage collection. Concurrency without data races. Zero-
-cost abstractions.
-----
-```
-
-## Release History
-
-This section lists the largest changes per release.
-
-### Version 0.11.0 — December 9th, 2018
-
-Due to our dependencies bumping their minimum supported version of
-Rust, the minimum version of Rust we test against is now 1.22.0.
-
-* Merged [#141][issue-141]: Fix `dedent` handling of empty lines and
-  trailing newlines. Thanks @bbqsrc!
-* Fixed [#151][issue-151]: Release of version with hyphenation 0.7.
-
-### Version 0.10.0 — April 28th, 2018
-
-Due to our dependencies bumping their minimum supported version of
-Rust, the minimum version of Rust we test against is now 1.17.0.
-
-* Fixed [#99][issue-99]: Word broken even though it would fit on line.
-* Fixed [#107][issue-107]: Automatic hyphenation is off by one.
-* Fixed [#122][issue-122]: Take newlines into account when wrapping.
-* Fixed [#129][issue-129]: Panic on string with em-dash.
-
-### Version 0.9.0 — October 5th, 2017
-
-The dependency on `term_size` is now optional, and by default this
-feature is not enabled. This is a *breaking change* for users of
-`Wrapper::with_termwidth`. Enable the `term_size` feature to restore
-the old functionality.
-
-Added a regression test for the case where `width` is set to
-`usize::MAX`, thanks @Fraser999! All public structs now implement
-`Debug`, thanks @hcpl!
-
-* Fixed [#101][issue-101]: Make `term_size` an optional dependency.
-
-### Version 0.8.0 — September 4th, 2017
-
-The `Wrapper` stuct is now generic over the type of word splitter
-being used. This means less boxing and a nicer API. The
-`Wrapper::word_splitter` method has been removed. This is a *breaking
-API change* if you used the method to change the word splitter.
-
-The `Wrapper` struct has two new methods that will wrap the input text
-lazily: `Wrapper::wrap_iter` and `Wrapper::into_wrap_iter`. Use those
-if you will be iterating over the wrapped lines one by one.
-
-* Fixed [#59][issue-59]: `wrap` could return an iterator. Thanks
-  @hcpl!
-* Fixed [#81][issue-81]: Set `html_root_url`.
-
-### Version 0.7.0 — July 20th, 2017
-
-Version 0.7.0 changes the return type of `Wrapper::wrap` from
-`Vec<String>` to `Vec<Cow<'a, str>>`. This means that the output lines
-borrow data from the input string. This is a *breaking API change* if
-you relied on the exact return type of `Wrapper::wrap`. Callers of the
-`textwrap::fill` convenience function will see no breakage.
-
-The above change and other optimizations makes version 0.7.0 roughly
-15-30% faster than version 0.6.0.
-
-The `squeeze_whitespace` option has been removed since it was
-complicating the above optimization. Let us know if this option is
-important for you so we can provide a work around.
-
-* Fixed [#58][issue-58]: Add a "fast_wrap" function.
-* Fixed [#61][issue-61]: Documentation errors.
-
-### Version 0.6.0 — May 22nd, 2017
-
-Version 0.6.0 adds builder methods to `Wrapper` for easy one-line
-initialization and configuration:
-
-```rust
-let wrapper = Wrapper::new(60).break_words(false);
-```
-
-It also add a new `NoHyphenation` word splitter that will never split
-words, not even at existing hyphens.
-
-* Fixed [#28][issue-28]: Support not squeezing whitespace.
-
-### Version 0.5.0 — May 15th, 2017
-
-Version 0.5.0 has *breaking API changes*. However, this only affects
-code using the hyphenation feature. The feature is now optional, so
-you will first need to enable the `hyphenation` feature as described
-above. Afterwards, please change your code from
-```rust
-wrapper.corpus = Some(&corpus);
-```
-to
-```rust
-wrapper.splitter = Box::new(corpus);
-```
-
-Other changes include optimizations, so version 0.5.0 is roughly
-10-15% faster than version 0.4.0.
-
-* Fixed [#19][issue-19]: Add support for finding terminal size.
-* Fixed [#25][issue-25]: Handle words longer than `self.width`.
-* Fixed [#26][issue-26]: Support custom indentation.
-* Fixed [#36][issue-36]: Support building without `hyphenation`.
-* Fixed [#39][issue-39]: Respect non-breaking spaces.
-
-### Version 0.4.0 — January 24th, 2017
-
-Documented complexities and tested these via `cargo bench`.
-
-* Fixed [#13][issue-13]: Immediatedly add word if it fits.
-* Fixed [#14][issue-14]: Avoid splitting on initial hyphens.
-
-### Version 0.3.0 — January 7th, 2017
-
-Added support for automatic hyphenation.
-
-### Version 0.2.0 — December 28th, 2016
-
-Introduced `Wrapper` struct. Added support for wrapping on hyphens.
-
-### Version 0.1.0 — December 17th, 2016
-
-First public release with support for wrapping strings on whitespace.
-
-## License
-
-Textwrap can be distributed according to the [MIT license][mit].
-Contributions will be accepted under the same license.
-
-[crates-io]: https://crates.io/crates/textwrap
-[travis-ci]: https://travis-ci.org/mgeisler/textwrap
-[appveyor]: https://ci.appveyor.com/project/mgeisler/textwrap
-[codecov]: https://codecov.io/gh/mgeisler/textwrap
-[py-textwrap]: https://docs.python.org/library/textwrap
-[patterns]: https://github.com/tapeinosyne/hyphenation/tree/master/patterns-tex
-[api-docs]: https://docs.rs/textwrap/
-[issue-13]: https://github.com/mgeisler/textwrap/issues/13
-[issue-14]: https://github.com/mgeisler/textwrap/issues/14
-[issue-19]: https://github.com/mgeisler/textwrap/issues/19
-[issue-25]: https://github.com/mgeisler/textwrap/issues/25
-[issue-26]: https://github.com/mgeisler/textwrap/issues/26
-[issue-28]: https://github.com/mgeisler/textwrap/issues/28
-[issue-36]: https://github.com/mgeisler/textwrap/issues/36
-[issue-39]: https://github.com/mgeisler/textwrap/issues/39
-[issue-58]: https://github.com/mgeisler/textwrap/issues/58
-[issue-59]: https://github.com/mgeisler/textwrap/issues/59
-[issue-61]: https://github.com/mgeisler/textwrap/issues/61
-[issue-81]: https://github.com/mgeisler/textwrap/issues/81
-[issue-99]: https://github.com/mgeisler/textwrap/issues/99
-[issue-101]: https://github.com/mgeisler/textwrap/issues/101
-[issue-107]: https://github.com/mgeisler/textwrap/issues/107
-[issue-122]: https://github.com/mgeisler/textwrap/issues/122
-[issue-129]: https://github.com/mgeisler/textwrap/issues/129
-[issue-141]: https://github.com/mgeisler/textwrap/issues/141
-[issue-151]: https://github.com/mgeisler/textwrap/issues/151
-[mit]: LICENSE
diff --git a/third_party/rust/textwrap/v0_11/crate/benches/linear.rs b/third_party/rust/textwrap/v0_11/crate/benches/linear.rs
deleted file mode 100644
index 104398a..0000000
--- a/third_party/rust/textwrap/v0_11/crate/benches/linear.rs
+++ /dev/null
@@ -1,122 +0,0 @@
-#![feature(test)]
-
-// The benchmarks here verify that the complexity grows as O(*n*)
-// where *n* is the number of characters in the text to be wrapped.
-
-#[cfg(feature = "hyphenation")]
-extern crate hyphenation;
-extern crate lipsum;
-extern crate rand;
-extern crate rand_xorshift;
-extern crate test;
-extern crate textwrap;
-
-#[cfg(feature = "hyphenation")]
-use hyphenation::{Language, Load, Standard};
-use lipsum::MarkovChain;
-use rand::SeedableRng;
-use rand_xorshift::XorShiftRng;
-use test::Bencher;
-#[cfg(feature = "hyphenation")]
-use textwrap::Wrapper;
-
-const LINE_LENGTH: usize = 60;
-
-/// Generate a lorem ipsum text with the given number of characters.
-fn lorem_ipsum(length: usize) -> String {
-    // The average word length in the lorem ipsum text is somewhere
-    // between 6 and 7. So we conservatively divide by 5 to have a
-    // long enough text that we can truncate below.
-    let rng = XorShiftRng::seed_from_u64(0);
-    let mut chain = MarkovChain::new_with_rng(rng);
-    chain.learn(lipsum::LOREM_IPSUM);
-    chain.learn(lipsum::LIBER_PRIMUS);
-
-    let mut text = chain.generate_from(length / 5, ("Lorem", "ipsum"));
-    text.truncate(length);
-    text
-}
-
-#[bench]
-fn fill_100(b: &mut Bencher) {
-    let text = &lorem_ipsum(100);
-    b.iter(|| textwrap::fill(text, LINE_LENGTH))
-}
-
-#[bench]
-fn fill_200(b: &mut Bencher) {
-    let text = &lorem_ipsum(200);
-    b.iter(|| textwrap::fill(text, LINE_LENGTH))
-}
-
-#[bench]
-fn fill_400(b: &mut Bencher) {
-    let text = &lorem_ipsum(400);
-    b.iter(|| textwrap::fill(text, LINE_LENGTH))
-}
-
-#[bench]
-fn fill_800(b: &mut Bencher) {
-    let text = &lorem_ipsum(800);
-    b.iter(|| textwrap::fill(text, LINE_LENGTH))
-}
-
-#[bench]
-fn wrap_100(b: &mut Bencher) {
-    let text = &lorem_ipsum(100);
-    b.iter(|| textwrap::wrap(text, LINE_LENGTH))
-}
-
-#[bench]
-fn wrap_200(b: &mut Bencher) {
-    let text = &lorem_ipsum(200);
-    b.iter(|| textwrap::wrap(text, LINE_LENGTH))
-}
-
-#[bench]
-fn wrap_400(b: &mut Bencher) {
-    let text = &lorem_ipsum(400);
-    b.iter(|| textwrap::wrap(text, LINE_LENGTH))
-}
-
-#[bench]
-fn wrap_800(b: &mut Bencher) {
-    let text = &lorem_ipsum(800);
-    b.iter(|| textwrap::wrap(text, LINE_LENGTH))
-}
-
-#[bench]
-#[cfg(feature = "hyphenation")]
-fn hyphenation_fill_100(b: &mut Bencher) {
-    let text = &lorem_ipsum(100);
-    let dictionary = Standard::from_embedded(Language::Latin).unwrap();
-    let wrapper = Wrapper::with_splitter(LINE_LENGTH, dictionary);
-    b.iter(|| wrapper.fill(text))
-}
-
-#[bench]
-#[cfg(feature = "hyphenation")]
-fn hyphenation_fill_200(b: &mut Bencher) {
-    let text = &lorem_ipsum(200);
-    let dictionary = Standard::from_embedded(Language::Latin).unwrap();
-    let wrapper = Wrapper::with_splitter(LINE_LENGTH, dictionary);
-    b.iter(|| wrapper.fill(text))
-}
-
-#[bench]
-#[cfg(feature = "hyphenation")]
-fn hyphenation_fill_400(b: &mut Bencher) {
-    let text = &lorem_ipsum(400);
-    let dictionary = Standard::from_embedded(Language::Latin).unwrap();
-    let wrapper = Wrapper::with_splitter(LINE_LENGTH, dictionary);
-    b.iter(|| wrapper.fill(text))
-}
-
-#[bench]
-#[cfg(feature = "hyphenation")]
-fn hyphenation_fill_800(b: &mut Bencher) {
-    let text = &lorem_ipsum(800);
-    let dictionary = Standard::from_embedded(Language::Latin).unwrap();
-    let wrapper = Wrapper::with_splitter(LINE_LENGTH, dictionary);
-    b.iter(|| wrapper.fill(text))
-}
diff --git a/third_party/rust/textwrap/v0_11/crate/examples/layout.rs b/third_party/rust/textwrap/v0_11/crate/examples/layout.rs
deleted file mode 100644
index d36cb3a..0000000
--- a/third_party/rust/textwrap/v0_11/crate/examples/layout.rs
+++ /dev/null
@@ -1,38 +0,0 @@
-#[cfg(feature = "hyphenation")]
-extern crate hyphenation;
-extern crate textwrap;
-
-#[cfg(feature = "hyphenation")]
-use hyphenation::{Language, Load};
-use textwrap::Wrapper;
-
-#[cfg(not(feature = "hyphenation"))]
-fn new_wrapper<'a>() -> Wrapper<'a, textwrap::HyphenSplitter> {
-    Wrapper::new(0)
-}
-
-#[cfg(feature = "hyphenation")]
-fn new_wrapper<'a>() -> Wrapper<'a, hyphenation::Standard> {
-    let dictionary = hyphenation::Standard::from_embedded(Language::EnglishUS).unwrap();
-    Wrapper::with_splitter(0, dictionary)
-}
-
-fn main() {
-    let example = "Memory safety without garbage collection. \
-                   Concurrency without data races. \
-                   Zero-cost abstractions.";
-    let mut prev_lines = vec![];
-    let mut wrapper = new_wrapper();
-    for width in 15..60 {
-        wrapper.width = width;
-        let lines = wrapper.wrap(example);
-        if lines != prev_lines {
-            let title = format!(" Width: {} ", width);
-            println!(".{:-^1$}.", title, width + 2);
-            for line in &lines {
-                println!("| {:1$} |", line, width);
-            }
-            prev_lines = lines;
-        }
-    }
-}
diff --git a/third_party/rust/textwrap/v0_11/crate/examples/termwidth.rs b/third_party/rust/textwrap/v0_11/crate/examples/termwidth.rs
deleted file mode 100644
index 75db3aa..0000000
--- a/third_party/rust/textwrap/v0_11/crate/examples/termwidth.rs
+++ /dev/null
@@ -1,41 +0,0 @@
-#[cfg(feature = "hyphenation")]
-extern crate hyphenation;
-extern crate textwrap;
-
-#[cfg(feature = "hyphenation")]
-use hyphenation::{Language, Load, Standard};
-#[cfg(feature = "term_size")]
-use textwrap::Wrapper;
-
-#[cfg(not(feature = "term_size"))]
-fn main() {
-    println!("Please enable the term_size feature to run this example.");
-}
-
-#[cfg(feature = "term_size")]
-fn main() {
-    #[cfg(not(feature = "hyphenation"))]
-    fn new_wrapper<'a>() -> (&'static str, Wrapper<'a, textwrap::HyphenSplitter>) {
-        ("without hyphenation", Wrapper::with_termwidth())
-    }
-
-    #[cfg(feature = "hyphenation")]
-    fn new_wrapper<'a>() -> (&'static str, Wrapper<'a, Standard>) {
-        let dictionary = Standard::from_embedded(Language::EnglishUS).unwrap();
-        (
-            "with hyphenation",
-            Wrapper::with_splitter(textwrap::termwidth(), dictionary),
-        )
-    }
-
-    let example = "Memory safety without garbage collection. \
-                   Concurrency without data races. \
-                   Zero-cost abstractions.";
-    // Create a new Wrapper -- automatically set the width to the
-    // current terminal width.
-    let (msg, wrapper) = new_wrapper();
-    println!("Formatted {} in {} columns:", msg, wrapper.width);
-    println!("----");
-    println!("{}", wrapper.fill(example));
-    println!("----");
-}
diff --git a/third_party/rust/textwrap/v0_11/crate/src/indentation.rs b/third_party/rust/textwrap/v0_11/crate/src/indentation.rs
deleted file mode 100644
index 276ba105..0000000
--- a/third_party/rust/textwrap/v0_11/crate/src/indentation.rs
+++ /dev/null
@@ -1,294 +0,0 @@
-//! Functions related to adding and removing indentation from lines of
-//! text.
-//!
-//! The functions here can be used to uniformly indent or dedent
-//! (unindent) word wrapped lines of text.
-
-/// Add prefix to each non-empty line.
-///
-/// ```
-/// use textwrap::indent;
-///
-/// assert_eq!(indent("
-/// Foo
-/// Bar
-/// ", "  "), "
-///   Foo
-///   Bar
-/// ");
-/// ```
-///
-/// Empty lines (lines consisting only of whitespace) are not indented
-/// and the whitespace is replaced by a single newline (`\n`):
-///
-/// ```
-/// use textwrap::indent;
-///
-/// assert_eq!(indent("
-/// Foo
-///
-/// Bar
-///   \t
-/// Baz
-/// ", "->"), "
-/// ->Foo
-///
-/// ->Bar
-///
-/// ->Baz
-/// ");
-/// ```
-///
-/// Leading and trailing whitespace on non-empty lines is kept
-/// unchanged:
-///
-/// ```
-/// use textwrap::indent;
-///
-/// assert_eq!(indent(" \t  Foo   ", "->"), "-> \t  Foo   \n");
-/// ```
-pub fn indent(s: &str, prefix: &str) -> String {
-    let mut result = String::new();
-    for line in s.lines() {
-        if line.chars().any(|c| !c.is_whitespace()) {
-            result.push_str(prefix);
-            result.push_str(line);
-        }
-        result.push('\n');
-    }
-    result
-}
-
-/// Removes common leading whitespace from each line.
-///
-/// This function will look at each non-empty line and determine the
-/// maximum amount of whitespace that can be removed from all lines:
-///
-/// ```
-/// use textwrap::dedent;
-///
-/// assert_eq!(dedent("
-///     1st line
-///       2nd line
-///     3rd line
-/// "), "
-/// 1st line
-///   2nd line
-/// 3rd line
-/// ");
-/// ```
-pub fn dedent(s: &str) -> String {
-    let mut prefix = "";
-    let mut lines = s.lines();
-
-    // We first search for a non-empty line to find a prefix.
-    for line in &mut lines {
-        let mut whitespace_idx = line.len();
-        for (idx, ch) in line.char_indices() {
-            if !ch.is_whitespace() {
-                whitespace_idx = idx;
-                break;
-            }
-        }
-
-        // Check if the line had anything but whitespace
-        if whitespace_idx < line.len() {
-            prefix = &line[..whitespace_idx];
-            break;
-        }
-    }
-
-    // We then continue looking through the remaining lines to
-    // possibly shorten the prefix.
-    for line in &mut lines {
-        let mut whitespace_idx = line.len();
-        for ((idx, a), b) in line.char_indices().zip(prefix.chars()) {
-            if a != b {
-                whitespace_idx = idx;
-                break;
-            }
-        }
-
-        // Check if the line had anything but whitespace and if we
-        // have found a shorter prefix
-        if whitespace_idx < line.len() && whitespace_idx < prefix.len() {
-            prefix = &line[..whitespace_idx];
-        }
-    }
-
-    // We now go over the lines a second time to build the result.
-    let mut result = String::new();
-    for line in s.lines() {
-        if line.starts_with(&prefix) && line.chars().any(|c| !c.is_whitespace()) {
-            let (_, tail) = line.split_at(prefix.len());
-            result.push_str(tail);
-        }
-        result.push('\n');
-    }
-
-    if result.ends_with('\n') && !s.ends_with('\n') {
-        let new_len = result.len() - 1;
-        result.truncate(new_len);
-    }
-
-    result
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    /// Add newlines. Ensures that the final line in the vector also
-    /// has a newline.
-    fn add_nl(lines: &[&str]) -> String {
-        lines.join("\n") + "\n"
-    }
-
-    #[test]
-    fn indent_empty() {
-        assert_eq!(indent("\n", "  "), "\n");
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn indent_nonempty() {
-        let x = vec!["  foo",
-                     "bar",
-                     "  baz"];
-        let y = vec!["//  foo",
-                     "//bar",
-                     "//  baz"];
-        assert_eq!(indent(&add_nl(&x), "//"), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn indent_empty_line() {
-        let x = vec!["  foo",
-                     "bar",
-                     "",
-                     "  baz"];
-        let y = vec!["//  foo",
-                     "//bar",
-                     "",
-                     "//  baz"];
-        assert_eq!(indent(&add_nl(&x), "//"), add_nl(&y));
-    }
-
-    #[test]
-    fn dedent_empty() {
-        assert_eq!(dedent(""), "");
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn dedent_multi_line() {
-        let x = vec!["    foo",
-                     "  bar",
-                     "    baz"];
-        let y = vec!["  foo",
-                     "bar",
-                     "  baz"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn dedent_empty_line() {
-        let x = vec!["    foo",
-                     "  bar",
-                     "   ",
-                     "    baz"];
-        let y = vec!["  foo",
-                     "bar",
-                     "",
-                     "  baz"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn dedent_blank_line() {
-        let x = vec!["      foo",
-                     "",
-                     "        bar",
-                     "          foo",
-                     "          bar",
-                     "          baz"];
-        let y = vec!["foo",
-                     "",
-                     "  bar",
-                     "    foo",
-                     "    bar",
-                     "    baz"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn dedent_whitespace_line() {
-        let x = vec!["      foo",
-                     " ",
-                     "        bar",
-                     "          foo",
-                     "          bar",
-                     "          baz"];
-        let y = vec!["foo",
-                     "",
-                     "  bar",
-                     "    foo",
-                     "    bar",
-                     "    baz"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn dedent_mixed_whitespace() {
-        let x = vec!["\tfoo",
-                     "  bar"];
-        let y = vec!["\tfoo",
-                     "  bar"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn dedent_tabbed_whitespace() {
-        let x = vec!["\t\tfoo",
-                     "\t\t\tbar"];
-        let y = vec!["foo",
-                     "\tbar"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn dedent_mixed_tabbed_whitespace() {
-        let x = vec!["\t  \tfoo",
-                     "\t  \t\tbar"];
-        let y = vec!["foo",
-                     "\tbar"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn dedent_mixed_tabbed_whitespace2() {
-        let x = vec!["\t  \tfoo",
-                     "\t    \tbar"];
-        let y = vec!["\tfoo",
-                     "  \tbar"];
-        assert_eq!(dedent(&add_nl(&x)), add_nl(&y));
-    }
-
-    #[test]
-    #[cfg_attr(rustfmt, rustfmt_skip)]
-    fn dedent_preserve_no_terminating_newline() {
-        let x = vec!["  foo",
-                     "    bar"].join("\n");
-        let y = vec!["foo",
-                     "  bar"].join("\n");
-        assert_eq!(dedent(&x), y);
-    }
-}
diff --git a/third_party/rust/textwrap/v0_11/crate/src/lib.rs b/third_party/rust/textwrap/v0_11/crate/src/lib.rs
deleted file mode 100644
index 2f82325..0000000
--- a/third_party/rust/textwrap/v0_11/crate/src/lib.rs
+++ /dev/null
@@ -1,987 +0,0 @@
-//! `textwrap` provides functions for word wrapping and filling text.
-//!
-//! Wrapping text can be very useful in commandline programs where you
-//! want to format dynamic output nicely so it looks good in a
-//! terminal. A quick example:
-//!
-//! ```no_run
-//! extern crate textwrap;
-//! use textwrap::fill;
-//!
-//! fn main() {
-//!     let text = "textwrap: a small library for wrapping text.";
-//!     println!("{}", fill(text, 18));
-//! }
-//! ```
-//!
-//! This will display the following output:
-//!
-//! ```text
-//! textwrap: a small
-//! library for
-//! wrapping text.
-//! ```
-//!
-//! # Displayed Width vs Byte Size
-//!
-//! To word wrap text, one must know the width of each word so one can
-//! know when to break lines. This library measures the width of text
-//! using the [displayed width][unicode-width], not the size in bytes.
-//!
-//! This is important for non-ASCII text. ASCII characters such as `a`
-//! and `!` are simple and take up one column each. This means that
-//! the displayed width is equal to the string length in bytes.
-//! However, non-ASCII characters and symbols take up more than one
-//! byte when UTF-8 encoded: `é` is `0xc3 0xa9` (two bytes) and `⚙` is
-//! `0xe2 0x9a 0x99` (three bytes) in UTF-8, respectively.
-//!
-//! This is why we take care to use the displayed width instead of the
-//! byte count when computing line lengths. All functions in this
-//! library handle Unicode characters like this.
-//!
-//! [unicode-width]: https://docs.rs/unicode-width/
-
-#![doc(html_root_url = "https://docs.rs/textwrap/0.11.0")]
-#![deny(missing_docs)]
-#![deny(missing_debug_implementations)]
-
-#[cfg(feature = "hyphenation")]
-extern crate hyphenation;
-#[cfg(feature = "term_size")]
-extern crate term_size;
-extern crate unicode_width;
-
-use std::borrow::Cow;
-use std::str::CharIndices;
-
-use unicode_width::UnicodeWidthChar;
-use unicode_width::UnicodeWidthStr;
-
-/// A non-breaking space.
-const NBSP: char = '\u{a0}';
-
-mod indentation;
-pub use indentation::dedent;
-pub use indentation::indent;
-
-mod splitting;
-pub use splitting::{HyphenSplitter, NoHyphenation, WordSplitter};
-
-/// A Wrapper holds settings for wrapping and filling text. Use it
-/// when the convenience [`wrap_iter`], [`wrap`] and [`fill`] functions
-/// are not flexible enough.
-///
-/// [`wrap_iter`]: fn.wrap_iter.html
-/// [`wrap`]: fn.wrap.html
-/// [`fill`]: fn.fill.html
-///
-/// The algorithm used by the `WrapIter` iterator (returned from the
-/// `wrap_iter` method)  works by doing successive partial scans over
-/// words in the input string (where each single scan yields a single
-/// line) so that the overall time and memory complexity is O(*n*) where
-/// *n* is the length of the input string.
-#[derive(Clone, Debug)]
-pub struct Wrapper<'a, S: WordSplitter> {
-    /// The width in columns at which the text will be wrapped.
-    pub width: usize,
-    /// Indentation used for the first line of output.
-    pub initial_indent: &'a str,
-    /// Indentation used for subsequent lines of output.
-    pub subsequent_indent: &'a str,
-    /// Allow long words to be broken if they cannot fit on a line.
-    /// When set to `false`, some lines may be longer than
-    /// `self.width`.
-    pub break_words: bool,
-    /// The method for splitting words. If the `hyphenation` feature
-    /// is enabled, you can use a `hyphenation::Standard` dictionary
-    /// here to get language-aware hyphenation.
-    pub splitter: S,
-}
-
-impl<'a> Wrapper<'a, HyphenSplitter> {
-    /// Create a new Wrapper for wrapping at the specified width. By
-    /// default, we allow words longer than `width` to be broken. A
-    /// [`HyphenSplitter`] will be used by default for splitting
-    /// words. See the [`WordSplitter`] trait for other options.
-    ///
-    /// [`HyphenSplitter`]: struct.HyphenSplitter.html
-    /// [`WordSplitter`]: trait.WordSplitter.html
-    pub fn new(width: usize) -> Wrapper<'a, HyphenSplitter> {
-        Wrapper::with_splitter(width, HyphenSplitter)
-    }
-
-    /// Create a new Wrapper for wrapping text at the current terminal
-    /// width. If the terminal width cannot be determined (typically
-    /// because the standard input and output is not connected to a
-    /// terminal), a width of 80 characters will be used. Other
-    /// settings use the same defaults as `Wrapper::new`.
-    ///
-    /// Equivalent to:
-    ///
-    /// ```no_run
-    /// # #![allow(unused_variables)]
-    /// use textwrap::{Wrapper, termwidth};
-    ///
-    /// let wrapper = Wrapper::new(termwidth());
-    /// ```
-    #[cfg(feature = "term_size")]
-    pub fn with_termwidth() -> Wrapper<'a, HyphenSplitter> {
-        Wrapper::new(termwidth())
-    }
-}
-
-impl<'a, S: WordSplitter> Wrapper<'a, S> {
-    /// Use the given [`WordSplitter`] to create a new Wrapper for
-    /// wrapping at the specified width. By default, we allow words
-    /// longer than `width` to be broken.
-    ///
-    /// [`WordSplitter`]: trait.WordSplitter.html
-    pub fn with_splitter(width: usize, splitter: S) -> Wrapper<'a, S> {
-        Wrapper {
-            width: width,
-            initial_indent: "",
-            subsequent_indent: "",
-            break_words: true,
-            splitter: splitter,
-        }
-    }
-
-    /// Change [`self.initial_indent`]. The initial indentation is
-    /// used on the very first line of output.
-    ///
-    /// # Examples
-    ///
-    /// Classic paragraph indentation can be achieved by specifying an
-    /// initial indentation and wrapping each paragraph by itself:
-    ///
-    /// ```no_run
-    /// # #![allow(unused_variables)]
-    /// use textwrap::Wrapper;
-    ///
-    /// let wrapper = Wrapper::new(15).initial_indent("    ");
-    /// ```
-    ///
-    /// [`self.initial_indent`]: #structfield.initial_indent
-    pub fn initial_indent(self, indent: &'a str) -> Wrapper<'a, S> {
-        Wrapper {
-            initial_indent: indent,
-            ..self
-        }
-    }
-
-    /// Change [`self.subsequent_indent`]. The subsequent indentation
-    /// is used on lines following the first line of output.
-    ///
-    /// # Examples
-    ///
-    /// Combining initial and subsequent indentation lets you format a
-    /// single paragraph as a bullet list:
-    ///
-    /// ```no_run
-    /// # #![allow(unused_variables)]
-    /// use textwrap::Wrapper;
-    ///
-    /// let wrapper = Wrapper::new(15)
-    ///     .initial_indent("* ")
-    ///     .subsequent_indent("  ");
-    /// ```
-    ///
-    /// [`self.subsequent_indent`]: #structfield.subsequent_indent
-    pub fn subsequent_indent(self, indent: &'a str) -> Wrapper<'a, S> {
-        Wrapper {
-            subsequent_indent: indent,
-            ..self
-        }
-    }
-
-    /// Change [`self.break_words`]. This controls if words longer
-    /// than `self.width` can be broken, or if they will be left
-    /// sticking out into the right margin.
-    ///
-    /// [`self.break_words`]: #structfield.break_words
-    pub fn break_words(self, setting: bool) -> Wrapper<'a, S> {
-        Wrapper {
-            break_words: setting,
-            ..self
-        }
-    }
-
-    /// Fill a line of text at `self.width` characters. Strings are
-    /// wrapped based on their displayed width, not their size in
-    /// bytes.
-    ///
-    /// The result is a string with newlines between each line. Use
-    /// the `wrap` method if you need access to the individual lines.
-    ///
-    /// # Complexities
-    ///
-    /// This method simply joins the lines produced by `wrap_iter`. As
-    /// such, it inherits the O(*n*) time and memory complexity where
-    /// *n* is the input string length.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use textwrap::Wrapper;
-    ///
-    /// let wrapper = Wrapper::new(15);
-    /// assert_eq!(wrapper.fill("Memory safety without garbage collection."),
-    ///            "Memory safety\nwithout garbage\ncollection.");
-    /// ```
-    pub fn fill(&self, s: &str) -> String {
-        // This will avoid reallocation in simple cases (no
-        // indentation, no hyphenation).
-        let mut result = String::with_capacity(s.len());
-
-        for (i, line) in self.wrap_iter(s).enumerate() {
-            if i > 0 {
-                result.push('\n');
-            }
-            result.push_str(&line);
-        }
-
-        result
-    }
-
-    /// Wrap a line of text at `self.width` characters. Strings are
-    /// wrapped based on their displayed width, not their size in
-    /// bytes.
-    ///
-    /// # Complexities
-    ///
-    /// This method simply collects the lines produced by `wrap_iter`.
-    /// As such, it inherits the O(*n*) overall time and memory
-    /// complexity where *n* is the input string length.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use textwrap::Wrapper;
-    ///
-    /// let wrap15 = Wrapper::new(15);
-    /// assert_eq!(wrap15.wrap("Concurrency without data races."),
-    ///            vec!["Concurrency",
-    ///                 "without data",
-    ///                 "races."]);
-    ///
-    /// let wrap20 = Wrapper::new(20);
-    /// assert_eq!(wrap20.wrap("Concurrency without data races."),
-    ///            vec!["Concurrency without",
-    ///                 "data races."]);
-    /// ```
-    ///
-    /// Notice that newlines in the input are preserved. This means
-    /// that they force a line break, regardless of how long the
-    /// current line is:
-    ///
-    /// ```
-    /// use textwrap::Wrapper;
-    ///
-    /// let wrapper = Wrapper::new(40);
-    /// assert_eq!(wrapper.wrap("First line.\nSecond line."),
-    ///            vec!["First line.", "Second line."]);
-    /// ```
-    ///
-    pub fn wrap(&self, s: &'a str) -> Vec<Cow<'a, str>> {
-        self.wrap_iter(s).collect::<Vec<_>>()
-    }
-
-    /// Lazily wrap a line of text at `self.width` characters. Strings
-    /// are wrapped based on their displayed width, not their size in
-    /// bytes.
-    ///
-    /// The [`WordSplitter`] stored in [`self.splitter`] is used
-    /// whenever when a word is too large to fit on the current line.
-    /// By changing the field, different hyphenation strategies can be
-    /// implemented.
-    ///
-    /// # Complexities
-    ///
-    /// This method returns a [`WrapIter`] iterator which borrows this
-    /// `Wrapper`. The algorithm used has a linear complexity, so
-    /// getting the next line from the iterator will take O(*w*) time,
-    /// where *w* is the wrapping width. Fully processing the iterator
-    /// will take O(*n*) time for an input string of length *n*.
-    ///
-    /// When no indentation is used, each line returned is a slice of
-    /// the input string and the memory overhead is thus constant.
-    /// Otherwise new memory is allocated for each line returned.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use std::borrow::Cow;
-    /// use textwrap::Wrapper;
-    ///
-    /// let wrap20 = Wrapper::new(20);
-    /// let mut wrap20_iter = wrap20.wrap_iter("Zero-cost abstractions.");
-    /// assert_eq!(wrap20_iter.next(), Some(Cow::from("Zero-cost")));
-    /// assert_eq!(wrap20_iter.next(), Some(Cow::from("abstractions.")));
-    /// assert_eq!(wrap20_iter.next(), None);
-    ///
-    /// let wrap25 = Wrapper::new(25);
-    /// let mut wrap25_iter = wrap25.wrap_iter("Zero-cost abstractions.");
-    /// assert_eq!(wrap25_iter.next(), Some(Cow::from("Zero-cost abstractions.")));
-    /// assert_eq!(wrap25_iter.next(), None);
-    /// ```
-    ///
-    /// [`self.splitter`]: #structfield.splitter
-    /// [`WordSplitter`]: trait.WordSplitter.html
-    /// [`WrapIter`]: struct.WrapIter.html
-    pub fn wrap_iter<'w>(&'w self, s: &'a str) -> WrapIter<'w, 'a, S> {
-        WrapIter {
-            wrapper: self,
-            inner: WrapIterImpl::new(self, s),
-        }
-    }
-
-    /// Lazily wrap a line of text at `self.width` characters. Strings
-    /// are wrapped based on their displayed width, not their size in
-    /// bytes.
-    ///
-    /// The [`WordSplitter`] stored in [`self.splitter`] is used
-    /// whenever when a word is too large to fit on the current line.
-    /// By changing the field, different hyphenation strategies can be
-    /// implemented.
-    ///
-    /// # Complexities
-    ///
-    /// This method consumes the `Wrapper` and returns a
-    /// [`IntoWrapIter`] iterator. Fully processing the iterator has
-    /// the same O(*n*) time complexity as [`wrap_iter`], where *n* is
-    /// the length of the input string.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use std::borrow::Cow;
-    /// use textwrap::Wrapper;
-    ///
-    /// let wrap20 = Wrapper::new(20);
-    /// let mut wrap20_iter = wrap20.into_wrap_iter("Zero-cost abstractions.");
-    /// assert_eq!(wrap20_iter.next(), Some(Cow::from("Zero-cost")));
-    /// assert_eq!(wrap20_iter.next(), Some(Cow::from("abstractions.")));
-    /// assert_eq!(wrap20_iter.next(), None);
-    /// ```
-    ///
-    /// [`self.splitter`]: #structfield.splitter
-    /// [`WordSplitter`]: trait.WordSplitter.html
-    /// [`IntoWrapIter`]: struct.IntoWrapIter.html
-    /// [`wrap_iter`]: #method.wrap_iter
-    pub fn into_wrap_iter(self, s: &'a str) -> IntoWrapIter<'a, S> {
-        let inner = WrapIterImpl::new(&self, s);
-
-        IntoWrapIter {
-            wrapper: self,
-            inner: inner,
-        }
-    }
-}
-
-/// An iterator over the lines of the input string which owns a
-/// `Wrapper`. An instance of `IntoWrapIter` is typically obtained
-/// through either [`wrap_iter`] or [`Wrapper::into_wrap_iter`].
-///
-/// Each call of `.next()` method yields a line wrapped in `Some` if the
-/// input hasn't been fully processed yet. Otherwise it returns `None`.
-///
-/// [`wrap_iter`]: fn.wrap_iter.html
-/// [`Wrapper::into_wrap_iter`]: struct.Wrapper.html#method.into_wrap_iter
-#[derive(Debug)]
-pub struct IntoWrapIter<'a, S: WordSplitter> {
-    wrapper: Wrapper<'a, S>,
-    inner: WrapIterImpl<'a>,
-}
-
-impl<'a, S: WordSplitter> Iterator for IntoWrapIter<'a, S> {
-    type Item = Cow<'a, str>;
-
-    fn next(&mut self) -> Option<Cow<'a, str>> {
-        self.inner.next(&self.wrapper)
-    }
-}
-
-/// An iterator over the lines of the input string which borrows a
-/// `Wrapper`. An instance of `WrapIter` is typically obtained
-/// through the [`Wrapper::wrap_iter`] method.
-///
-/// Each call of `.next()` method yields a line wrapped in `Some` if the
-/// input hasn't been fully processed yet. Otherwise it returns `None`.
-///
-/// [`Wrapper::wrap_iter`]: struct.Wrapper.html#method.wrap_iter
-#[derive(Debug)]
-pub struct WrapIter<'w, 'a: 'w, S: WordSplitter + 'w> {
-    wrapper: &'w Wrapper<'a, S>,
-    inner: WrapIterImpl<'a>,
-}
-
-impl<'w, 'a: 'w, S: WordSplitter> Iterator for WrapIter<'w, 'a, S> {
-    type Item = Cow<'a, str>;
-
-    fn next(&mut self) -> Option<Cow<'a, str>> {
-        self.inner.next(self.wrapper)
-    }
-}
-
-/// Like `char::is_whitespace`, but non-breaking spaces don't count.
-#[inline]
-fn is_whitespace(ch: char) -> bool {
-    ch.is_whitespace() && ch != NBSP
-}
-
-/// Common implementation details for `WrapIter` and `IntoWrapIter`.
-#[derive(Debug)]
-struct WrapIterImpl<'a> {
-    // String to wrap.
-    source: &'a str,
-    // CharIndices iterator over self.source.
-    char_indices: CharIndices<'a>,
-    // Byte index where the current line starts.
-    start: usize,
-    // Byte index of the last place where the string can be split.
-    split: usize,
-    // Size in bytes of the character at self.source[self.split].
-    split_len: usize,
-    // Width of self.source[self.start..idx].
-    line_width: usize,
-    // Width of self.source[self.start..self.split].
-    line_width_at_split: usize,
-    // Tracking runs of whitespace characters.
-    in_whitespace: bool,
-    // Has iterator finished producing elements?
-    finished: bool,
-}
-
-impl<'a> WrapIterImpl<'a> {
-    fn new<S: WordSplitter>(wrapper: &Wrapper<'a, S>, s: &'a str) -> WrapIterImpl<'a> {
-        WrapIterImpl {
-            source: s,
-            char_indices: s.char_indices(),
-            start: 0,
-            split: 0,
-            split_len: 0,
-            line_width: wrapper.initial_indent.width(),
-            line_width_at_split: wrapper.initial_indent.width(),
-            in_whitespace: false,
-            finished: false,
-        }
-    }
-
-    fn create_result_line<S: WordSplitter>(&self, wrapper: &Wrapper<'a, S>) -> Cow<'a, str> {
-        if self.start == 0 {
-            Cow::from(wrapper.initial_indent)
-        } else {
-            Cow::from(wrapper.subsequent_indent)
-        }
-    }
-
-    fn next<S: WordSplitter>(&mut self, wrapper: &Wrapper<'a, S>) -> Option<Cow<'a, str>> {
-        if self.finished {
-            return None;
-        }
-
-        while let Some((idx, ch)) = self.char_indices.next() {
-            let char_width = ch.width().unwrap_or(0);
-            let char_len = ch.len_utf8();
-
-            if ch == '\n' {
-                self.split = idx;
-                self.split_len = char_len;
-                self.line_width_at_split = self.line_width;
-                self.in_whitespace = false;
-
-                // If this is not the final line, return the current line. Otherwise,
-                // we will return the line with its line break after exiting the loop
-                if self.split + self.split_len < self.source.len() {
-                    let mut line = self.create_result_line(wrapper);
-                    line += &self.source[self.start..self.split];
-
-                    self.start = self.split + self.split_len;
-                    self.line_width = wrapper.subsequent_indent.width();
-
-                    return Some(line);
-                }
-            } else if is_whitespace(ch) {
-                // Extend the previous split or create a new one.
-                if self.in_whitespace {
-                    self.split_len += char_len;
-                } else {
-                    self.split = idx;
-                    self.split_len = char_len;
-                }
-                self.line_width_at_split = self.line_width + char_width;
-                self.in_whitespace = true;
-            } else if self.line_width + char_width > wrapper.width {
-                // There is no room for this character on the current
-                // line. Try to split the final word.
-                self.in_whitespace = false;
-                let remaining_text = &self.source[self.split + self.split_len..];
-                let final_word = match remaining_text.find(is_whitespace) {
-                    Some(i) => &remaining_text[..i],
-                    None => remaining_text,
-                };
-
-                let mut hyphen = "";
-                let splits = wrapper.splitter.split(final_word);
-                for &(head, hyp, _) in splits.iter().rev() {
-                    if self.line_width_at_split + head.width() + hyp.width() <= wrapper.width {
-                        // We can fit head into the current line.
-                        // Advance the split point by the width of the
-                        // whitespace and the head length.
-                        self.split += self.split_len + head.len();
-                        self.split_len = 0;
-                        hyphen = hyp;
-                        break;
-                    }
-                }
-
-                if self.start >= self.split {
-                    // The word is too big to fit on a single line, so we
-                    // need to split it at the current index.
-                    if wrapper.break_words {
-                        // Break work at current index.
-                        self.split = idx;
-                        self.split_len = 0;
-                        self.line_width_at_split = self.line_width;
-                    } else {
-                        // Add smallest split.
-                        self.split = self.start + splits[0].0.len();
-                        self.split_len = 0;
-                        self.line_width_at_split = self.line_width;
-                    }
-                }
-
-                if self.start < self.split {
-                    let mut line = self.create_result_line(wrapper);
-                    line += &self.source[self.start..self.split];
-                    line += hyphen;
-
-                    self.start = self.split + self.split_len;
-                    self.line_width += wrapper.subsequent_indent.width();
-                    self.line_width -= self.line_width_at_split;
-                    self.line_width += char_width;
-
-                    return Some(line);
-                }
-            } else {
-                self.in_whitespace = false;
-            }
-            self.line_width += char_width;
-        }
-
-        self.finished = true;
-
-        // Add final line.
-        if self.start < self.source.len() {
-            let mut line = self.create_result_line(wrapper);
-            line += &self.source[self.start..];
-            return Some(line);
-        }
-
-        None
-    }
-}
-
-/// Return the current terminal width. If the terminal width cannot be
-/// determined (typically because the standard output is not connected
-/// to a terminal), a default width of 80 characters will be used.
-///
-/// # Examples
-///
-/// Create a `Wrapper` for the current terminal with a two column
-/// margin:
-///
-/// ```no_run
-/// # #![allow(unused_variables)]
-/// use textwrap::{Wrapper, NoHyphenation, termwidth};
-///
-/// let width = termwidth() - 4; // Two columns on each side.
-/// let wrapper = Wrapper::with_splitter(width, NoHyphenation)
-///     .initial_indent("  ")
-///     .subsequent_indent("  ");
-/// ```
-#[cfg(feature = "term_size")]
-pub fn termwidth() -> usize {
-    term_size::dimensions_stdout().map_or(80, |(w, _)| w)
-}
-
-/// Fill a line of text at `width` characters. Strings are wrapped
-/// based on their displayed width, not their size in bytes.
-///
-/// The result is a string with newlines between each line. Use
-/// [`wrap`] if you need access to the individual lines or
-/// [`wrap_iter`] for its iterator counterpart.
-///
-/// ```
-/// use textwrap::fill;
-///
-/// assert_eq!(fill("Memory safety without garbage collection.", 15),
-///            "Memory safety\nwithout garbage\ncollection.");
-/// ```
-///
-/// This function creates a Wrapper on the fly with default settings.
-/// If you need to set a language corpus for automatic hyphenation, or
-/// need to fill many strings, then it is suggested to create a Wrapper
-/// and call its [`fill` method].
-///
-/// [`wrap`]: fn.wrap.html
-/// [`wrap_iter`]: fn.wrap_iter.html
-/// [`fill` method]: struct.Wrapper.html#method.fill
-pub fn fill(s: &str, width: usize) -> String {
-    Wrapper::new(width).fill(s)
-}
-
-/// Wrap a line of text at `width` characters. Strings are wrapped
-/// based on their displayed width, not their size in bytes.
-///
-/// This function creates a Wrapper on the fly with default settings.
-/// If you need to set a language corpus for automatic hyphenation, or
-/// need to wrap many strings, then it is suggested to create a Wrapper
-/// and call its [`wrap` method].
-///
-/// The result is a vector of strings. Use [`wrap_iter`] if you need an
-/// iterator version.
-///
-/// # Examples
-///
-/// ```
-/// use textwrap::wrap;
-///
-/// assert_eq!(wrap("Concurrency without data races.", 15),
-///            vec!["Concurrency",
-///                 "without data",
-///                 "races."]);
-///
-/// assert_eq!(wrap("Concurrency without data races.", 20),
-///            vec!["Concurrency without",
-///                 "data races."]);
-/// ```
-///
-/// [`wrap_iter`]: fn.wrap_iter.html
-/// [`wrap` method]: struct.Wrapper.html#method.wrap
-pub fn wrap(s: &str, width: usize) -> Vec<Cow<str>> {
-    Wrapper::new(width).wrap(s)
-}
-
-/// Lazily wrap a line of text at `width` characters. Strings are
-/// wrapped based on their displayed width, not their size in bytes.
-///
-/// This function creates a Wrapper on the fly with default settings.
-/// It then calls the [`into_wrap_iter`] method. Hence, the return
-/// value is an [`IntoWrapIter`], not a [`WrapIter`] as the function
-/// name would otherwise suggest.
-///
-/// If you need to set a language corpus for automatic hyphenation, or
-/// need to wrap many strings, then it is suggested to create a Wrapper
-/// and call its [`wrap_iter`] or [`into_wrap_iter`] methods.
-///
-/// # Examples
-///
-/// ```
-/// use std::borrow::Cow;
-/// use textwrap::wrap_iter;
-///
-/// let mut wrap20_iter = wrap_iter("Zero-cost abstractions.", 20);
-/// assert_eq!(wrap20_iter.next(), Some(Cow::from("Zero-cost")));
-/// assert_eq!(wrap20_iter.next(), Some(Cow::from("abstractions.")));
-/// assert_eq!(wrap20_iter.next(), None);
-///
-/// let mut wrap25_iter = wrap_iter("Zero-cost abstractions.", 25);
-/// assert_eq!(wrap25_iter.next(), Some(Cow::from("Zero-cost abstractions.")));
-/// assert_eq!(wrap25_iter.next(), None);
-/// ```
-///
-/// [`wrap_iter`]: struct.Wrapper.html#method.wrap_iter
-/// [`into_wrap_iter`]: struct.Wrapper.html#method.into_wrap_iter
-/// [`IntoWrapIter`]: struct.IntoWrapIter.html
-/// [`WrapIter`]: struct.WrapIter.html
-pub fn wrap_iter(s: &str, width: usize) -> IntoWrapIter<HyphenSplitter> {
-    Wrapper::new(width).into_wrap_iter(s)
-}
-
-#[cfg(test)]
-mod tests {
-    #[cfg(feature = "hyphenation")]
-    extern crate hyphenation;
-
-    use super::*;
-    #[cfg(feature = "hyphenation")]
-    use hyphenation::{Language, Load, Standard};
-
-    #[test]
-    fn no_wrap() {
-        assert_eq!(wrap("foo", 10), vec!["foo"]);
-    }
-
-    #[test]
-    fn simple() {
-        assert_eq!(wrap("foo bar baz", 5), vec!["foo", "bar", "baz"]);
-    }
-
-    #[test]
-    fn multi_word_on_line() {
-        assert_eq!(wrap("foo bar baz", 10), vec!["foo bar", "baz"]);
-    }
-
-    #[test]
-    fn long_word() {
-        assert_eq!(wrap("foo", 0), vec!["f", "o", "o"]);
-    }
-
-    #[test]
-    fn long_words() {
-        assert_eq!(wrap("foo bar", 0), vec!["f", "o", "o", "b", "a", "r"]);
-    }
-
-    #[test]
-    fn max_width() {
-        assert_eq!(wrap("foo bar", usize::max_value()), vec!["foo bar"]);
-    }
-
-    #[test]
-    fn leading_whitespace() {
-        assert_eq!(wrap("  foo bar", 6), vec!["  foo", "bar"]);
-    }
-
-    #[test]
-    fn trailing_whitespace() {
-        assert_eq!(wrap("foo bar  ", 6), vec!["foo", "bar  "]);
-    }
-
-    #[test]
-    fn interior_whitespace() {
-        assert_eq!(wrap("foo:   bar baz", 10), vec!["foo:   bar", "baz"]);
-    }
-
-    #[test]
-    fn extra_whitespace_start_of_line() {
-        // Whitespace is only significant inside a line. After a line
-        // gets too long and is broken, the first word starts in
-        // column zero and is not indented. The line before might end
-        // up with trailing whitespace.
-        assert_eq!(wrap("foo               bar", 5), vec!["foo", "bar"]);
-    }
-
-    #[test]
-    fn issue_99() {
-        // We did not reset the in_whitespace flag correctly and did
-        // not handle single-character words after a line break.
-        assert_eq!(
-            wrap("aaabbbccc x yyyzzzwww", 9),
-            vec!["aaabbbccc", "x", "yyyzzzwww"]
-        );
-    }
-
-    #[test]
-    fn issue_129() {
-        // The dash is an em-dash which takes up four bytes. We used
-        // to panic since we tried to index into the character.
-        assert_eq!(wrap("x – x", 1), vec!["x", "–", "x"]);
-    }
-
-    #[test]
-    fn wide_character_handling() {
-        assert_eq!(wrap("Hello, World!", 15), vec!["Hello, World!"]);
-        assert_eq!(
-            wrap("Hello, World!", 15),
-            vec!["Hello,", "World!"]
-        );
-    }
-
-    #[test]
-    fn empty_input_not_indented() {
-        let wrapper = Wrapper::new(10).initial_indent("!!!");
-        assert_eq!(wrapper.fill(""), "");
-    }
-
-    #[test]
-    fn indent_single_line() {
-        let wrapper = Wrapper::new(10).initial_indent(">>>"); // No trailing space
-        assert_eq!(wrapper.fill("foo"), ">>>foo");
-    }
-
-    #[test]
-    fn indent_multiple_lines() {
-        let wrapper = Wrapper::new(6).initial_indent("* ").subsequent_indent("  ");
-        assert_eq!(wrapper.wrap("foo bar baz"), vec!["* foo", "  bar", "  baz"]);
-    }
-
-    #[test]
-    fn indent_break_words() {
-        let wrapper = Wrapper::new(5).initial_indent("* ").subsequent_indent("  ");
-        assert_eq!(wrapper.wrap("foobarbaz"), vec!["* foo", "  bar", "  baz"]);
-    }
-
-    #[test]
-    fn hyphens() {
-        assert_eq!(wrap("foo-bar", 5), vec!["foo-", "bar"]);
-    }
-
-    #[test]
-    fn trailing_hyphen() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.wrap("foobar-"), vec!["foobar-"]);
-    }
-
-    #[test]
-    fn multiple_hyphens() {
-        assert_eq!(wrap("foo-bar-baz", 5), vec!["foo-", "bar-", "baz"]);
-    }
-
-    #[test]
-    fn hyphens_flag() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(
-            wrapper.wrap("The --foo-bar flag."),
-            vec!["The", "--foo-", "bar", "flag."]
-        );
-    }
-
-    #[test]
-    fn repeated_hyphens() {
-        let wrapper = Wrapper::new(4).break_words(false);
-        assert_eq!(wrapper.wrap("foo--bar"), vec!["foo--bar"]);
-    }
-
-    #[test]
-    fn hyphens_alphanumeric() {
-        assert_eq!(wrap("Na2-CH4", 5), vec!["Na2-", "CH4"]);
-    }
-
-    #[test]
-    fn hyphens_non_alphanumeric() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.wrap("foo(-)bar"), vec!["foo(-)bar"]);
-    }
-
-    #[test]
-    fn multiple_splits() {
-        assert_eq!(wrap("foo-bar-baz", 9), vec!["foo-bar-", "baz"]);
-    }
-
-    #[test]
-    fn forced_split() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.wrap("foobar-baz"), vec!["foobar-", "baz"]);
-    }
-
-    #[test]
-    fn no_hyphenation() {
-        let wrapper = Wrapper::with_splitter(8, NoHyphenation);
-        assert_eq!(wrapper.wrap("foo bar-baz"), vec!["foo", "bar-baz"]);
-    }
-
-    #[test]
-    #[cfg(feature = "hyphenation")]
-    fn auto_hyphenation() {
-        let dictionary = Standard::from_embedded(Language::EnglishUS).unwrap();
-        let wrapper = Wrapper::new(10);
-        assert_eq!(
-            wrapper.wrap("Internationalization"),
-            vec!["Internatio", "nalization"]
-        );
-
-        let wrapper = Wrapper::with_splitter(10, dictionary);
-        assert_eq!(
-            wrapper.wrap("Internationalization"),
-            vec!["Interna-", "tionaliza-", "tion"]
-        );
-    }
-
-    #[test]
-    #[cfg(feature = "hyphenation")]
-    fn split_len_hyphenation() {
-        // Test that hyphenation takes the width of the wihtespace
-        // into account.
-        let dictionary = Standard::from_embedded(Language::EnglishUS).unwrap();
-        let wrapper = Wrapper::with_splitter(15, dictionary);
-        assert_eq!(
-            wrapper.wrap("garbage   collection"),
-            vec!["garbage   col-", "lection"]
-        );
-    }
-
-    #[test]
-    #[cfg(feature = "hyphenation")]
-    fn borrowed_lines() {
-        // Lines that end with an extra hyphen are owned, the final
-        // line is borrowed.
-        use std::borrow::Cow::{Borrowed, Owned};
-        let dictionary = Standard::from_embedded(Language::EnglishUS).unwrap();
-        let wrapper = Wrapper::with_splitter(10, dictionary);
-        let lines = wrapper.wrap("Internationalization");
-        if let Borrowed(s) = lines[0] {
-            assert!(false, "should not have been borrowed: {:?}", s);
-        }
-        if let Borrowed(s) = lines[1] {
-            assert!(false, "should not have been borrowed: {:?}", s);
-        }
-        if let Owned(ref s) = lines[2] {
-            assert!(false, "should not have been owned: {:?}", s);
-        }
-    }
-
-    #[test]
-    #[cfg(feature = "hyphenation")]
-    fn auto_hyphenation_with_hyphen() {
-        let dictionary = Standard::from_embedded(Language::EnglishUS).unwrap();
-        let wrapper = Wrapper::new(8).break_words(false);
-        assert_eq!(wrapper.wrap("over-caffinated"), vec!["over-", "caffinated"]);
-
-        let wrapper = Wrapper::with_splitter(8, dictionary).break_words(false);
-        assert_eq!(
-            wrapper.wrap("over-caffinated"),
-            vec!["over-", "caffi-", "nated"]
-        );
-    }
-
-    #[test]
-    fn break_words() {
-        assert_eq!(wrap("foobarbaz", 3), vec!["foo", "bar", "baz"]);
-    }
-
-    #[test]
-    fn break_words_wide_characters() {
-        assert_eq!(wrap("Hello", 5), vec!["He", "ll", "o"]);
-    }
-
-    #[test]
-    fn break_words_zero_width() {
-        assert_eq!(wrap("foobar", 0), vec!["f", "o", "o", "b", "a", "r"]);
-    }
-
-    #[test]
-    fn break_words_line_breaks() {
-        assert_eq!(fill("ab\ncdefghijkl", 5), "ab\ncdefg\nhijkl");
-        assert_eq!(fill("abcdefgh\nijkl", 5), "abcde\nfgh\nijkl");
-    }
-
-    #[test]
-    fn preserve_line_breaks() {
-        assert_eq!(fill("test\n", 11), "test\n");
-        assert_eq!(fill("test\n\na\n\n", 11), "test\n\na\n\n");
-        assert_eq!(fill("1 3 5 7\n1 3 5 7", 7), "1 3 5 7\n1 3 5 7");
-    }
-
-    #[test]
-    fn wrap_preserve_line_breaks() {
-        assert_eq!(fill("1 3 5 7\n1 3 5 7", 5), "1 3 5\n7\n1 3 5\n7");
-    }
-
-    #[test]
-    fn non_breaking_space() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.fill("foo bar baz"), "foo bar baz");
-    }
-
-    #[test]
-    fn non_breaking_hyphen() {
-        let wrapper = Wrapper::new(5).break_words(false);
-        assert_eq!(wrapper.fill("foo‑bar‑baz"), "foo‑bar‑baz");
-    }
-
-    #[test]
-    fn fill_simple() {
-        assert_eq!(fill("foo bar baz", 10), "foo bar\nbaz");
-    }
-}
diff --git a/third_party/rust/textwrap/v0_11/crate/src/splitting.rs b/third_party/rust/textwrap/v0_11/crate/src/splitting.rs
deleted file mode 100644
index f6b65af..0000000
--- a/third_party/rust/textwrap/v0_11/crate/src/splitting.rs
+++ /dev/null
@@ -1,139 +0,0 @@
-//! Word splitting functionality.
-//!
-//! To wrap text into lines, long words sometimes need to be split
-//! across lines. The [`WordSplitter`] trait defines this
-//! functionality. [`HyphenSplitter`] is the default implementation of
-//! this treat: it will simply split words on existing hyphens.
-
-#[cfg(feature = "hyphenation")]
-use hyphenation::{Hyphenator, Standard};
-
-/// An interface for splitting words.
-///
-/// When the [`wrap_iter`] method will try to fit text into a line, it
-/// will eventually find a word that it too large the current text
-/// width. It will then call the currently configured `WordSplitter` to
-/// have it attempt to split the word into smaller parts. This trait
-/// describes that functionality via the [`split`] method.
-///
-/// If the `textwrap` crate has been compiled with the `hyphenation`
-/// feature enabled, you will find an implementation of `WordSplitter`
-/// by the `hyphenation::language::Corpus` struct. Use this struct for
-/// language-aware hyphenation. See the [`hyphenation` documentation]
-/// for details.
-///
-/// [`wrap_iter`]: ../struct.Wrapper.html#method.wrap_iter
-/// [`split`]: #tymethod.split
-/// [`hyphenation` documentation]: https://docs.rs/hyphenation/
-pub trait WordSplitter {
-    /// Return all possible splits of word. Each split is a triple
-    /// with a head, a hyphen, and a tail where `head + &hyphen +
-    /// &tail == word`. The hyphen can be empty if there is already a
-    /// hyphen in the head.
-    ///
-    /// The splits should go from smallest to longest and should
-    /// include no split at all. So the word "technology" could be
-    /// split into
-    ///
-    /// ```no_run
-    /// vec![("tech", "-", "nology"),
-    ///      ("technol", "-", "ogy"),
-    ///      ("technolo", "-", "gy"),
-    ///      ("technology", "", "")];
-    /// ```
-    fn split<'w>(&self, word: &'w str) -> Vec<(&'w str, &'w str, &'w str)>;
-}
-
-/// Use this as a [`Wrapper.splitter`] to avoid any kind of
-/// hyphenation:
-///
-/// ```
-/// use textwrap::{Wrapper, NoHyphenation};
-///
-/// let wrapper = Wrapper::with_splitter(8, NoHyphenation);
-/// assert_eq!(wrapper.wrap("foo bar-baz"), vec!["foo", "bar-baz"]);
-/// ```
-///
-/// [`Wrapper.splitter`]: ../struct.Wrapper.html#structfield.splitter
-#[derive(Clone, Debug)]
-pub struct NoHyphenation;
-
-/// `NoHyphenation` implements `WordSplitter` by not splitting the
-/// word at all.
-impl WordSplitter for NoHyphenation {
-    fn split<'w>(&self, word: &'w str) -> Vec<(&'w str, &'w str, &'w str)> {
-        vec![(word, "", "")]
-    }
-}
-
-/// Simple and default way to split words: splitting on existing
-/// hyphens only.
-///
-/// You probably don't need to use this type since it's already used
-/// by default by `Wrapper::new`.
-#[derive(Clone, Debug)]
-pub struct HyphenSplitter;
-
-/// `HyphenSplitter` is the default `WordSplitter` used by
-/// `Wrapper::new`. It will split words on any existing hyphens in the
-/// word.
-///
-/// It will only use hyphens that are surrounded by alphanumeric
-/// characters, which prevents a word like "--foo-bar" from being
-/// split on the first or second hyphen.
-impl WordSplitter for HyphenSplitter {
-    fn split<'w>(&self, word: &'w str) -> Vec<(&'w str, &'w str, &'w str)> {
-        let mut triples = Vec::new();
-        // Split on hyphens, smallest split first. We only use hyphens
-        // that are surrounded by alphanumeric characters. This is to
-        // avoid splitting on repeated hyphens, such as those found in
-        // --foo-bar.
-        let mut char_indices = word.char_indices();
-        // Early return if the word is empty.
-        let mut prev = match char_indices.next() {
-            None => return vec![(word, "", "")],
-            Some((_, ch)) => ch,
-        };
-
-        // Find current word, or return early if the word only has a
-        // single character.
-        let (mut idx, mut cur) = match char_indices.next() {
-            None => return vec![(word, "", "")],
-            Some((idx, cur)) => (idx, cur),
-        };
-
-        for (i, next) in char_indices {
-            if prev.is_alphanumeric() && cur == '-' && next.is_alphanumeric() {
-                let (head, tail) = word.split_at(idx + 1);
-                triples.push((head, "", tail));
-            }
-            prev = cur;
-            idx = i;
-            cur = next;
-        }
-
-        // Finally option is no split at all.
-        triples.push((word, "", ""));
-
-        triples
-    }
-}
-
-/// A hyphenation dictionary can be used to do language-specific
-/// hyphenation using patterns from the hyphenation crate.
-#[cfg(feature = "hyphenation")]
-impl WordSplitter for Standard {
-    fn split<'w>(&self, word: &'w str) -> Vec<(&'w str, &'w str, &'w str)> {
-        // Find splits based on language dictionary.
-        let mut triples = Vec::new();
-        for n in self.hyphenate(word).breaks {
-            let (head, tail) = word.split_at(n);
-            let hyphen = if head.ends_with('-') { "" } else { "-" };
-            triples.push((head, hyphen, tail));
-        }
-        // Finally option is no split at all.
-        triples.push((word, "", ""));
-
-        triples
-    }
-}
diff --git a/third_party/rust/textwrap/v0_11/crate/tests/version-numbers.rs b/third_party/rust/textwrap/v0_11/crate/tests/version-numbers.rs
deleted file mode 100644
index 85c52e3..0000000
--- a/third_party/rust/textwrap/v0_11/crate/tests/version-numbers.rs
+++ /dev/null
@@ -1,17 +0,0 @@
-#[macro_use]
-extern crate version_sync;
-
-#[test]
-fn test_readme_deps() {
-    assert_markdown_deps_updated!("README.md");
-}
-
-#[test]
-fn test_readme_changelog() {
-    assert_contains_regex!("README.md", r"^### Version {version} — .* \d\d?.., 20\d\d$");
-}
-
-#[test]
-fn test_html_root_url() {
-    assert_html_root_url_updated!("src/lib.rs");
-}
diff --git a/third_party/rust/third_party.toml b/third_party/rust/third_party.toml
index df27f1d4..54b2f2f 100644
--- a/third_party/rust/third_party.toml
+++ b/third_party/rust/third_party.toml
@@ -59,7 +59,7 @@
 features = [ "unbounded_depth", "float_roundtrip" ]
 
 [dependencies.bindgen]
-version = "0.59"
+version = "0.60"
 build-script-outputs = [ "host-target.txt" ]
 features = [ "static" ]
 
diff --git a/third_party/rust/vec_map/v0_8/BUILD.gn b/third_party/rust/vec_map/v0_8/BUILD.gn
deleted file mode 100644
index 76b5a8d..0000000
--- a/third_party/rust/vec_map/v0_8/BUILD.gn
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2022 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/rust/cargo_crate.gni")
-
-cargo_crate("lib") {
-  crate_name = "vec_map"
-  epoch = "0.8"
-  crate_type = "rlib"
-
-  # Only for usage from third-party crates. Add the crate to
-  # third_party.toml to use it from first-party code.
-  visibility = [ "//third_party/rust/*" ]
-  crate_root = "crate/src/lib.rs"
-
-  # Unit tests skipped. Generate with --with-tests to include them.
-  build_native_rust_unit_tests = false
-  sources = [ "crate/src/lib.rs" ]
-  edition = "2015"
-  cargo_pkg_version = "0.8.2"
-  cargo_pkg_authors = "Alex Crichton <alex@alexcrichton.com>, Jorge Aparicio <japaricious@gmail.com>, Alexis Beingessner <a.beingessner@gmail.com>, Brian Anderson <>, tbu- <>, Manish Goregaokar <>, Aaron Turon <aturon@mozilla.com>, Adolfo Ochagavía <>, Niko Matsakis <>, Steven Fackler <>, Chase Southwood <csouth3@illinois.edu>, Eduard Burtescu <>, Florian Wilkens <>, Félix Raimundo <>, Tibor Benke <>, Markus Siemens <markus@m-siemens.de>, Josh Branchaud <jbranchaud@gmail.com>, Huon Wilson <dbau.pp@gmail.com>, Corey Farwell <coref@rwell.org>, Aaron Liblong <>, Nick Cameron <nrc@ncameron.org>, Patrick Walton <pcwalton@mimiga.net>, Felix S Klock II <>, Andrew Paseltiner <apaseltiner@gmail.com>, Sean McArthur <sean.monstar@gmail.com>, Vadim Petrochenkov <>"
-  cargo_pkg_name = "vec_map"
-  cargo_pkg_description =
-      "A simple map based on a vector for small integer keys"
-}
diff --git a/third_party/rust/vec_map/v0_8/README.chromium b/third_party/rust/vec_map/v0_8/README.chromium
deleted file mode 100644
index 7af490b..0000000
--- a/third_party/rust/vec_map/v0_8/README.chromium
+++ /dev/null
@@ -1,6 +0,0 @@
-Name: vec_map
-URL: https://crates.io/crates/vec_map
-Description: A simple map based on a vector for small integer keys
-Version: 0.8.2
-Security Critical: no
-License: Apache 2.0
diff --git a/third_party/rust/vec_map/v0_8/crate/.cargo_vcs_info.json b/third_party/rust/vec_map/v0_8/crate/.cargo_vcs_info.json
deleted file mode 100644
index 3961f16..0000000
--- a/third_party/rust/vec_map/v0_8/crate/.cargo_vcs_info.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "git": {
-    "sha1": "9509befa7bc96a7f8bd202cc472dc9ecc23be890"
-  }
-}
diff --git a/third_party/rust/vec_map/v0_8/crate/.gitignore b/third_party/rust/vec_map/v0_8/crate/.gitignore
deleted file mode 100644
index b264477..0000000
--- a/third_party/rust/vec_map/v0_8/crate/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-*~
-*.swp
-target
-Cargo.lock
diff --git a/third_party/rust/vec_map/v0_8/crate/Cargo.toml b/third_party/rust/vec_map/v0_8/crate/Cargo.toml
deleted file mode 100644
index 05b0833..0000000
--- a/third_party/rust/vec_map/v0_8/crate/Cargo.toml
+++ /dev/null
@@ -1,31 +0,0 @@
-# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
-#
-# When uploading crates to the registry Cargo will automatically
-# "normalize" Cargo.toml files for maximal compatibility
-# with all versions of Cargo and also rewrite `path` dependencies
-# to registry (e.g., crates.io) dependencies
-#
-# If you believe there's an error in this file please file an
-# issue against the rust-lang/cargo repository. If you're
-# editing this file be aware that the upstream Cargo.toml
-# will likely look very different (and much more reasonable)
-
-[package]
-name = "vec_map"
-version = "0.8.2"
-authors = ["Alex Crichton <alex@alexcrichton.com>", "Jorge Aparicio <japaricious@gmail.com>", "Alexis Beingessner <a.beingessner@gmail.com>", "Brian Anderson <>", "tbu- <>", "Manish Goregaokar <>", "Aaron Turon <aturon@mozilla.com>", "Adolfo Ochagavía <>", "Niko Matsakis <>", "Steven Fackler <>", "Chase Southwood <csouth3@illinois.edu>", "Eduard Burtescu <>", "Florian Wilkens <>", "Félix Raimundo <>", "Tibor Benke <>", "Markus Siemens <markus@m-siemens.de>", "Josh Branchaud <jbranchaud@gmail.com>", "Huon Wilson <dbau.pp@gmail.com>", "Corey Farwell <coref@rwell.org>", "Aaron Liblong <>", "Nick Cameron <nrc@ncameron.org>", "Patrick Walton <pcwalton@mimiga.net>", "Felix S Klock II <>", "Andrew Paseltiner <apaseltiner@gmail.com>", "Sean McArthur <sean.monstar@gmail.com>", "Vadim Petrochenkov <>"]
-exclude = ["/.travis.yml", "/deploy-docs.sh"]
-description = "A simple map based on a vector for small integer keys"
-homepage = "https://github.com/contain-rs/vec-map"
-documentation = "https://contain-rs.github.io/vec-map/vec_map"
-readme = "README.md"
-keywords = ["data-structures", "collections", "vecmap", "vec_map", "contain-rs"]
-license = "MIT/Apache-2.0"
-repository = "https://github.com/contain-rs/vec-map"
-[dependencies.serde]
-version = "1.0"
-features = ["derive"]
-optional = true
-
-[features]
-eders = ["serde"]
diff --git a/third_party/rust/vec_map/v0_8/crate/Cargo.toml.orig b/third_party/rust/vec_map/v0_8/crate/Cargo.toml.orig
deleted file mode 100644
index ad9f8f8..0000000
--- a/third_party/rust/vec_map/v0_8/crate/Cargo.toml.orig
+++ /dev/null
@@ -1,45 +0,0 @@
-[package]
-name = "vec_map"
-version = "0.8.2"
-authors = ["Alex Crichton <alex@alexcrichton.com>",
-           "Jorge Aparicio <japaricious@gmail.com>",
-           "Alexis Beingessner <a.beingessner@gmail.com>",
-           "Brian Anderson <>",
-           "tbu- <>",
-           "Manish Goregaokar <>",
-           "Aaron Turon <aturon@mozilla.com>",
-           "Adolfo Ochagavía <>",
-           "Niko Matsakis <>",
-           "Steven Fackler <>",
-           "Chase Southwood <csouth3@illinois.edu>",
-           "Eduard Burtescu <>",
-           "Florian Wilkens <>",
-           "Félix Raimundo <>",
-           "Tibor Benke <>",
-           "Markus Siemens <markus@m-siemens.de>",
-           "Josh Branchaud <jbranchaud@gmail.com>",
-           "Huon Wilson <dbau.pp@gmail.com>",
-           "Corey Farwell <coref@rwell.org>",
-           "Aaron Liblong <>",
-           "Nick Cameron <nrc@ncameron.org>",
-           "Patrick Walton <pcwalton@mimiga.net>",
-           "Felix S Klock II <>",
-           "Andrew Paseltiner <apaseltiner@gmail.com>",
-           "Sean McArthur <sean.monstar@gmail.com>",
-           "Vadim Petrochenkov <>"]
-
-license = "MIT/Apache-2.0"
-description = "A simple map based on a vector for small integer keys"
-repository = "https://github.com/contain-rs/vec-map"
-homepage = "https://github.com/contain-rs/vec-map"
-documentation = "https://contain-rs.github.io/vec-map/vec_map"
-keywords = ["data-structures", "collections", "vecmap", "vec_map", "contain-rs"]
-readme = "README.md"
-exclude = ["/.travis.yml", "/deploy-docs.sh"]
-
-[features]
-# This feature is kept for backwards compatibility. Use feature "serde" instead.
-eders = [ "serde" ]
-
-[dependencies]
-serde = { version = "1.0", features = [ "derive" ], optional = true }
diff --git a/third_party/rust/vec_map/v0_8/crate/LICENSE-APACHE b/third_party/rust/vec_map/v0_8/crate/LICENSE-APACHE
deleted file mode 100644
index 11069ed..0000000
--- a/third_party/rust/vec_map/v0_8/crate/LICENSE-APACHE
+++ /dev/null
@@ -1,201 +0,0 @@
-                              Apache License
-                        Version 2.0, January 2004
-                     http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-   "License" shall mean the terms and conditions for use, reproduction,
-   and distribution as defined by Sections 1 through 9 of this document.
-
-   "Licensor" shall mean the copyright owner or entity authorized by
-   the copyright owner that is granting the License.
-
-   "Legal Entity" shall mean the union of the acting entity and all
-   other entities that control, are controlled by, or are under common
-   control with that entity. For the purposes of this definition,
-   "control" means (i) the power, direct or indirect, to cause the
-   direction or management of such entity, whether by contract or
-   otherwise, or (ii) ownership of fifty percent (50%) or more of the
-   outstanding shares, or (iii) beneficial ownership of such entity.
-
-   "You" (or "Your") shall mean an individual or Legal Entity
-   exercising permissions granted by this License.
-
-   "Source" form shall mean the preferred form for making modifications,
-   including but not limited to software source code, documentation
-   source, and configuration files.
-
-   "Object" form shall mean any form resulting from mechanical
-   transformation or translation of a Source form, including but
-   not limited to compiled object code, generated documentation,
-   and conversions to other media types.
-
-   "Work" shall mean the work of authorship, whether in Source or
-   Object form, made available under the License, as indicated by a
-   copyright notice that is included in or attached to the work
-   (an example is provided in the Appendix below).
-
-   "Derivative Works" shall mean any work, whether in Source or Object
-   form, that is based on (or derived from) the Work and for which the
-   editorial revisions, annotations, elaborations, or other modifications
-   represent, as a whole, an original work of authorship. For the purposes
-   of this License, Derivative Works shall not include works that remain
-   separable from, or merely link (or bind by name) to the interfaces of,
-   the Work and Derivative Works thereof.
-
-   "Contribution" shall mean any work of authorship, including
-   the original version of the Work and any modifications or additions
-   to that Work or Derivative Works thereof, that is intentionally
-   submitted to Licensor for inclusion in the Work by the copyright owner
-   or by an individual or Legal Entity authorized to submit on behalf of
-   the copyright owner. For the purposes of this definition, "submitted"
-   means any form of electronic, verbal, or written communication sent
-   to the Licensor or its representatives, including but not limited to
-   communication on electronic mailing lists, source code control systems,
-   and issue tracking systems that are managed by, or on behalf of, the
-   Licensor for the purpose of discussing and improving the Work, but
-   excluding communication that is conspicuously marked or otherwise
-   designated in writing by the copyright owner as "Not a Contribution."
-
-   "Contributor" shall mean Licensor and any individual or Legal Entity
-   on behalf of whom a Contribution has been received by Licensor and
-   subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   copyright license to reproduce, prepare Derivative Works of,
-   publicly display, publicly perform, sublicense, and distribute the
-   Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of
-   this License, each Contributor hereby grants to You a perpetual,
-   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-   (except as stated in this section) patent license to make, have made,
-   use, offer to sell, sell, import, and otherwise transfer the Work,
-   where such license applies only to those patent claims licensable
-   by such Contributor that are necessarily infringed by their
-   Contribution(s) alone or by combination of their Contribution(s)
-   with the Work to which such Contribution(s) was submitted. If You
-   institute patent litigation against any entity (including a
-   cross-claim or counterclaim in a lawsuit) alleging that the Work
-   or a Contribution incorporated within the Work constitutes direct
-   or contributory patent infringement, then any patent licenses
-   granted to You under this License for that Work shall terminate
-   as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the
-   Work or Derivative Works thereof in any medium, with or without
-   modifications, and in Source or Object form, provided that You
-   meet the following conditions:
-
-   (a) You must give any other recipients of the Work or
-       Derivative Works a copy of this License; and
-
-   (b) You must cause any modified files to carry prominent notices
-       stating that You changed the files; and
-
-   (c) You must retain, in the Source form of any Derivative Works
-       that You distribute, all copyright, patent, trademark, and
-       attribution notices from the Source form of the Work,
-       excluding those notices that do not pertain to any part of
-       the Derivative Works; and
-
-   (d) If the Work includes a "NOTICE" text file as part of its
-       distribution, then any Derivative Works that You distribute must
-       include a readable copy of the attribution notices contained
-       within such NOTICE file, excluding those notices that do not
-       pertain to any part of the Derivative Works, in at least one
-       of the following places: within a NOTICE text file distributed
-       as part of the Derivative Works; within the Source form or
-       documentation, if provided along with the Derivative Works; or,
-       within a display generated by the Derivative Works, if and
-       wherever such third-party notices normally appear. The contents
-       of the NOTICE file are for informational purposes only and
-       do not modify the License. You may add Your own attribution
-       notices within Derivative Works that You distribute, alongside
-       or as an addendum to the NOTICE text from the Work, provided
-       that such additional attribution notices cannot be construed
-       as modifying the License.
-
-   You may add Your own copyright statement to Your modifications and
-   may provide additional or different license terms and conditions
-   for use, reproduction, or distribution of Your modifications, or
-   for any such Derivative Works as a whole, provided Your use,
-   reproduction, and distribution of the Work otherwise complies with
-   the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise,
-   any Contribution intentionally submitted for inclusion in the Work
-   by You to the Licensor shall be under the terms and conditions of
-   this License, without any additional terms or conditions.
-   Notwithstanding the above, nothing herein shall supersede or modify
-   the terms of any separate license agreement you may have executed
-   with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade
-   names, trademarks, service marks, or product names of the Licensor,
-   except as required for reasonable and customary use in describing the
-   origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or
-   agreed to in writing, Licensor provides the Work (and each
-   Contributor provides its Contributions) on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-   implied, including, without limitation, any warranties or conditions
-   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-   PARTICULAR PURPOSE. You are solely responsible for determining the
-   appropriateness of using or redistributing the Work and assume any
-   risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory,
-   whether in tort (including negligence), contract, or otherwise,
-   unless required by applicable law (such as deliberate and grossly
-   negligent acts) or agreed to in writing, shall any Contributor be
-   liable to You for damages, including any direct, indirect, special,
-   incidental, or consequential damages of any character arising as a
-   result of this License or out of the use or inability to use the
-   Work (including but not limited to damages for loss of goodwill,
-   work stoppage, computer failure or malfunction, or any and all
-   other commercial damages or losses), even if such Contributor
-   has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing
-   the Work or Derivative Works thereof, You may choose to offer,
-   and charge a fee for, acceptance of support, warranty, indemnity,
-   or other liability obligations and/or rights consistent with this
-   License. However, in accepting such obligations, You may act only
-   on Your own behalf and on Your sole responsibility, not on behalf
-   of any other Contributor, and only if You agree to indemnify,
-   defend, and hold each Contributor harmless for any liability
-   incurred by, or claims asserted against, such Contributor by reason
-   of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work.
-
-   To apply the Apache License to your work, attach the following
-   boilerplate notice, with the fields enclosed by brackets "[]"
-   replaced with your own identifying information. (Don't include
-   the brackets!)  The text should be enclosed in the appropriate
-   comment syntax for the file format. We also recommend that a
-   file or class name and description of purpose be included on the
-   same "printed page" as the copyright notice for easier
-   identification within third-party archives.
-
-Copyright [yyyy] [name of copyright owner]
-
-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.
diff --git a/third_party/rust/vec_map/v0_8/crate/LICENSE-MIT b/third_party/rust/vec_map/v0_8/crate/LICENSE-MIT
deleted file mode 100644
index e69282e..0000000
--- a/third_party/rust/vec_map/v0_8/crate/LICENSE-MIT
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) 2015 The Rust Project Developers
-
-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/rust/vec_map/v0_8/crate/README.md b/third_party/rust/vec_map/v0_8/crate/README.md
deleted file mode 100644
index 17d5c5bb..0000000
--- a/third_party/rust/vec_map/v0_8/crate/README.md
+++ /dev/null
@@ -1,15 +0,0 @@
-**WARNING: THIS PROJECT IS IN MAINTENANCE MODE, DUE TO INSUFFICIENT MAINTAINER RESOURCES**
-
-It works fine, but will generally no longer be improved.
-
-We are currently only accepting changes which:
-
-* keep this compiling with the latest versions of Rust or its dependencies.
-* have minimal review requirements, such as documentation changes (so not totally new APIs).
-
-------
-
-
-A simple map based on a vector for small integer keys.
-
-Documentation is available at https://contain-rs.github.io/vec-map/vec_map.
diff --git a/third_party/rust/vec_map/v0_8/crate/src/lib.rs b/third_party/rust/vec_map/v0_8/crate/src/lib.rs
deleted file mode 100644
index 0b63833..0000000
--- a/third_party/rust/vec_map/v0_8/crate/src/lib.rs
+++ /dev/null
@@ -1,1623 +0,0 @@
-// Copyright 2012-2018 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#![deny(missing_docs)]
-
-//! A simple map based on a vector for small integer keys. Space requirements
-//! are O(highest integer key).
-
-// optional serde support
-#[cfg(feature = "serde")]
-#[macro_use]
-extern crate serde;
-
-use self::Entry::*;
-
-use std::cmp::{Ordering, max};
-use std::fmt;
-use std::hash::{Hash, Hasher};
-use std::iter::{Enumerate, FilterMap, FromIterator};
-use std::mem::{replace, swap};
-use std::ops::{Index, IndexMut};
-use std::slice;
-use std::vec;
-
-/// A map optimized for small integer keys.
-///
-/// # Examples
-///
-/// ```
-/// use vec_map::VecMap;
-///
-/// let mut months = VecMap::new();
-/// months.insert(1, "Jan");
-/// months.insert(2, "Feb");
-/// months.insert(3, "Mar");
-///
-/// if !months.contains_key(12) {
-///     println!("The end is near!");
-/// }
-///
-/// assert_eq!(months.get(1), Some(&"Jan"));
-///
-/// if let Some(value) = months.get_mut(3) {
-///     *value = "Venus";
-/// }
-///
-/// assert_eq!(months.get(3), Some(&"Venus"));
-///
-/// // Print out all months
-/// for (key, value) in &months {
-///     println!("month {} is {}", key, value);
-/// }
-///
-/// months.clear();
-/// assert!(months.is_empty());
-/// ```
-#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
-pub struct VecMap<V> {
-    n: usize,
-    v: Vec<Option<V>>,
-}
-
-/// A view into a single entry in a map, which may either be vacant or occupied.
-pub enum Entry<'a, V: 'a> {
-    /// A vacant Entry
-    Vacant(VacantEntry<'a, V>),
-
-    /// An occupied Entry
-    Occupied(OccupiedEntry<'a, V>),
-}
-
-/// A vacant Entry.
-pub struct VacantEntry<'a, V: 'a> {
-    map: &'a mut VecMap<V>,
-    index: usize,
-}
-
-/// An occupied Entry.
-pub struct OccupiedEntry<'a, V: 'a> {
-    map: &'a mut VecMap<V>,
-    index: usize,
-}
-
-impl<V> Default for VecMap<V> {
-    #[inline]
-    fn default() -> Self { Self::new() }
-}
-
-impl<V: Hash> Hash for VecMap<V> {
-    fn hash<H: Hasher>(&self, state: &mut H) {
-        // In order to not traverse the `VecMap` twice, count the elements
-        // during iteration.
-        let mut count: usize = 0;
-        for elt in self {
-            elt.hash(state);
-            count += 1;
-        }
-        count.hash(state);
-    }
-}
-
-impl<V> VecMap<V> {
-    /// Creates an empty `VecMap`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    /// let mut map: VecMap<&str> = VecMap::new();
-    /// ```
-    pub fn new() -> Self { VecMap { n: 0, v: vec![] } }
-
-    /// Creates an empty `VecMap` with space for at least `capacity`
-    /// elements before resizing.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    /// let mut map: VecMap<&str> = VecMap::with_capacity(10);
-    /// ```
-    pub fn with_capacity(capacity: usize) -> Self {
-        VecMap { n: 0, v: Vec::with_capacity(capacity) }
-    }
-
-    /// Returns the number of elements the `VecMap` can hold without
-    /// reallocating.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    /// let map: VecMap<String> = VecMap::with_capacity(10);
-    /// assert!(map.capacity() >= 10);
-    /// ```
-    #[inline]
-    pub fn capacity(&self) -> usize {
-        self.v.capacity()
-    }
-
-    /// Reserves capacity for the given `VecMap` to contain `len` distinct keys.
-    /// In the case of `VecMap` this means reallocations will not occur as long
-    /// as all inserted keys are less than `len`.
-    ///
-    /// The collection may reserve more space to avoid frequent reallocations.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    /// let mut map: VecMap<&str> = VecMap::new();
-    /// map.reserve_len(10);
-    /// assert!(map.capacity() >= 10);
-    /// ```
-    pub fn reserve_len(&mut self, len: usize) {
-        let cur_len = self.v.len();
-        if len >= cur_len {
-            self.v.reserve(len - cur_len);
-        }
-    }
-
-    /// Reserves the minimum capacity for the given `VecMap` to contain `len` distinct keys.
-    /// In the case of `VecMap` this means reallocations will not occur as long as all inserted
-    /// keys are less than `len`.
-    ///
-    /// Note that the allocator may give the collection more space than it requests.
-    /// Therefore capacity cannot be relied upon to be precisely minimal.  Prefer
-    /// `reserve_len` if future insertions are expected.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    /// let mut map: VecMap<&str> = VecMap::new();
-    /// map.reserve_len_exact(10);
-    /// assert!(map.capacity() >= 10);
-    /// ```
-    pub fn reserve_len_exact(&mut self, len: usize) {
-        let cur_len = self.v.len();
-        if len >= cur_len {
-            self.v.reserve_exact(len - cur_len);
-        }
-    }
-
-    /// Trims the `VecMap` of any excess capacity.
-    ///
-    /// The collection may reserve more space to avoid frequent reallocations.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    /// let mut map: VecMap<&str> = VecMap::with_capacity(10);
-    /// map.shrink_to_fit();
-    /// assert_eq!(map.capacity(), 0);
-    /// ```
-    pub fn shrink_to_fit(&mut self) {
-        // strip off trailing `None`s
-        if let Some(idx) = self.v.iter().rposition(Option::is_some) {
-            self.v.truncate(idx + 1);
-        } else {
-            self.v.clear();
-        }
-
-        self.v.shrink_to_fit()
-    }
-
-    /// Returns an iterator visiting all keys in ascending order of the keys.
-    /// The iterator's element type is `usize`.
-    pub fn keys(&self) -> Keys<V> {
-        Keys { iter: self.iter() }
-    }
-
-    /// Returns an iterator visiting all values in ascending order of the keys.
-    /// The iterator's element type is `&'r V`.
-    pub fn values(&self) -> Values<V> {
-        Values { iter: self.iter() }
-    }
-
-    /// Returns an iterator visiting all values in ascending order of the keys.
-    /// The iterator's element type is `&'r mut V`.
-    pub fn values_mut(&mut self) -> ValuesMut<V> {
-        ValuesMut { iter_mut: self.iter_mut() }
-    }
-
-    /// Returns an iterator visiting all key-value pairs in ascending order of the keys.
-    /// The iterator's element type is `(usize, &'r V)`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut map = VecMap::new();
-    /// map.insert(1, "a");
-    /// map.insert(3, "c");
-    /// map.insert(2, "b");
-    ///
-    /// // Print `1: a` then `2: b` then `3: c`
-    /// for (key, value) in map.iter() {
-    ///     println!("{}: {}", key, value);
-    /// }
-    /// ```
-    pub fn iter(&self) -> Iter<V> {
-        Iter {
-            front: 0,
-            back: self.v.len(),
-            n: self.n,
-            yielded: 0,
-            iter: self.v.iter()
-        }
-    }
-
-    /// Returns an iterator visiting all key-value pairs in ascending order of the keys,
-    /// with mutable references to the values.
-    /// The iterator's element type is `(usize, &'r mut V)`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut map = VecMap::new();
-    /// map.insert(1, "a");
-    /// map.insert(2, "b");
-    /// map.insert(3, "c");
-    ///
-    /// for (key, value) in map.iter_mut() {
-    ///     *value = "x";
-    /// }
-    ///
-    /// for (key, value) in &map {
-    ///     assert_eq!(value, &"x");
-    /// }
-    /// ```
-    pub fn iter_mut(&mut self) -> IterMut<V> {
-        IterMut {
-            front: 0,
-            back: self.v.len(),
-            n: self.n,
-            yielded: 0,
-            iter: self.v.iter_mut()
-        }
-    }
-
-    /// Moves all elements from `other` into the map while overwriting existing keys.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut a = VecMap::new();
-    /// a.insert(1, "a");
-    /// a.insert(2, "b");
-    ///
-    /// let mut b = VecMap::new();
-    /// b.insert(3, "c");
-    /// b.insert(4, "d");
-    ///
-    /// a.append(&mut b);
-    ///
-    /// assert_eq!(a.len(), 4);
-    /// assert_eq!(b.len(), 0);
-    /// assert_eq!(a[1], "a");
-    /// assert_eq!(a[2], "b");
-    /// assert_eq!(a[3], "c");
-    /// assert_eq!(a[4], "d");
-    /// ```
-    pub fn append(&mut self, other: &mut Self) {
-        self.extend(other.drain());
-    }
-
-    /// Splits the collection into two at the given key.
-    ///
-    /// Returns a newly allocated `Self`. `self` contains elements `[0, at)`,
-    /// and the returned `Self` contains elements `[at, max_key)`.
-    ///
-    /// Note that the capacity of `self` does not change.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut a = VecMap::new();
-    /// a.insert(1, "a");
-    /// a.insert(2, "b");
-    /// a.insert(3, "c");
-    /// a.insert(4, "d");
-    ///
-    /// let b = a.split_off(3);
-    ///
-    /// assert_eq!(a[1], "a");
-    /// assert_eq!(a[2], "b");
-    ///
-    /// assert_eq!(b[3], "c");
-    /// assert_eq!(b[4], "d");
-    /// ```
-    pub fn split_off(&mut self, at: usize) -> Self {
-        let mut other = VecMap::new();
-
-        if at == 0 {
-            // Move all elements to other
-            // The swap will also fix .n
-            swap(self, &mut other);
-            return other
-        } else if at >= self.v.len() {
-            // No elements to copy
-            return other;
-        }
-
-        // Look up the index of the first non-None item
-        let first_index = self.v.iter().position(|el| el.is_some());
-        let start_index = match first_index {
-            Some(index) => max(at, index),
-            None => {
-                // self has no elements
-                return other;
-            }
-        };
-
-        // Fill the new VecMap with `None`s until `start_index`
-        other.v.extend((0..start_index).map(|_| None));
-
-        // Move elements beginning with `start_index` from `self` into `other`
-        let mut taken = 0;
-        other.v.extend(self.v[start_index..].iter_mut().map(|el| {
-            let el = el.take();
-            if el.is_some() {
-                taken += 1;
-            }
-            el
-        }));
-        other.n = taken;
-        self.n -= taken;
-
-        other
-    }
-
-    /// Returns an iterator visiting all key-value pairs in ascending order of
-    /// the keys, emptying (but not consuming) the original `VecMap`.
-    /// The iterator's element type is `(usize, &'r V)`. Keeps the allocated memory for reuse.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut map = VecMap::new();
-    /// map.insert(1, "a");
-    /// map.insert(3, "c");
-    /// map.insert(2, "b");
-    ///
-    /// let vec: Vec<(usize, &str)> = map.drain().collect();
-    ///
-    /// assert_eq!(vec, [(1, "a"), (2, "b"), (3, "c")]);
-    /// ```
-    pub fn drain(&mut self) -> Drain<V> {
-        fn filter<A>((i, v): (usize, Option<A>)) -> Option<(usize, A)> {
-            v.map(|v| (i, v))
-        }
-        let filter: fn((usize, Option<V>)) -> Option<(usize, V)> = filter; // coerce to fn ptr
-
-        self.n = 0;
-        Drain { iter: self.v.drain(..).enumerate().filter_map(filter) }
-    }
-
-    /// Returns the number of elements in the map.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut a = VecMap::new();
-    /// assert_eq!(a.len(), 0);
-    /// a.insert(1, "a");
-    /// assert_eq!(a.len(), 1);
-    /// ```
-    pub fn len(&self) -> usize {
-        self.n
-    }
-
-    /// Returns true if the map contains no elements.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut a = VecMap::new();
-    /// assert!(a.is_empty());
-    /// a.insert(1, "a");
-    /// assert!(!a.is_empty());
-    /// ```
-    pub fn is_empty(&self) -> bool {
-        self.n == 0
-    }
-
-    /// Clears the map, removing all key-value pairs.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut a = VecMap::new();
-    /// a.insert(1, "a");
-    /// a.clear();
-    /// assert!(a.is_empty());
-    /// ```
-    pub fn clear(&mut self) { self.n = 0; self.v.clear() }
-
-    /// Returns a reference to the value corresponding to the key.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut map = VecMap::new();
-    /// map.insert(1, "a");
-    /// assert_eq!(map.get(1), Some(&"a"));
-    /// assert_eq!(map.get(2), None);
-    /// ```
-    pub fn get(&self, key: usize) -> Option<&V> {
-        if key < self.v.len() {
-            self.v[key].as_ref()
-        } else {
-            None
-        }
-    }
-
-    /// Returns true if the map contains a value for the specified key.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut map = VecMap::new();
-    /// map.insert(1, "a");
-    /// assert_eq!(map.contains_key(1), true);
-    /// assert_eq!(map.contains_key(2), false);
-    /// ```
-    #[inline]
-    pub fn contains_key(&self, key: usize) -> bool {
-        self.get(key).is_some()
-    }
-
-    /// Returns a mutable reference to the value corresponding to the key.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut map = VecMap::new();
-    /// map.insert(1, "a");
-    /// if let Some(x) = map.get_mut(1) {
-    ///     *x = "b";
-    /// }
-    /// assert_eq!(map[1], "b");
-    /// ```
-    pub fn get_mut(&mut self, key: usize) -> Option<&mut V> {
-        if key < self.v.len() {
-            self.v[key].as_mut()
-        } else {
-            None
-        }
-    }
-
-    /// Inserts a key-value pair into the map. If the key already had a value
-    /// present in the map, that value is returned. Otherwise, `None` is returned.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut map = VecMap::new();
-    /// assert_eq!(map.insert(37, "a"), None);
-    /// assert_eq!(map.is_empty(), false);
-    ///
-    /// map.insert(37, "b");
-    /// assert_eq!(map.insert(37, "c"), Some("b"));
-    /// assert_eq!(map[37], "c");
-    /// ```
-    pub fn insert(&mut self, key: usize, value: V) -> Option<V> {
-        let len = self.v.len();
-        if len <= key {
-            self.v.extend((0..key - len + 1).map(|_| None));
-        }
-        let was = replace(&mut self.v[key], Some(value));
-        if was.is_none() {
-            self.n += 1;
-        }
-        was
-    }
-
-    /// Removes a key from the map, returning the value at the key if the key
-    /// was previously in the map.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut map = VecMap::new();
-    /// map.insert(1, "a");
-    /// assert_eq!(map.remove(1), Some("a"));
-    /// assert_eq!(map.remove(1), None);
-    /// ```
-    pub fn remove(&mut self, key: usize) -> Option<V> {
-        if key >= self.v.len() {
-            return None;
-        }
-        let result = &mut self.v[key];
-        let was = result.take();
-        if was.is_some() {
-            self.n -= 1;
-        }
-        was
-    }
-
-    /// Gets the given key's corresponding entry in the map for in-place manipulation.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut count: VecMap<u32> = VecMap::new();
-    ///
-    /// // count the number of occurrences of numbers in the vec
-    /// for x in vec![1, 2, 1, 2, 3, 4, 1, 2, 4] {
-    ///     *count.entry(x).or_insert(0) += 1;
-    /// }
-    ///
-    /// assert_eq!(count[1], 3);
-    /// ```
-    pub fn entry(&mut self, key: usize) -> Entry<V> {
-        // FIXME(Gankro): this is basically the dumbest implementation of
-        // entry possible, because weird non-lexical borrows issues make it
-        // completely insane to do any other way. That said, Entry is a border-line
-        // useless construct on VecMap, so it's hardly a big loss.
-        if self.contains_key(key) {
-            Occupied(OccupiedEntry {
-                map: self,
-                index: key,
-            })
-        } else {
-            Vacant(VacantEntry {
-                map: self,
-                index: key,
-            })
-        }
-    }
-
-    /// Retains only the elements specified by the predicate.
-    ///
-    /// In other words, remove all pairs `(k, v)` such that `f(&k, &mut v)` returns `false`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut map: VecMap<usize> = (0..8).map(|x|(x, x*10)).collect();
-    /// map.retain(|k, _| k % 2 == 0);
-    /// assert_eq!(map.len(), 4);
-    /// ```
-    pub fn retain<F>(&mut self, mut f: F)
-        where F: FnMut(usize, &mut V) -> bool
-    {
-        for (i, e) in self.v.iter_mut().enumerate() {
-            let remove = match *e {
-                Some(ref mut value) => !f(i, value),
-                None => false,
-            };
-            if remove {
-                *e = None;
-                self.n -= 1;
-            }
-        }
-    }
-}
-
-impl<'a, V> Entry<'a, V> {
-    /// Ensures a value is in the entry by inserting the default if empty, and
-    /// returns a mutable reference to the value in the entry.
-    pub fn or_insert(self, default: V) -> &'a mut V {
-        match self {
-            Occupied(entry) => entry.into_mut(),
-            Vacant(entry) => entry.insert(default),
-        }
-    }
-
-    /// Ensures a value is in the entry by inserting the result of the default
-    /// function if empty, and returns a mutable reference to the value in the
-    /// entry.
-    pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {
-        match self {
-            Occupied(entry) => entry.into_mut(),
-            Vacant(entry) => entry.insert(default()),
-        }
-    }
-}
-
-impl<'a, V> VacantEntry<'a, V> {
-    /// Sets the value of the entry with the VacantEntry's key,
-    /// and returns a mutable reference to it.
-    pub fn insert(self, value: V) -> &'a mut V {
-        let index = self.index;
-        self.map.insert(index, value);
-        &mut self.map[index]
-    }
-}
-
-impl<'a, V> OccupiedEntry<'a, V> {
-    /// Gets a reference to the value in the entry.
-    pub fn get(&self) -> &V {
-        let index = self.index;
-        &self.map[index]
-    }
-
-    /// Gets a mutable reference to the value in the entry.
-    pub fn get_mut(&mut self) -> &mut V {
-        let index = self.index;
-        &mut self.map[index]
-    }
-
-    /// Converts the entry into a mutable reference to its value.
-    pub fn into_mut(self) -> &'a mut V {
-        let index = self.index;
-        &mut self.map[index]
-    }
-
-    /// Sets the value of the entry with the OccupiedEntry's key,
-    /// and returns the entry's old value.
-    pub fn insert(&mut self, value: V) -> V {
-        let index = self.index;
-        self.map.insert(index, value).unwrap()
-    }
-
-    /// Takes the value of the entry out of the map, and returns it.
-    pub fn remove(self) -> V {
-        let index = self.index;
-        self.map.remove(index).unwrap()
-    }
-}
-
-impl<V: Clone> Clone for VecMap<V> {
-    #[inline]
-    fn clone(&self) -> Self {
-        VecMap { n: self.n, v: self.v.clone() }
-    }
-
-    #[inline]
-    fn clone_from(&mut self, source: &Self) {
-        self.v.clone_from(&source.v);
-        self.n = source.n;
-    }
-}
-
-impl<V: PartialEq> PartialEq for VecMap<V> {
-    fn eq(&self, other: &Self) -> bool {
-        self.n == other.n && self.iter().eq(other.iter())
-    }
-}
-
-impl<V: Eq> Eq for VecMap<V> {}
-
-impl<V: PartialOrd> PartialOrd for VecMap<V> {
-    #[inline]
-    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
-        self.iter().partial_cmp(other.iter())
-    }
-}
-
-impl<V: Ord> Ord for VecMap<V> {
-    #[inline]
-    fn cmp(&self, other: &Self) -> Ordering {
-        self.iter().cmp(other.iter())
-    }
-}
-
-impl<V: fmt::Debug> fmt::Debug for VecMap<V> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        f.debug_map().entries(self).finish()
-    }
-}
-
-impl<V> FromIterator<(usize, V)> for VecMap<V> {
-    fn from_iter<I: IntoIterator<Item = (usize, V)>>(iter: I) -> Self {
-        let mut map = Self::new();
-        map.extend(iter);
-        map
-    }
-}
-
-impl<T> IntoIterator for VecMap<T> {
-    type Item = (usize, T);
-    type IntoIter = IntoIter<T>;
-
-    /// Returns an iterator visiting all key-value pairs in ascending order of
-    /// the keys, consuming the original `VecMap`.
-    /// The iterator's element type is `(usize, &'r V)`.
-    ///
-    /// # Examples
-    ///
-    /// ```
-    /// use vec_map::VecMap;
-    ///
-    /// let mut map = VecMap::new();
-    /// map.insert(1, "a");
-    /// map.insert(3, "c");
-    /// map.insert(2, "b");
-    ///
-    /// let vec: Vec<(usize, &str)> = map.into_iter().collect();
-    ///
-    /// assert_eq!(vec, [(1, "a"), (2, "b"), (3, "c")]);
-    /// ```
-    fn into_iter(self) -> IntoIter<T> {
-        IntoIter {
-            n: self.n,
-            yielded: 0,
-            iter: self.v.into_iter().enumerate()
-        }
-    }
-}
-
-impl<'a, T> IntoIterator for &'a VecMap<T> {
-    type Item = (usize, &'a T);
-    type IntoIter = Iter<'a, T>;
-
-    fn into_iter(self) -> Iter<'a, T> {
-        self.iter()
-    }
-}
-
-impl<'a, T> IntoIterator for &'a mut VecMap<T> {
-    type Item = (usize, &'a mut T);
-    type IntoIter = IterMut<'a, T>;
-
-    fn into_iter(self) -> IterMut<'a, T> {
-        self.iter_mut()
-    }
-}
-
-impl<V> Extend<(usize, V)> for VecMap<V> {
-    fn extend<I: IntoIterator<Item = (usize, V)>>(&mut self, iter: I) {
-        for (k, v) in iter {
-            self.insert(k, v);
-        }
-    }
-}
-
-impl<'a, V: Copy> Extend<(usize, &'a V)> for VecMap<V> {
-    fn extend<I: IntoIterator<Item = (usize, &'a V)>>(&mut self, iter: I) {
-        self.extend(iter.into_iter().map(|(key, &value)| (key, value)));
-    }
-}
-
-impl<V> Index<usize> for VecMap<V> {
-    type Output = V;
-
-    #[inline]
-    fn index(&self, i: usize) -> &V {
-        self.get(i).expect("key not present")
-    }
-}
-
-impl<'a, V> Index<&'a usize> for VecMap<V> {
-    type Output = V;
-
-    #[inline]
-    fn index(&self, i: &usize) -> &V {
-        self.get(*i).expect("key not present")
-    }
-}
-
-impl<V> IndexMut<usize> for VecMap<V> {
-    #[inline]
-    fn index_mut(&mut self, i: usize) -> &mut V {
-        self.get_mut(i).expect("key not present")
-    }
-}
-
-impl<'a, V> IndexMut<&'a usize> for VecMap<V> {
-    #[inline]
-    fn index_mut(&mut self, i: &usize) -> &mut V {
-        self.get_mut(*i).expect("key not present")
-    }
-}
-
-macro_rules! iterator {
-    (impl $name:ident -> $elem:ty, $($getter:ident),+) => {
-        impl<'a, V> Iterator for $name<'a, V> {
-            type Item = $elem;
-
-            #[inline]
-            fn next(&mut self) -> Option<$elem> {
-                while self.front < self.back {
-                    if let Some(elem) = self.iter.next() {
-                        if let Some(x) = elem$(. $getter ())+ {
-                            let index = self.front;
-                            self.front += 1;
-                            self.yielded += 1;
-                            return Some((index, x));
-                        }
-                    }
-                    self.front += 1;
-                }
-                None
-            }
-
-            #[inline]
-            fn size_hint(&self) -> (usize, Option<usize>) {
-                (self.n - self.yielded, Some(self.n - self.yielded))
-            }
-        }
-    }
-}
-
-macro_rules! double_ended_iterator {
-    (impl $name:ident -> $elem:ty, $($getter:ident),+) => {
-        impl<'a, V> DoubleEndedIterator for $name<'a, V> {
-            #[inline]
-            fn next_back(&mut self) -> Option<$elem> {
-                while self.front < self.back {
-                    if let Some(elem) = self.iter.next_back() {
-                        if let Some(x) = elem$(. $getter ())+ {
-                            self.back -= 1;
-                            return Some((self.back, x));
-                        }
-                    }
-                    self.back -= 1;
-                }
-                None
-            }
-        }
-    }
-}
-
-/// An iterator over the key-value pairs of a map.
-pub struct Iter<'a, V: 'a> {
-    front: usize,
-    back: usize,
-    n: usize,
-    yielded: usize,
-    iter: slice::Iter<'a, Option<V>>
-}
-
-// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-impl<'a, V> Clone for Iter<'a, V> {
-    fn clone(&self) -> Iter<'a, V> {
-        Iter {
-            front: self.front,
-            back: self.back,
-            n: self.n,
-            yielded: self.yielded,
-            iter: self.iter.clone()
-        }
-    }
-}
-
-iterator! { impl Iter -> (usize, &'a V), as_ref }
-impl<'a, V> ExactSizeIterator for Iter<'a, V> {}
-double_ended_iterator! { impl Iter -> (usize, &'a V), as_ref }
-
-/// An iterator over the key-value pairs of a map, with the
-/// values being mutable.
-pub struct IterMut<'a, V: 'a> {
-    front: usize,
-    back: usize,
-    n: usize,
-    yielded: usize,
-    iter: slice::IterMut<'a, Option<V>>
-}
-
-iterator! { impl IterMut -> (usize, &'a mut V), as_mut }
-impl<'a, V> ExactSizeIterator for IterMut<'a, V> {}
-double_ended_iterator! { impl IterMut -> (usize, &'a mut V), as_mut }
-
-/// An iterator over the keys of a map.
-pub struct Keys<'a, V: 'a> {
-    iter: Iter<'a, V>,
-}
-
-// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-impl<'a, V> Clone for Keys<'a, V> {
-    fn clone(&self) -> Keys<'a, V> {
-        Keys {
-            iter: self.iter.clone()
-        }
-    }
-}
-
-/// An iterator over the values of a map.
-pub struct Values<'a, V: 'a> {
-    iter: Iter<'a, V>,
-}
-
-// FIXME(#19839) Remove in favor of `#[derive(Clone)]`
-impl<'a, V> Clone for Values<'a, V> {
-    fn clone(&self) -> Values<'a, V> {
-        Values {
-            iter: self.iter.clone()
-        }
-    }
-}
-
-/// An iterator over the values of a map.
-pub struct ValuesMut<'a, V: 'a> {
-    iter_mut: IterMut<'a, V>,
-}
-
-/// A consuming iterator over the key-value pairs of a map.
-pub struct IntoIter<V> {
-    n: usize,
-    yielded: usize,
-    iter: Enumerate<vec::IntoIter<Option<V>>>,
-}
-
-/// A draining iterator over the key-value pairs of a map.
-pub struct Drain<'a, V: 'a> {
-    iter: FilterMap<
-    Enumerate<vec::Drain<'a, Option<V>>>,
-    fn((usize, Option<V>)) -> Option<(usize, V)>>
-}
-
-impl<'a, V> Iterator for Drain<'a, V> {
-    type Item = (usize, V);
-
-    fn next(&mut self) -> Option<(usize, V)> { self.iter.next() }
-    fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
-}
-
-impl<'a, V> ExactSizeIterator for Drain<'a, V> {}
-
-impl<'a, V> DoubleEndedIterator for Drain<'a, V> {
-    fn next_back(&mut self) -> Option<(usize, V)> { self.iter.next_back() }
-}
-
-impl<'a, V> Iterator for Keys<'a, V> {
-    type Item = usize;
-
-    fn next(&mut self) -> Option<usize> { self.iter.next().map(|e| e.0) }
-    fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
-}
-
-impl<'a, V> ExactSizeIterator for Keys<'a, V> {}
-
-impl<'a, V> DoubleEndedIterator for Keys<'a, V> {
-    fn next_back(&mut self) -> Option<usize> { self.iter.next_back().map(|e| e.0) }
-}
-
-impl<'a, V> Iterator for Values<'a, V> {
-    type Item = &'a V;
-
-    fn next(&mut self) -> Option<(&'a V)> { self.iter.next().map(|e| e.1) }
-    fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
-}
-
-impl<'a, V> ExactSizeIterator for Values<'a, V> {}
-
-impl<'a, V> DoubleEndedIterator for Values<'a, V> {
-    fn next_back(&mut self) -> Option<(&'a V)> { self.iter.next_back().map(|e| e.1) }
-}
-
-impl<'a, V> Iterator for ValuesMut<'a, V> {
-    type Item = &'a mut V;
-
-    fn next(&mut self) -> Option<(&'a mut V)> { self.iter_mut.next().map(|e| e.1) }
-    fn size_hint(&self) -> (usize, Option<usize>) { self.iter_mut.size_hint() }
-}
-
-impl<'a, V> ExactSizeIterator for ValuesMut<'a, V> {}
-
-impl<'a, V> DoubleEndedIterator for ValuesMut<'a, V> {
-    fn next_back(&mut self) -> Option<&'a mut V> { self.iter_mut.next_back().map(|e| e.1) }
-}
-
-impl<V> Iterator for IntoIter<V> {
-    type Item = (usize, V);
-
-    fn next(&mut self) -> Option<(usize, V)> {
-        loop {
-            match self.iter.next() {
-                None => return None,
-                Some((i, Some(value))) => {
-                    self.yielded += 1;
-                    return Some((i, value))
-                },
-                _ => {}
-            }
-        }
-    }
-
-    fn size_hint(&self) -> (usize, Option<usize>) {
-        (self.n - self.yielded, Some(self.n - self.yielded))
-    }
-}
-
-impl<V> ExactSizeIterator for IntoIter<V> {}
-
-impl<V> DoubleEndedIterator for IntoIter<V> {
-    fn next_back(&mut self) -> Option<(usize, V)> {
-        loop {
-            match self.iter.next_back() {
-                None => return None,
-                Some((i, Some(value))) => return Some((i, value)),
-                _ => {}
-            }
-        }
-    }
-}
-
-#[allow(dead_code)]
-fn assert_properties() {
-    fn vec_map_covariant<'a, T>(map: VecMap<&'static T>) -> VecMap<&'a T> { map }
-
-    fn into_iter_covariant<'a, T>(iter: IntoIter<&'static T>) -> IntoIter<&'a T> { iter }
-
-    fn iter_covariant<'i, 'a, T>(iter: Iter<'i, &'static T>) -> Iter<'i, &'a T> { iter }
-
-    fn keys_covariant<'i, 'a, T>(iter: Keys<'i, &'static T>) -> Keys<'i, &'a T> { iter }
-
-    fn values_covariant<'i, 'a, T>(iter: Values<'i, &'static T>) -> Values<'i, &'a T> { iter }
-}
-
-#[cfg(test)]
-mod test {
-    use super::VecMap;
-    use super::Entry::{Occupied, Vacant};
-    use std::hash::{Hash, Hasher};
-    use std::collections::hash_map::DefaultHasher;
-
-    #[test]
-    fn test_get_mut() {
-        let mut m = VecMap::new();
-        assert!(m.insert(1, 12).is_none());
-        assert!(m.insert(2, 8).is_none());
-        assert!(m.insert(5, 14).is_none());
-        let new = 100;
-        match m.get_mut(5) {
-            None => panic!(), Some(x) => *x = new
-        }
-        assert_eq!(m.get(5), Some(&new));
-    }
-
-    #[test]
-    fn test_len() {
-        let mut map = VecMap::new();
-        assert_eq!(map.len(), 0);
-        assert!(map.is_empty());
-        assert!(map.insert(5, 20).is_none());
-        assert_eq!(map.len(), 1);
-        assert!(!map.is_empty());
-        assert!(map.insert(11, 12).is_none());
-        assert_eq!(map.len(), 2);
-        assert!(!map.is_empty());
-        assert!(map.insert(14, 22).is_none());
-        assert_eq!(map.len(), 3);
-        assert!(!map.is_empty());
-    }
-
-    #[test]
-    fn test_clear() {
-        let mut map = VecMap::new();
-        assert!(map.insert(5, 20).is_none());
-        assert!(map.insert(11, 12).is_none());
-        assert!(map.insert(14, 22).is_none());
-        map.clear();
-        assert!(map.is_empty());
-        assert!(map.get(5).is_none());
-        assert!(map.get(11).is_none());
-        assert!(map.get(14).is_none());
-    }
-
-    #[test]
-    fn test_insert() {
-        let mut m = VecMap::new();
-        assert_eq!(m.insert(1, 2), None);
-        assert_eq!(m.insert(1, 3), Some(2));
-        assert_eq!(m.insert(1, 4), Some(3));
-    }
-
-    #[test]
-    fn test_remove() {
-        let mut m = VecMap::new();
-        m.insert(1, 2);
-        assert_eq!(m.remove(1), Some(2));
-        assert_eq!(m.remove(1), None);
-    }
-
-    #[test]
-    fn test_keys() {
-        let mut map = VecMap::new();
-        map.insert(1, 'a');
-        map.insert(2, 'b');
-        map.insert(3, 'c');
-        let keys: Vec<_> = map.keys().collect();
-        assert_eq!(keys.len(), 3);
-        assert!(keys.contains(&1));
-        assert!(keys.contains(&2));
-        assert!(keys.contains(&3));
-    }
-
-    #[test]
-    fn test_values() {
-        let mut map = VecMap::new();
-        map.insert(1, 'a');
-        map.insert(2, 'b');
-        map.insert(3, 'c');
-        let values: Vec<_> = map.values().cloned().collect();
-        assert_eq!(values.len(), 3);
-        assert!(values.contains(&'a'));
-        assert!(values.contains(&'b'));
-        assert!(values.contains(&'c'));
-    }
-
-    #[test]
-    fn test_iterator() {
-        let mut m = VecMap::new();
-
-        assert!(m.insert(0, 1).is_none());
-        assert!(m.insert(1, 2).is_none());
-        assert!(m.insert(3, 5).is_none());
-        assert!(m.insert(6, 10).is_none());
-        assert!(m.insert(10, 11).is_none());
-
-        let mut it = m.iter();
-        assert_eq!(it.size_hint(), (5, Some(5)));
-        assert_eq!(it.next().unwrap(), (0, &1));
-        assert_eq!(it.size_hint(), (4, Some(4)));
-        assert_eq!(it.next().unwrap(), (1, &2));
-        assert_eq!(it.size_hint(), (3, Some(3)));
-        assert_eq!(it.next().unwrap(), (3, &5));
-        assert_eq!(it.size_hint(), (2, Some(2)));
-        assert_eq!(it.next().unwrap(), (6, &10));
-        assert_eq!(it.size_hint(), (1, Some(1)));
-        assert_eq!(it.next().unwrap(), (10, &11));
-        assert_eq!(it.size_hint(), (0, Some(0)));
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_iterator_size_hints() {
-        let mut m = VecMap::new();
-
-        assert!(m.insert(0, 1).is_none());
-        assert!(m.insert(1, 2).is_none());
-        assert!(m.insert(3, 5).is_none());
-        assert!(m.insert(6, 10).is_none());
-        assert!(m.insert(10, 11).is_none());
-
-        assert_eq!(m.iter().size_hint(), (5, Some(5)));
-        assert_eq!(m.iter().rev().size_hint(), (5, Some(5)));
-        assert_eq!(m.iter_mut().size_hint(), (5, Some(5)));
-        assert_eq!(m.iter_mut().rev().size_hint(), (5, Some(5)));
-    }
-
-    #[test]
-    fn test_mut_iterator() {
-        let mut m = VecMap::new();
-
-        assert!(m.insert(0, 1).is_none());
-        assert!(m.insert(1, 2).is_none());
-        assert!(m.insert(3, 5).is_none());
-        assert!(m.insert(6, 10).is_none());
-        assert!(m.insert(10, 11).is_none());
-
-        for (k, v) in &mut m {
-            *v += k as isize;
-        }
-
-        let mut it = m.iter();
-        assert_eq!(it.next().unwrap(), (0, &1));
-        assert_eq!(it.next().unwrap(), (1, &3));
-        assert_eq!(it.next().unwrap(), (3, &8));
-        assert_eq!(it.next().unwrap(), (6, &16));
-        assert_eq!(it.next().unwrap(), (10, &21));
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_rev_iterator() {
-        let mut m = VecMap::new();
-
-        assert!(m.insert(0, 1).is_none());
-        assert!(m.insert(1, 2).is_none());
-        assert!(m.insert(3, 5).is_none());
-        assert!(m.insert(6, 10).is_none());
-        assert!(m.insert(10, 11).is_none());
-
-        let mut it = m.iter().rev();
-        assert_eq!(it.next().unwrap(), (10, &11));
-        assert_eq!(it.next().unwrap(), (6, &10));
-        assert_eq!(it.next().unwrap(), (3, &5));
-        assert_eq!(it.next().unwrap(), (1, &2));
-        assert_eq!(it.next().unwrap(), (0, &1));
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_mut_rev_iterator() {
-        let mut m = VecMap::new();
-
-        assert!(m.insert(0, 1).is_none());
-        assert!(m.insert(1, 2).is_none());
-        assert!(m.insert(3, 5).is_none());
-        assert!(m.insert(6, 10).is_none());
-        assert!(m.insert(10, 11).is_none());
-
-        for (k, v) in m.iter_mut().rev() {
-            *v += k as isize;
-        }
-
-        let mut it = m.iter();
-        assert_eq!(it.next().unwrap(), (0, &1));
-        assert_eq!(it.next().unwrap(), (1, &3));
-        assert_eq!(it.next().unwrap(), (3, &8));
-        assert_eq!(it.next().unwrap(), (6, &16));
-        assert_eq!(it.next().unwrap(), (10, &21));
-        assert!(it.next().is_none());
-    }
-
-    #[test]
-    fn test_move_iter() {
-        let mut m: VecMap<Box<_>> = VecMap::new();
-        m.insert(1, Box::new(2));
-        let mut called = false;
-        for (k, v) in m {
-            assert!(!called);
-            called = true;
-            assert_eq!(k, 1);
-            assert_eq!(v, Box::new(2));
-        }
-        assert!(called);
-    }
-
-    #[test]
-    fn test_drain_iterator() {
-        let mut map = VecMap::new();
-        map.insert(1, "a");
-        map.insert(3, "c");
-        map.insert(2, "b");
-
-        let vec: Vec<_> = map.drain().collect();
-
-        assert_eq!(vec, [(1, "a"), (2, "b"), (3, "c")]);
-        assert_eq!(map.len(), 0);
-    }
-
-    #[test]
-    fn test_append() {
-        let mut a = VecMap::new();
-        a.insert(1, "a");
-        a.insert(2, "b");
-        a.insert(3, "c");
-
-        let mut b = VecMap::new();
-        b.insert(3, "d");  // Overwrite element from a
-        b.insert(4, "e");
-        b.insert(5, "f");
-
-        a.append(&mut b);
-
-        assert_eq!(a.len(), 5);
-        assert_eq!(b.len(), 0);
-        // Capacity shouldn't change for possible reuse
-        assert!(b.capacity() >= 4);
-
-        assert_eq!(a[1], "a");
-        assert_eq!(a[2], "b");
-        assert_eq!(a[3], "d");
-        assert_eq!(a[4], "e");
-        assert_eq!(a[5], "f");
-    }
-
-    #[test]
-    fn test_split_off() {
-        // Split within the key range
-        let mut a = VecMap::new();
-        a.insert(1, "a");
-        a.insert(2, "b");
-        a.insert(3, "c");
-        a.insert(4, "d");
-
-        let b = a.split_off(3);
-
-        assert_eq!(a.len(), 2);
-        assert_eq!(b.len(), 2);
-
-        assert_eq!(a[1], "a");
-        assert_eq!(a[2], "b");
-
-        assert_eq!(b[3], "c");
-        assert_eq!(b[4], "d");
-
-        // Split at 0
-        a.clear();
-        a.insert(1, "a");
-        a.insert(2, "b");
-        a.insert(3, "c");
-        a.insert(4, "d");
-
-        let b = a.split_off(0);
-
-        assert_eq!(a.len(), 0);
-        assert_eq!(b.len(), 4);
-        assert_eq!(b[1], "a");
-        assert_eq!(b[2], "b");
-        assert_eq!(b[3], "c");
-        assert_eq!(b[4], "d");
-
-        // Split behind max_key
-        a.clear();
-        a.insert(1, "a");
-        a.insert(2, "b");
-        a.insert(3, "c");
-        a.insert(4, "d");
-
-        let b = a.split_off(5);
-
-        assert_eq!(a.len(), 4);
-        assert_eq!(b.len(), 0);
-        assert_eq!(a[1], "a");
-        assert_eq!(a[2], "b");
-        assert_eq!(a[3], "c");
-        assert_eq!(a[4], "d");
-    }
-
-    #[test]
-    fn test_show() {
-        let mut map = VecMap::new();
-        let empty = VecMap::<i32>::new();
-
-        map.insert(1, 2);
-        map.insert(3, 4);
-
-        let map_str = format!("{:?}", map);
-        assert!(map_str == "{1: 2, 3: 4}" || map_str == "{3: 4, 1: 2}");
-        assert_eq!(format!("{:?}", empty), "{}");
-    }
-
-    #[test]
-    fn test_clone() {
-        let mut a = VecMap::new();
-
-        a.insert(1, 'x');
-        a.insert(4, 'y');
-        a.insert(6, 'z');
-
-        assert_eq!(a.clone().iter().collect::<Vec<_>>(), [(1, &'x'), (4, &'y'), (6, &'z')]);
-    }
-
-    #[test]
-    fn test_eq() {
-        let mut a = VecMap::new();
-        let mut b = VecMap::new();
-
-        assert!(a == b);
-        assert!(a.insert(0, 5).is_none());
-        assert!(a != b);
-        assert!(b.insert(0, 4).is_none());
-        assert!(a != b);
-        assert!(a.insert(5, 19).is_none());
-        assert!(a != b);
-        assert!(!b.insert(0, 5).is_none());
-        assert!(a != b);
-        assert!(b.insert(5, 19).is_none());
-        assert!(a == b);
-
-        a = VecMap::new();
-        b = VecMap::with_capacity(1);
-        assert!(a == b);
-    }
-
-    #[test]
-    fn test_lt() {
-        let mut a = VecMap::new();
-        let mut b = VecMap::new();
-
-        assert!(!(a < b) && !(b < a));
-        assert!(b.insert(2, 5).is_none());
-        assert!(a < b);
-        assert!(a.insert(2, 7).is_none());
-        assert!(!(a < b) && b < a);
-        assert!(b.insert(1, 0).is_none());
-        assert!(b < a);
-        assert!(a.insert(0, 6).is_none());
-        assert!(a < b);
-        assert!(a.insert(6, 2).is_none());
-        assert!(a < b && !(b < a));
-    }
-
-    #[test]
-    fn test_ord() {
-        let mut a = VecMap::new();
-        let mut b = VecMap::new();
-
-        assert!(a <= b && a >= b);
-        assert!(a.insert(1, 1).is_none());
-        assert!(a > b && a >= b);
-        assert!(b < a && b <= a);
-        assert!(b.insert(2, 2).is_none());
-        assert!(b > a && b >= a);
-        assert!(a < b && a <= b);
-    }
-
-    #[test]
-    fn test_hash() {
-        fn hash<T: Hash>(t: &T) -> u64 {
-            let mut s = DefaultHasher::new();
-            t.hash(&mut s);
-            s.finish()
-        }
-
-        let mut x = VecMap::new();
-        let mut y = VecMap::new();
-
-        assert!(hash(&x) == hash(&y));
-        x.insert(1, 'a');
-        x.insert(2, 'b');
-        x.insert(3, 'c');
-
-        y.insert(3, 'c');
-        y.insert(2, 'b');
-        y.insert(1, 'a');
-
-        assert!(hash(&x) == hash(&y));
-
-        x.insert(1000, 'd');
-        x.remove(1000);
-
-        assert!(hash(&x) == hash(&y));
-    }
-
-    #[test]
-    fn test_from_iter() {
-        let xs = [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')];
-
-        let map: VecMap<_> = xs.iter().cloned().collect();
-
-        for &(k, v) in &xs {
-            assert_eq!(map.get(k), Some(&v));
-        }
-    }
-
-    #[test]
-    fn test_index() {
-        let mut map = VecMap::new();
-
-        map.insert(1, 2);
-        map.insert(2, 1);
-        map.insert(3, 4);
-
-        assert_eq!(map[3], 4);
-    }
-
-    #[test]
-    #[should_panic]
-    fn test_index_nonexistent() {
-        let mut map = VecMap::new();
-
-        map.insert(1, 2);
-        map.insert(2, 1);
-        map.insert(3, 4);
-
-        map[4];
-    }
-
-    #[test]
-    fn test_entry() {
-        let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];
-
-        let mut map: VecMap<_> = xs.iter().cloned().collect();
-
-        // Existing key (insert)
-        match map.entry(1) {
-            Vacant(_) => unreachable!(),
-            Occupied(mut view) => {
-                assert_eq!(view.get(), &10);
-                assert_eq!(view.insert(100), 10);
-            }
-        }
-
-        assert_eq!(map.get(1).unwrap(), &100);
-        assert_eq!(map.len(), 6);
-
-        // Existing key (update)
-        match map.entry(2) {
-            Vacant(_) => unreachable!(),
-            Occupied(mut view) => {
-                let v = view.get_mut();
-                *v *= 10;
-            }
-        }
-
-        assert_eq!(map.get(2).unwrap(), &200);
-        assert_eq!(map.len(), 6);
-
-        // Existing key (take)
-        match map.entry(3) {
-            Vacant(_) => unreachable!(),
-            Occupied(view) => {
-                assert_eq!(view.remove(), 30);
-            }
-        }
-
-        assert_eq!(map.get(3), None);
-        assert_eq!(map.len(), 5);
-
-        // Inexistent key (insert)
-        match map.entry(10) {
-            Occupied(_) => unreachable!(),
-            Vacant(view) => {
-                assert_eq!(*view.insert(1000), 1000);
-            }
-        }
-
-        assert_eq!(map.get(10).unwrap(), &1000);
-        assert_eq!(map.len(), 6);
-    }
-
-    #[test]
-    fn test_extend_ref() {
-        let mut a = VecMap::new();
-        a.insert(1, "one");
-        let mut b = VecMap::new();
-        b.insert(2, "two");
-        b.insert(3, "three");
-
-        a.extend(&b);
-
-        assert_eq!(a.len(), 3);
-        assert_eq!(a[&1], "one");
-        assert_eq!(a[&2], "two");
-        assert_eq!(a[&3], "three");
-    }
-
-    #[test]
-    #[cfg(feature = "serde")]
-    fn test_serde() {
-        use serde::{Serialize, Deserialize};
-        fn impls_serde_traits<'de, S: Serialize + Deserialize<'de>>() {}
-
-        impls_serde_traits::<VecMap<u32>>();
-    }
-
-    #[test]
-    fn test_retain() {
-        let mut map = VecMap::new();
-        map.insert(1, "one");
-        map.insert(2, "two");
-        map.insert(3, "three");
-        map.retain(|k, v| match k {
-            1 => false,
-            2 => {
-                *v = "two changed";
-                true
-            },
-            3 => false,
-            _ => panic!(),
-        });
-
-        assert_eq!(map.len(), 1);
-        assert_eq!(map.get(1), None);
-        assert_eq!(map[2], "two changed");
-        assert_eq!(map.get(3), None);
-    }
-}
diff --git a/third_party/wpt_tools/README.chromium b/third_party/wpt_tools/README.chromium
index c2d313f..63c4719d 100644
--- a/third_party/wpt_tools/README.chromium
+++ b/third_party/wpt_tools/README.chromium
@@ -1,7 +1,7 @@
 Name: web-platform-tests - Test Suites for Web Platform specifications
 Short Name: wpt
 URL: https://github.com/web-platform-tests/wpt/
-Version: 09b8d2f86aad400d77e49ae8ad217f6a2196efa1
+Version: b1d216fe8b06a152b11e3fca6677becb4be717c4
 License: LICENSES FOR W3C TEST SUITES (https://www.w3.org/Consortium/Legal/2008/03-bsd-license.html)
 License File: NOT_SHIPPED
 Security Critical: no
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py
index 733dba0..b6e4e78 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py
@@ -321,6 +321,7 @@
         self.test_count = 0
         self.unexpected_count = 0
         self.unexpected_pass_count = 0
+        self.unexpected_tests = set()
 
         # This may not really be what we want
         self.daemon = True
@@ -673,6 +674,9 @@
         if is_unexpected_pass:
             self.unexpected_pass_count += 1
 
+        if is_unexpected or subtest_unexpected:
+            self.unexpected_tests.add(test.id)
+
         if "assertion_count" in file_result.extra:
             assertion_count = file_result.extra["assertion_count"]
             if assertion_count is not None and assertion_count > 0:
@@ -899,12 +903,11 @@
     def run(self, test_type, tests):
         """Start all managers in the group"""
         self.logger.debug("Using %i processes" % self.size)
-        type_tests = tests[test_type]
-        if not type_tests:
+        if not tests:
             self.logger.info("No %s tests to run" % test_type)
             return
 
-        test_queue = make_test_queue(type_tests, self.test_source_cls, **self.test_source_kwargs)
+        test_queue = make_test_queue(tests, self.test_source_cls, **self.test_source_kwargs)
 
         for idx in range(self.size):
             manager = TestRunnerManager(self.suite_name,
@@ -948,3 +951,6 @@
 
     def unexpected_pass_count(self):
         return sum(manager.unexpected_pass_count for manager in self.pool)
+
+    def unexpected_tests(self):
+        return set().union(*(manager.unexpected_tests for manager in self.pool))
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py
index 115e9de..a9c63f98 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py
@@ -180,6 +180,12 @@
                                  help="Number of times to run the tests, restarting between each run")
     debugging_group.add_argument("--repeat-until-unexpected", action="store_true", default=None,
                                  help="Run tests in a loop until one returns an unexpected result")
+    debugging_group.add_argument('--retry-unexpected', type=int, default=0,
+                                 help=('Maximum number of times to retry '
+                                       'each test that consistently runs '
+                                       'unexpectedly in the initial repeat '
+                                       'loop. A retried test takes any '
+                                       'expected status as its final result.'))
     debugging_group.add_argument('--pause-after-test', action="store_true", default=None,
                                  help="Halt the test runner after each test (this happens by default if only a single test is run)")
     debugging_group.add_argument('--no-pause-after-test', dest="pause_after_test", action="store_false",
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptrunner.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptrunner.py
index 6a661db..af6651a0 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptrunner.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptrunner.py
@@ -158,7 +158,7 @@
 def run_test_iteration(test_status, test_loader, test_source_kwargs, test_source_cls, run_info,
                        recording, test_environment, product, run_test_kwargs):
     """Runs the entire test suite.
-    This is called for each repeat run requested."""
+    This is called for each repeat or retry run requested."""
     tests = []
     for test_type in test_loader.test_types:
         tests.extend(test_loader.tests[test_type])
@@ -170,6 +170,12 @@
         logger.critical("Loading tests failed")
         return False
 
+    if test_status.retries_remaining:
+        for test_type, tests in dict(test_groups).items():
+            test_groups[test_type] = [test for test in tests
+                                      if test in test_status.unexpected_tests]
+
+    unexpected_tests = set()
     logger.suite_start(test_groups,
                        name='web-platform-test',
                        run_info=run_info,
@@ -178,7 +184,6 @@
         logger.info(f"Running {test_type} tests")
 
         browser_cls = product.get_browser_cls(test_type)
-
         browser_kwargs = product.get_browser_kwargs(logger,
                                                     test_type,
                                                     run_info,
@@ -203,7 +208,7 @@
             test_status.skipped += 1
 
         if test_type == "testharness":
-            run_tests = {"testharness": []}
+            tests_to_run = []
             for test in test_loader.tests["testharness"]:
                 if ((test.testdriver and not executor_cls.supports_testdriver) or
                         (test.jsshell and not executor_cls.supports_jsshell)):
@@ -211,9 +216,12 @@
                     logger.test_end(test.id, status="SKIP")
                     test_status.skipped += 1
                 else:
-                    run_tests["testharness"].append(test)
+                    tests_to_run.append(test)
         else:
-            run_tests = test_loader.tests
+            tests_to_run = test_loader.tests[test_type]
+        if test_status.retries_remaining:
+            tests_to_run = [test for test in tests_to_run
+                            if test.id in test_status.unexpected_tests]
 
         recording.pause()
         with ManagerGroup("web-platform-tests",
@@ -233,7 +241,7 @@
                           run_test_kwargs["restart_on_new_group"],
                           recording=recording) as manager_group:
             try:
-                manager_group.run(test_type, run_tests)
+                manager_group.run(test_type, tests_to_run)
             except KeyboardInterrupt:
                 logger.critical("Main thread got signal")
                 manager_group.stop()
@@ -241,6 +249,12 @@
             test_status.total_tests += manager_group.test_count()
             test_status.unexpected += manager_group.unexpected_count()
             test_status.unexpected_pass += manager_group.unexpected_pass_count()
+            unexpected_tests.update(manager_group.unexpected_tests())
+
+    if test_status.repeated_runs == 1:
+        test_status.unexpected_tests = unexpected_tests
+    else:
+        test_status.unexpected_tests &= unexpected_tests
 
     return True
 
@@ -282,6 +296,8 @@
         self.repeated_runs = 0
         self.expected_repeated_runs = 0
         self.all_skipped = False
+        self.unexpected_tests = set()
+        self.retries_remaining = 0
 
 
 def run_tests(config, test_paths, product, **kwargs):
@@ -428,10 +444,44 @@
                     test_status.all_skipped = True
                     break
 
+            if not test_status.all_skipped and kwargs["retry_unexpected"] > 0:
+                retry_success = retry_unexpected_tests(test_status, test_loader,
+                                                       test_source_kwargs,
+                                                       test_source_cls, run_info,
+                                                       recording, test_environment,
+                                                       product, kwargs)
+                if not retry_success:
+                    return False, test_status
+
     # Return the evaluation of the runs and the number of repeated iterations that were run.
     return evaluate_runs(test_status, kwargs), test_status
 
 
+def retry_unexpected_tests(test_status, test_loader, test_source_kwargs,
+                           test_source_cls, run_info, recording,
+                           test_environment, product, kwargs):
+    kwargs["rerun"] = 1
+    max_retries = kwargs["retry_unexpected"]
+    test_status.retries_remaining = max_retries
+    while (test_status.retries_remaining > 0 and not
+           evaluate_runs(test_status, kwargs)):
+        logger.info(f"Retry {max_retries - test_status.retries_remaining + 1}")
+        test_status.total_tests = 0
+        test_status.skipped = 0
+        test_status.unexpected = 0
+        test_status.unexpected_pass = 0
+        iter_success = run_test_iteration(test_status, test_loader,
+                                          test_source_kwargs, test_source_cls,
+                                          run_info, recording, test_environment,
+                                          product, kwargs)
+        if not iter_success:
+            return False
+        recording.set(["after-end"])
+        logger.suite_end()
+        test_status.retries_remaining -= 1
+    return True
+
+
 def check_stability(**kwargs):
     from . import stability
     if kwargs["stability"]:
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
index cbea1c4e..964581f 100644
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec
@@ -997,6 +997,9 @@
   "ui/views/resources/views_resources.grd": {
     "structures": [4840],
   },
+  "ui/webui/examples/resources/webui_examples_resources.grd": {
+    "messages": [4850],
+  },
   "ui/webui/resources/webui_resources.grd": {
     "includes": [4860],
     "structures": [4880],
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 925c730..45f2632 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -233,7 +233,7 @@
       'Dawn Linux x64 DEPS Builder': 'dawn_tests_with_desktop_gl_release_trybot_reclient',
 
       'Dawn Mac x64 Builder': 'dawn_tests_release_bot_dcheck_always_on_alloc_none_reclient',
-      'Dawn Mac x64 DEPS Builder': 'dawn_tests_release_bot_dcheck_always_on_alloc_none',
+      'Dawn Mac x64 DEPS Builder': 'dawn_tests_release_bot_dcheck_always_on_alloc_none_reclient',
 
       'Dawn Win10 x64 ASAN Release': 'dawn_tests_asan_release_bot_dcheck_always_on_reclient',
       'Dawn Win10 x64 Builder': 'dawn_tests_release_bot_dcheck_always_on_reclient',
@@ -420,7 +420,7 @@
       'ios-m1-simulator': 'ios_simulator_debug_static_bot_xctest_arm64',
       'ios-m1-simulator-cronet': 'ios_cronet_xctest_arm64',
       'ios-reclient': 'ios_simulator_debug_static_bot_xctest_reclient',
-      'ios-simulator-code-coverage': 'clang_code_coverage_ios_xctest',
+      'ios-simulator-code-coverage': 'clang_code_coverage_ios_xctest_reclient',
       'ios-simulator-cr-recipe': 'ios_simulator_debug_static_bot_xctest',
       'ios-simulator-cronet': 'ios_cronet_xctest_reclient',
       'ios-simulator-multi-window': 'ios_simulator_debug_static_bot_xctest',
@@ -564,7 +564,7 @@
       'GPU Linux Builder': 'gpu_tests_release_trybot_minimal_symbols_reclient',
       'GPU Linux Builder (dbg)': 'gpu_tests_debug_bot_reclient',
       'GPU Mac Builder': 'gpu_tests_release_trybot_minimal_symbols_reclient',
-      'GPU Mac Builder (dbg)': 'gpu_tests_debug_bot',
+      'GPU Mac Builder (dbg)': 'gpu_tests_debug_bot_reclient',
       'GPU Mac Builder (reclient shadow)': 'gpu_tests_release_trybot_minimal_symbols_reclient',
       'GPU Win x64 Builder': 'gpu_tests_release_bot_dcheck_always_on_resource_allowlisting_reclient',
       'GPU Win x64 Builder (dbg)': 'gpu_tests_debug_bot_reclient',
@@ -2324,8 +2324,8 @@
       'release_bot', 'clang', 'use_clang_coverage', 'no_symbols',
     ],
 
-    'clang_code_coverage_ios_xctest': [
-      'use_clang_coverage', 'debug_static_bot', 'x64', 'ios', 'xctest', 'ios_disable_xcode_project_generation',
+    'clang_code_coverage_ios_xctest_reclient': [
+      'use_clang_coverage', 'debug_static_bot_reclient', 'x64', 'ios', 'xctest', 'ios_disable_xcode_project_generation',
     ],
 
     'clang_code_coverage_reclient': [
@@ -2451,10 +2451,6 @@
 
     # https://crbug.com/dawn/1200: temporarily avoid using partition alloc
     # while we investigate a crash in the mac AMD shader compiler.
-    'dawn_tests_release_bot_dcheck_always_on_alloc_none': [
-      'dawn_tests', 'release_trybot_minimal_symbols', 'padisabled',
-    ],
-
     'dawn_tests_release_bot_dcheck_always_on_alloc_none_reclient': [
       'dawn_tests', 'release_trybot_minimal_symbols_reclient', 'padisabled',
     ],
diff --git a/tools/mb/mb_config_expectations/chromium.dawn.json b/tools/mb/mb_config_expectations/chromium.dawn.json
index 987f0b8..2b692a3 100644
--- a/tools/mb/mb_config_expectations/chromium.dawn.json
+++ b/tools/mb/mb_config_expectations/chromium.dawn.json
@@ -44,7 +44,7 @@
       "symbol_level": 1,
       "use_allocator": "none",
       "use_dawn": true,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "Dawn Win10 x64 ASAN Release": {
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json
index 7cd62df..26236933 100644
--- a/tools/mb/mb_config_expectations/chromium.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -950,7 +950,7 @@
       "target_cpu": "x64",
       "target_os": "ios",
       "use_clang_coverage": true,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "ios-simulator-cr-recipe": {
diff --git a/tools/mb/mb_config_expectations/chromium.gpu.json b/tools/mb/mb_config_expectations/chromium.gpu.json
index 2fd70a7..ef95230e 100644
--- a/tools/mb/mb_config_expectations/chromium.gpu.json
+++ b/tools/mb/mb_config_expectations/chromium.gpu.json
@@ -53,7 +53,7 @@
       "is_debug": true,
       "proprietary_codecs": true,
       "symbol_level": 1,
-      "use_goma": true
+      "use_remoteexec": true
     }
   },
   "GPU Mac Builder (reclient shadow)": {
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index eeba8e2..2f17f35 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -18382,6 +18382,11 @@
   <description>User pressed 'Search Copied Image' in the app menu.</description>
 </action>
 
+<action name="MobileMenuSelectTabs">
+  <owner>ckitagawa@chromium.org</owner>
+  <description>User selected tabs in the mobile tab switcher.</description>
+</action>
+
 <action name="MobileMenuSettings">
   <owner>aurimas@chromium.org</owner>
   <description>User pressed 'Settings' in the app menu.</description>
@@ -34383,6 +34388,8 @@
       label="For Global Media Controls Cast start and stop feature."/>
   <suffix name="HighEfficiencyInfoMode"
       label="For HighEfficiencyInfoMode feature."/>
+  <suffix name="HighEfficiencyModeFeature"
+      label="For suggesting High Efficiency Mode feature"/>
   <suffix name="HomePageButton" label="For HomePageButton feature."/>
   <suffix name="HomepageTile" label="For HomepageTile feature."/>
   <suffix name="IdentityDisc" label="For IdentityDisc feature."/>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index c817432..3c69b31 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -7237,6 +7237,9 @@
              fill)"/>
   <int value="56"
       label="Local suggestion of a deduped server card filled (once)"/>
+  <int value="57"
+      label="Autofilled field was cleared by JavaScript immediately after
+             fill (once)"/>
 </enum>
 
 <enum name="AutofillFormSubmittedState">
@@ -7402,6 +7405,12 @@
              response"/>
 </enum>
 
+<enum name="AutofillPhoneImportValidity">
+  <int value="0" label="None: No phone number in import"/>
+  <int value="1" label="Valid: Phone number was imported"/>
+  <int value="2" label="Invalid: Phone number was removed before the import"/>
+</enum>
+
 <enum name="AutofillPopupHidingReason">
   <int value="0" label="A suggestion was accepted."/>
   <int value="1" label="An interstitial page displaces the popup."/>
@@ -41336,7 +41345,8 @@
   <int value="4296" label="ParentOfDisabledFormControlRespondsToMouseEvents"/>
   <int value="4297" label="UnhandledExceptionCountInMainThread"/>
   <int value="4298" label="UnhandledExceptionCountInWorker"/>
-  <int value="4299" label="WebCodecsImageDecoderPremultiplyAlphaDeprecation"/>
+  <int value="4299"
+      label="OBSOLETE_WebCodecsImageDecoderPremultiplyAlphaDeprecation"/>
   <int value="4300" label="CookieDomainNonASCII"/>
   <int value="4301" label="ClientHintsMetaEquivDelegateCH"/>
   <int value="4302" label="ExpectCTHeader"/>
@@ -41395,6 +41405,9 @@
   <int value="4354" label="V8AsyncStackTaggingCreateTaskCall"/>
   <int value="4355" label="WebkitBoxWithoutWebkitLineClamp"/>
   <int value="4356" label="DataUrlInSvgUse"/>
+  <int value="4357" label="WebAuthnConditionalUiGet"/>
+  <int value="4358" label="WebAuthnConditionalUiGetSuccess"/>
+  <int value="4359" label="WebAuthnRkRequiredCreationSuccess"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -75216,6 +75229,12 @@
   <int value="23" label="Zoom"/>
 </enum>
 
+<enum name="PageActionPageEvent">
+  <int value="0" label="Page Shown"/>
+  <int value="1" label="Action Shown"/>
+  <int value="2" label="Multiple Actions Shown"/>
+</enum>
+
 <enum name="PageEndReason">
   <int value="0" label="END_NONE">
     Page lifetime has not yet ended (page is still active)
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index 35dc54d..4d26df7 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -3247,6 +3247,30 @@
   </summary>
 </histogram>
 
+<histogram name="Android.RequestDesktopSite.DomainSettingChanged"
+    enum="Boolean" expires_after="2023-03-19">
+  <owner>shuyng@google.com</owner>
+  <owner>twellington@chromium.org</owner>
+  <summary>
+    Records the new domain level Request Desktop Setting when changed. False
+    means Mobile site while true means Desktop site. This is recorded when a
+    user manually edits a domain level Request Desktop Setting from the site
+    settings exception list.
+  </summary>
+</histogram>
+
+<histogram name="Android.RequestDesktopSite.SubDomainSettingChanged"
+    enum="Boolean" expires_after="2023-03-19">
+  <owner>shuyng@google.com</owner>
+  <owner>twellington@chromium.org</owner>
+  <summary>
+    Records the new subdomain level Request Desktop Setting when changed. False
+    means Mobile site while true means Desktop site. This is recorded when a
+    user manually edits a subdomain level Request Desktop Setting from the site
+    settings exception list.
+  </summary>
+</histogram>
+
 <histogram name="Android.RequestDesktopSite.TabletEligible" enum="Boolean"
     expires_after="2022-04-17">
   <owner>gangwu@chromium.org</owner>
@@ -3278,6 +3302,32 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Android.RequestDesktopSite.UserSwitchToDesktop.DomainSettingAdded"
+    enum="Boolean" expires_after="2023-03-19">
+  <owner>shuyng@google.com</owner>
+  <owner>twellington@chromium.org</owner>
+  <summary>
+    Records the new domain level Request Desktop Setting when added. False means
+    Mobile site while true means Desktop site. This is recorded when a user
+    manually adds a domain level Request Desktop Setting from the Add site
+    dialog in Site settings.
+  </summary>
+</histogram>
+
+<histogram
+    name="Android.RequestDesktopSite.UserSwitchToDesktop.SubDomainSettingAdded"
+    enum="Boolean" expires_after="2023-03-19">
+  <owner>shuyng@google.com</owner>
+  <owner>twellington@chromium.org</owner>
+  <summary>
+    Records the new subdomain level Request Desktop Setting when added. False
+    means Mobile site while true means Desktop site. This is recorded when a
+    user manually adds a subdomain level Request Desktop Setting from the Add
+    site dialog in Site settings.
+  </summary>
+</histogram>
+
 <histogram name="Android.RestoreResult" enum="AndroidRestoreResult"
     expires_after="2023-02-19">
   <owner>triploblastic@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index 8e2acd2..39bf69c 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -516,7 +516,9 @@
 </histogram>
 
 <histogram name="Arc.Auth.AccountCheck.Status{ArcUserTypes}"
-    enum="ArcAuthAccountCheckStatus" expires_after="2022-12-04">
+    enum="ArcAuthAccountCheckStatus" expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -526,7 +528,9 @@
 </histogram>
 
 <histogram name="Arc.Auth.AccountCheck.TimeDelta{ArcUserTypes}" units="ms"
-    expires_after="2022-12-04">
+    expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -551,7 +555,9 @@
 </histogram>
 
 <histogram name="Arc.Auth.Checkin.Attempts{ArcUserTypes}" units="attempts"
-    expires_after="2022-12-04">
+    expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -563,7 +569,9 @@
 </histogram>
 
 <histogram name="Arc.Auth.Checkin.TimeDelta{ArcUserTypes}" units="ms"
-    expires_after="2023-09-01">
+    expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -618,7 +626,9 @@
 </histogram>
 
 <histogram name="Arc.Auth.NetworkWait.TimeDelta{ArcUserTypes}" units="ms"
-    expires_after="2022-11-01">
+    expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -649,7 +659,9 @@
 </histogram>
 
 <histogram name="Arc.Auth.Reauth.Reason{ArcUserTypes}"
-    enum="ArcAuthReauthReason" expires_after="2022-12-04">
+    enum="ArcAuthReauthReason" expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -685,7 +697,9 @@
 </histogram>
 
 <histogram name="Arc.Auth.SignIn.TimeDelta{ArcUserTypes}" units="ms"
-    expires_after="2022-11-01">
+    expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -1731,7 +1745,9 @@
 </histogram>
 
 <histogram name="Arc.Provisioning.CheckInError{ArcUserTypes}"
-    enum="ArcProvisioningCheckInError" expires_after="2022-11-01">
+    enum="ArcProvisioningCheckInError" expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -1742,7 +1758,9 @@
 </histogram>
 
 <histogram name="Arc.Provisioning.CloudFlowError{ArcUserTypes}"
-    enum="ArcProvisioningCloudFlowError" expires_after="2022-11-01">
+    enum="ArcProvisioningCloudFlowError" expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -1753,7 +1771,9 @@
 </histogram>
 
 <histogram name="Arc.Provisioning.PreSignIn.TimeDelta{ArcUserTypes}" units="ms"
-    expires_after="2023-09-01">
+    expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>yaohuali@google.com</owner>
   <owner>mhasank@google.com</owner>
   <owner>arc-commercial@google.com</owner>
@@ -1767,7 +1787,9 @@
 </histogram>
 
 <histogram name="Arc.Provisioning.SignInError{ArcUserTypes}"
-    enum="ArcProvisioningSignInError" expires_after="2022-11-01">
+    enum="ArcProvisioningSignInError" expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
@@ -1778,7 +1800,9 @@
 </histogram>
 
 <histogram name="Arc.Provisioning.Status{ArcUserTypes}"
-    enum="ArcProvisioningStatus" expires_after="2022-11-01">
+    enum="ArcProvisioningStatus" expires_after="never">
+<!-- expires-never: Needed for long-term health monitoring of ARC provisioning. -->
+
   <owner>mhasank@google.com</owner>
   <owner>arc-core@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index b613f29..89090b3 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -3493,6 +3493,18 @@
   </summary>
 </histogram>
 
+<histogram name="Ash.PrivacyIndicators.AnimationSmoothness" units="%"
+    expires_after="2023-09-19">
+  <owner>leandre@chromium.org</owner>
+  <owner>cros-status-area-eng@google.com</owner>
+  <summary>
+    Animation smoothness of the privacy indicators view animation. This occurs
+    when an app is accessing camera/microphone or screen sharing and a green
+    indicator appears on the status area button. Measured via a throughtput
+    tracker.
+  </summary>
+</histogram>
+
 <histogram name="Ash.Projector.CreationFlow.{TabletOrClamshell}"
     enum="ProjectorCreationFlow" expires_after="2022-12-01">
   <owner>tobyhuang@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml
index 75a1490..ced23379 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -242,19 +242,23 @@
 </histogram>
 
 <histogram name="ContentSettings.DefaultMediaStreamMicSetting"
-    enum="ContentSetting" expires_after="2022-06-19">
+    enum="ContentSetting" expires_after="2023-02-15">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
-  <summary>The default microphone setting at profile open.</summary>
+  <summary>
+    The default microphone setting at profile open. Warning: this histogram was
+    expired from 2022-06-19 to 2022-09-21; data may be missing.
+  </summary>
 </histogram>
 
 <histogram name="ContentSettings.DefaultMIDISysExSetting" enum="ContentSetting"
-    expires_after="2022-08-21">
+    expires_after="2023-02-15">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
     The default MIDI permission setting on sysex (system exclusive) messages at
-    profile open.
+    profile open. The default microphone setting at profile open. Warning: this
+    histogram was expired from 2022-08-21 to 2022-09-21; data may be missing.
   </summary>
 </histogram>
 
@@ -266,10 +270,13 @@
 </histogram>
 
 <histogram name="ContentSettings.DefaultPopupsSetting" enum="ContentSetting"
-    expires_after="2022-08-21">
+    expires_after="2023-02-15">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
-  <summary>The default popups setting at profile open.</summary>
+  <summary>
+    The default popups setting at profile open. Warning: this histogram was
+    expired from 2022-08-21 to 2022-09-21; data may be missing.
+  </summary>
 </histogram>
 
 <histogram name="ContentSettings.DefaultRequestDesktopSiteSetting"
@@ -283,17 +290,20 @@
 </histogram>
 
 <histogram name="ContentSettings.DefaultSoundSetting" enum="ContentSetting"
-    expires_after="2022-10-23">
+    expires_after="2023-02-15">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>The default sound setting at profile open.</summary>
 </histogram>
 
 <histogram name="ContentSettings.DefaultSubresourceFilterSetting"
-    enum="ContentSetting" expires_after="2022-06-19">
+    enum="ContentSetting" expires_after="2023-02-15">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
-  <summary>The default subresource filter setting at profile open</summary>
+  <summary>
+    The default subresource filter setting at profile open. Warning: this
+    histogram was expired from 2022-06-19 to 2022-09-21; data may be missing.
+  </summary>
 </histogram>
 
 <histogram name="ContentSettings.DefaultUsbGuardSetting" enum="ContentSetting"
@@ -304,11 +314,13 @@
 </histogram>
 
 <histogram name="ContentSettings.DefaultWebBluetoothGuardSetting"
-    enum="ContentSetting" expires_after="2022-08-21">
+    enum="ContentSetting" expires_after="2023-02-15">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
-    The default permission setting for Web Bluetooth at profile open.
+    The default permission setting for Web Bluetooth at profile open. Warning:
+    this histogram was expired from 2022-08-21 to 2022-09-21; data may be
+    missing.
   </summary>
 </histogram>
 
@@ -467,17 +479,18 @@
 </histogram>
 
 <histogram name="ContentSettings.NumberOfExceptions" units="units"
-    expires_after="2022-08-28">
+    expires_after="2023-03-15">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
     The number of user defined hostname patterns for content settings at browser
-    start.
+    start. Warning: this histogram was expired from 2022-08-28 to 2022-09-21;
+    data may be missing.
   </summary>
 </histogram>
 
 <histogram name="ContentSettings.PermissionRequested" enum="PermissionType"
-    expires_after="2022-06-19">
+    expires_after="2023-03-15">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -495,6 +508,9 @@
     ContentSettings.PermissionsActions*, or Permissions.Prompt.*.
 
     See https://crbug.com/638076 for more details.
+
+    Warning: this histogram was expired from 2022-06-19 to 2022-09-21; data may
+    be missing.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index f7b5361..05d2476c 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -146,6 +146,8 @@
   <variant name="IPH_GMCCastStartStop"
       summary="Cast start stop in the Zenith dialog"/>
   <variant name="IPH_HighEfficiencyInfoMode" summary="High efficiency info"/>
+  <variant name="IPH_HighEfficiencyMode"
+      summary="encourages users to turn on high efficiency mode"/>
   <variant name="IPH_IdentityDisc" summary="Identity Disc"/>
   <variant name="IPH_IncognitoWindow" summary="incognito window"/>
   <variant name="IPH_InstanceSwitcher" summary="instance switcher"/>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index 19042fac..a72ea71 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -117,6 +117,25 @@
   </summary>
 </histogram>
 
+<histogram name="PageActionController.PagesWithActionsShown"
+    enum="PageActionPageEvent" expires_after="2023-02-01">
+  <owner>emshack@chromium.org</owner>
+  <owner>chrome-desktop-ui-sea@google.com</owner>
+  <summary>
+    Records events related to percentage of pages with actions calculation.
+
+    The percentage of pages with at least one ephemeral action shown can be
+    calculated by computing &quot;Action Shown&quot; / &quot;Page Shown&quot;.
+    The percentage of pages with multiple ephemeral actions shown can be
+    calculated by computing &quot;Multiple Actions Shown&quot; / &quot;Page
+    Shown&quot;. &quot;Page Shown&quot; is logged once when a given page is
+    first loaded, &quot;Action Shown&quot; is logged when the first page action
+    is displayed on a given page, and &quot;Multiple Actions Shown&quot; is
+    logged the first time a page action appears on a given page alongside a
+    second page action.
+  </summary>
+</histogram>
+
 <histogram name="PageActionController.{PageActionType}.Icon.CTR"
     enum="PageActionCTREvent" expires_after="2023-02-01">
   <owner>emshack@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/webauthn/histograms.xml b/tools/metrics/histograms/metadata/webauthn/histograms.xml
index a0d4bbb8..60a005c 100644
--- a/tools/metrics/histograms/metadata/webauthn/histograms.xml
+++ b/tools/metrics/histograms/metadata/webauthn/histograms.xml
@@ -179,6 +179,16 @@
   </summary>
 </histogram>
 
+<histogram name="WebAuthentication.ConditionalUiPasskeyCount" units="passkeys"
+    expires_after="2023-06-30">
+  <owner>kenrb@chromium.org</owner>
+  <owner>nsatragno@chromium.org</owner>
+  <owner>chrome-webauthn@google.com</owner>
+  <summary>
+    Records the number of passkeys available for a Conditional UI get request.
+  </summary>
+</histogram>
+
 <histogram name="WebAuthentication.GetAssertionRequestTransport"
     enum="WebAuthenticationFidoTransport" expires_after="2023-03-05">
   <owner>kenrb@chromium.org</owner>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index 2e12a28..f6b1e08 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -1615,6 +1615,46 @@
   </metric>
 </event>
 
+<event name="Autofill.AddressProfileImport">
+  <owner>vidhanj@google.com</owner>
+  <owner>koerber@google.com</owner>
+  <summary>
+    Recorded after a form submission that either resulted in a save prompt for
+    addresses or in a silent update of an already existing profile.
+  </summary>
+  <metric name="AutocompleteUnrecognizedImport" enum="Boolean">
+    <summary>
+      Logs if data was imported from a field that has autocomplete=UNRECOGNIZED.
+    </summary>
+  </metric>
+  <metric name="ImportType" enum="AutofillProfileImportType">
+    <summary>
+      Logs the import type of the storage prompt. An import type can be either
+      the import of a new profile, an update of an existing profile that results
+      in a confirmation dialog, or a silent update that only changes the
+      structure of an already stored address but does not affect any
+      settings-visible stored data.
+    </summary>
+  </metric>
+  <metric name="NumberOfEditedFields">
+    <summary>
+      Logs the count for the number of fields that have been edited by the user
+      in the storage dialog before the storage was confirmed.
+    </summary>
+  </metric>
+  <metric name="PhoneNumberStatus" enum="AutofillPhoneImportValidity">
+    <summary>
+      Logs the phone number validity status based on whether the phone number
+      was imported in the profile or not or removed beforehand.
+    </summary>
+  </metric>
+  <metric name="UserDecision" enum="AutofillProfileImportDecision">
+    <summary>
+      Logs the user decision based on the storage prompt.
+    </summary>
+  </metric>
+</event>
+
 <event name="Autofill.CardUploadDecision">
   <owner>sebsg@chromium.org</owner>
   <metric name="UploadDecision">
@@ -18365,6 +18405,22 @@
   </metric>
 </event>
 
+<event name="SalientImageAvailability" singular="True">
+  <owner>chrome-intelligence-core@google.com</owner>
+  <owner>tbansal@chromium.org</owner>
+  <summary>
+    Metrics on the salient image of the page, one record per page load commit
+    and has an annotation calculated on it.
+  </summary>
+  <metric name="ImageAvailability"
+      enum="OptimizationGuideSalientImageAvailability">
+    <summary>
+      Records whether salient image was available or not for this page, the
+      source of the salient image and why it was unavailable.
+    </summary>
+  </metric>
+</event>
+
 <event name="SameSiteDifferentSchemeRequest">
   <owner>bingler@chromium.org</owner>
   <metric name="SameSiteContextWithSchemes" enum="SameSiteCookieContext">
diff --git a/tools/polymer/polymer.gni b/tools/polymer/polymer.gni
index 7f6b214..46c8ba9 100644
--- a/tools/polymer/polymer.gni
+++ b/tools/polymer/polymer.gni
@@ -20,7 +20,6 @@
   "ui/webui/resources/html/load_time_data.html|loadTimeData",
   "ui/webui/resources/html/parse_html_subset.html|parseHtmlSubset",
   "ui/webui/resources/html/polymer.html|Polymer,html",
-  "ui/webui/resources/html/promise_resolver.html|PromiseResolver",
 
   # TODO(dpapad): Add more auto-imports here, as needed.
 ]
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 2bb7838..cab8493 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -389,4 +389,6 @@
  <item id="favicon_fetcher_get_favicon" added_in_milestone="106" content_hash_code="0640ce11" os_list="android" file_path="chrome/browser/supervised_user/android/favicon_fetcher.cc" />
  <item id="k_anonymity_service_get_token" added_in_milestone="106" content_hash_code="07a5bb1e" os_list="linux,windows,android,chromeos" file_path="chrome/browser/k_anonymity_service/k_anonymity_trust_token_getter.cc" />
  <item id="shopping_list_ui_image_fetcher" added_in_milestone="107" content_hash_code="0680ae03" os_list="linux,windows,chromeos" file_path="chrome/browser/commerce/price_tracking/shopping_list_ui_tab_helper.cc" />
+ <item id="chrome_commerce_price_email_pref_fetcher" added_in_milestone="107" content_hash_code="00b3dc73" os_list="linux,windows,android,chromeos" file_path="components/commerce/core/account_checker.cc" />
+ <item id="chrome_commerce_price_email_pref_sender" added_in_milestone="107" content_hash_code="03f51c85" os_list="linux,windows,android,chromeos" file_path="components/commerce/core/account_checker.cc" />
 </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index 00f6f8d..8a51ec2 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -255,6 +255,8 @@
       <annotation id="cryptauth_get_my_devices"/>
       <annotation id="chrome_commerce_waa_fetcher"/>
       <annotation id="shopping_list_ui_image_fetcher"/>
+      <annotation id="chrome_commerce_price_email_pref_fetcher"/>
+      <annotation id="chrome_commerce_price_email_pref_sender"/>
     </sender>
   </group>
   <group name="Admin Features" hidden="true">
diff --git a/ui/accessibility/ax_tree_manager.h b/ui/accessibility/ax_tree_manager.h
index 00e53bc..2bf0ac2 100644
--- a/ui/accessibility/ax_tree_manager.h
+++ b/ui/accessibility/ax_tree_manager.h
@@ -46,6 +46,8 @@
   // Return |node| by default, but some platforms want to update the target node
   // based on the event type.
   virtual AXNode* RetargetForEvents(AXNode* node, RetargetEventType type) const;
+  virtual void FireGeneratedEvent(ui::AXEventGenerator::Event event_type,
+                                  const ui::AXNode* node) {}
 
   // Returns the AXNode with the given |node_id| from the tree that has the
   // given |tree_id|. This allows for callers to access nodes outside of their
diff --git a/ui/base/ui_base_features.cc b/ui/base/ui_base_features.cc
index d66a08ab..acf60b3 100644
--- a/ui/base/ui_base_features.cc
+++ b/ui/base/ui_base_features.cc
@@ -27,14 +27,15 @@
 
 #if BUILDFLAG(IS_WIN)
 // If enabled, the occluded region of the HWND is supplied to WindowTracker.
-const base::Feature kApplyNativeOccludedRegionToWindowTracker{
-    "ApplyNativeOccludedRegionToWindowTracker",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kApplyNativeOccludedRegionToWindowTracker,
+             "ApplyNativeOccludedRegionToWindowTracker",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Once enabled, the exact behavior is dictated by the field trial param
 // name `kApplyNativeOcclusionToCompositorType`.
-const base::Feature kApplyNativeOcclusionToCompositor{
-    "ApplyNativeOcclusionToCompositor", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kApplyNativeOcclusionToCompositor,
+             "ApplyNativeOcclusionToCompositor",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Field trial param name for `kApplyNativeOcclusionToCompositor`.
 const char kApplyNativeOcclusionToCompositorType[] = "type";
@@ -46,27 +47,30 @@
 const char kApplyNativeOcclusionToCompositorTypeThrottle[] = "throttle";
 
 // If enabled, calculate native window occlusion - Windows-only.
-const base::Feature kCalculateNativeWinOcclusion{
-    "CalculateNativeWinOcclusion", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kCalculateNativeWinOcclusion,
+             "CalculateNativeWinOcclusion",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // If enabled, listen for screen power state change and factor into the native
 // window occlusion detection - Windows-only.
-const base::Feature kScreenPowerListenerForNativeWinOcclusion{
-    "ScreenPowerListenerForNativeWinOcclusion",
-    base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kScreenPowerListenerForNativeWinOcclusion,
+             "ScreenPowerListenerForNativeWinOcclusion",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 // Integrate input method specific settings to Chrome OS settings page.
 // https://crbug.com/895886.
-const base::Feature kSettingsShowsPerKeyboardSettings = {
-    "InputMethodIntegratedSettings", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kSettingsShowsPerKeyboardSettings,
+             "InputMethodIntegratedSettings",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Experimental shortcut handling and mapping to address i18n issues.
 // https://crbug.com/1067269
-const base::Feature kNewShortcutMapping = {"NewShortcutMapping",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kNewShortcutMapping,
+             "NewShortcutMapping",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsNewShortcutMappingEnabled() {
   // kImprovedKeyboardShortcuts supercedes kNewShortcutMapping.
@@ -74,15 +78,17 @@
          base::FeatureList::IsEnabled(kNewShortcutMapping);
 }
 
-const base::Feature kDeprecateAltClick = {"DeprecateAltClick",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kDeprecateAltClick,
+             "DeprecateAltClick",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsDeprecateAltClickEnabled() {
   return base::FeatureList::IsEnabled(kDeprecateAltClick);
 }
 
-const base::Feature kShortcutCustomizationApp = {
-    "ShortcutCustomizationApp", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kShortcutCustomizationApp,
+             "ShortcutCustomizationApp",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsShortcutCustomizationAppEnabled() {
   return base::FeatureList::IsEnabled(kShortcutCustomizationApp);
@@ -91,14 +97,16 @@
 // Share the resource file with ash-chrome. This feature reduces the memory
 // consumption while the disk usage slightly increases.
 // https://crbug.com/1253280.
-const base::Feature kLacrosResourcesFileSharing = {
-    "LacrosResourcesFileSharing", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kLacrosResourcesFileSharing,
+             "LacrosResourcesFileSharing",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 // Update of the virtual keyboard settings UI as described in
 // https://crbug.com/876901.
-const base::Feature kInputMethodSettingsUiUpdate = {
-    "InputMethodSettingsUiUpdate", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kInputMethodSettingsUiUpdate,
+             "InputMethodSettingsUiUpdate",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables percent-based scrolling for mousewheel and keyboard initiated
 // scrolls and impulse curve animations.
@@ -111,121 +119,131 @@
               "Do not enable this on the Mac. The animation does not match the "
               "system scroll animation curve to such an extent that it makes "
               "Chromium stand out in a bad way.");
-const base::Feature kWindowsScrollingPersonality = {
-    "WindowsScrollingPersonality", kWindowsScrollingPersonalityDefaultStatus};
+BASE_FEATURE(kWindowsScrollingPersonality,
+             "WindowsScrollingPersonality",
+             kWindowsScrollingPersonalityDefaultStatus);
 
 bool IsPercentBasedScrollingEnabled() {
   return base::FeatureList::IsEnabled(features::kWindowsScrollingPersonality);
 }
 
 // Allows requesting unadjusted movement when entering pointerlock.
-const base::Feature kPointerLockOptions = {"PointerLockOptions",
-                                           base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kPointerLockOptions,
+             "PointerLockOptions",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Allows system caption style for WebVTT Captions.
-const base::Feature kSystemCaptionStyle{"SystemCaptionStyle",
-                                        base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kSystemCaptionStyle,
+             "SystemCaptionStyle",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // When enabled, the feature will query the OS for a default cursor size,
 // to be used in determining the concrete object size of a custom cursor in
 // blink. Currently enabled by default on Windows only.
 // TODO(crbug.com/1333523) - Implement for other platforms.
-const base::Feature kSystemCursorSizeSupported{
-  "SystemCursorSizeSupported",
+BASE_FEATURE(kSystemCursorSizeSupported,
+             "SystemCursorSizeSupported",
 #if BUILDFLAG(IS_WIN)
-      base::FEATURE_ENABLED_BY_DEFAULT
+             base::FEATURE_ENABLED_BY_DEFAULT
 #else
-      base::FEATURE_DISABLED_BY_DEFAULT
+             base::FEATURE_DISABLED_BY_DEFAULT
 #endif
-};
+);
 
 bool IsSystemCursorSizeSupported() {
   return base::FeatureList::IsEnabled(kSystemCursorSizeSupported);
 }
 
 // Allows system keyboard event capture via the keyboard lock API.
-const base::Feature kSystemKeyboardLock{"SystemKeyboardLock",
-                                        base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kSystemKeyboardLock,
+             "SystemKeyboardLock",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables GPU rasterization for all UI drawing (where not blocklisted).
-const base::Feature kUiGpuRasterization = {"UiGpuRasterization",
+BASE_FEATURE(kUiGpuRasterization,
+             "UiGpuRasterization",
 #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_CHROMEOS_ASH) || \
     BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS_LACROS)
-                                           base::FEATURE_ENABLED_BY_DEFAULT
+             base::FEATURE_ENABLED_BY_DEFAULT
 #else
-                                           base::FEATURE_DISABLED_BY_DEFAULT
+             base::FEATURE_DISABLED_BY_DEFAULT
 #endif
-};
+);
 
 bool IsUiGpuRasterizationEnabled() {
   return base::FeatureList::IsEnabled(kUiGpuRasterization);
 }
 
 // Enables scrolling with layers under ui using the ui::Compositor.
-const base::Feature kUiCompositorScrollWithLayers = {
-    "UiCompositorScrollWithLayers",
+BASE_FEATURE(kUiCompositorScrollWithLayers,
+             "UiCompositorScrollWithLayers",
 // TODO(https://crbug.com/615948): Use composited scrolling on all platforms.
 #if BUILDFLAG(IS_APPLE)
-    base::FEATURE_ENABLED_BY_DEFAULT
+             base::FEATURE_ENABLED_BY_DEFAULT
 #else
-    base::FEATURE_DISABLED_BY_DEFAULT
+             base::FEATURE_DISABLED_BY_DEFAULT
 #endif
-};
+);
 
 // Enables compositor threaded scrollbar scrolling by mapping pointer events to
 // gesture events.
-const base::Feature kCompositorThreadedScrollbarScrolling = {
-    "CompositorThreadedScrollbarScrolling", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kCompositorThreadedScrollbarScrolling,
+             "CompositorThreadedScrollbarScrolling",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables the use of a touch fling curve that is based on the behavior of
 // native apps on Windows.
-const base::Feature kExperimentalFlingAnimation {
-  "ExperimentalFlingAnimation",
+BASE_FEATURE(kExperimentalFlingAnimation,
+             "ExperimentalFlingAnimation",
 // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch
 // of lacros-chrome is complete.
 #if BUILDFLAG(IS_WIN) ||                                   \
     (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_ASH) && \
      !BUILDFLAG(IS_CHROMEOS_LACROS))
-      base::FEATURE_ENABLED_BY_DEFAULT
+             base::FEATURE_ENABLED_BY_DEFAULT
 #else
-      base::FEATURE_DISABLED_BY_DEFAULT
+             base::FEATURE_DISABLED_BY_DEFAULT
 #endif
-};
+);
 
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
 // Cached in Java as well, make sure defaults are updated together.
-const base::Feature kElasticOverscroll = {"ElasticOverscroll",
+BASE_FEATURE(kElasticOverscroll,
+             "ElasticOverscroll",
 #if BUILDFLAG(IS_ANDROID)
-                                          base::FEATURE_ENABLED_BY_DEFAULT
+             base::FEATURE_ENABLED_BY_DEFAULT
 #else  // BUILDFLAG(IS_ANDROID)
-                                          base::FEATURE_DISABLED_BY_DEFAULT
+             base::FEATURE_DISABLED_BY_DEFAULT
 #endif
-};
+);
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_ANDROID)
-const base::Feature kAndroidPermissionsCache{"AndroidPermissionsCache",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kAndroidPermissionsCache,
+             "AndroidPermissionsCache",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 const char kElasticOverscrollType[] = "type";
 const char kElasticOverscrollTypeFilter[] = "filter";
 const char kElasticOverscrollTypeTransform[] = "transform";
 #endif  // BUILDFLAG(IS_ANDROID)
 
 // Enables focus follow follow cursor (sloppyfocus).
-const base::Feature kFocusFollowsCursor = {"FocusFollowsCursor",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kFocusFollowsCursor,
+             "FocusFollowsCursor",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 #if BUILDFLAG(IS_WIN)
 // Enables InputPane API for controlling on screen keyboard.
-const base::Feature kInputPaneOnScreenKeyboard = {
-    "InputPaneOnScreenKeyboard", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kInputPaneOnScreenKeyboard,
+             "InputPaneOnScreenKeyboard",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables using WM_POINTER instead of WM_TOUCH for touch events.
-const base::Feature kPointerEventsForTouch = {"PointerEventsForTouch",
-                                              base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kPointerEventsForTouch,
+             "PointerEventsForTouch",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 // Enables using TSF (over IMM32) for IME.
-const base::Feature kTSFImeSupport = {"TSFImeSupport",
-                                      base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kTSFImeSupport, "TSFImeSupport", base::FEATURE_ENABLED_BY_DEFAULT);
 
 bool IsUsingWMPointerForTouch() {
   return base::win::GetVersion() >= base::win::Version::WIN8 &&
@@ -236,8 +254,9 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
 // This feature supercedes kNewShortcutMapping.
-const base::Feature kImprovedKeyboardShortcuts = {
-    "ImprovedKeyboardShortcuts", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kImprovedKeyboardShortcuts,
+             "ImprovedKeyboardShortcuts",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 bool IsImprovedKeyboardShortcutsEnabled() {
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -260,8 +279,9 @@
 // part of kImprovedKeyboardShortcuts, but it is being postponed until
 // the new shortcut customization app ships.
 // TODO(crbug.com/1179893): Remove after the customization app ships.
-const base::Feature kDeprecateAltBasedSixPack = {
-    "DeprecateAltBasedSixPack", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kDeprecateAltBasedSixPack,
+             "DeprecateAltBasedSixPack",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsDeprecateAltBasedSixPackEnabled() {
   return base::FeatureList::IsEnabled(kDeprecateAltBasedSixPack);
@@ -269,8 +289,7 @@
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Enables forced colors mode for web content.
-const base::Feature kForcedColors{"ForcedColors",
-                                  base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kForcedColors, "ForcedColors", base::FEATURE_ENABLED_BY_DEFAULT);
 
 bool IsForcedColorsEnabled() {
   static const bool forced_colors_enabled =
@@ -281,30 +300,32 @@
 // Enables the eye-dropper in the refresh color-picker for Windows, Mac
 // and Linux. This feature will be released for other platforms in later
 // milestones.
-const base::Feature kEyeDropper {
-  "EyeDropper",
+BASE_FEATURE(kEyeDropper,
+             "EyeDropper",
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
-      base::FEATURE_ENABLED_BY_DEFAULT
+             base::FEATURE_ENABLED_BY_DEFAULT
 #else
-      base::FEATURE_DISABLED_BY_DEFAULT
+             base::FEATURE_DISABLED_BY_DEFAULT
 #endif
-};
+);
 
 bool IsEyeDropperEnabled() {
   return base::FeatureList::IsEnabled(features::kEyeDropper);
 }
 
 // Enable the common select popup.
-const base::Feature kUseCommonSelectPopup = {"UseCommonSelectPopup",
-                                             base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kUseCommonSelectPopup,
+             "UseCommonSelectPopup",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsUseCommonSelectPopupEnabled() {
   return base::FeatureList::IsEnabled(features::kUseCommonSelectPopup);
 }
 
 // Enables keyboard accessible tooltip.
-const base::Feature kKeyboardAccessibleTooltip{
-    "KeyboardAccessibleTooltip", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kKeyboardAccessibleTooltip,
+             "KeyboardAccessibleTooltip",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsKeyboardAccessibleTooltipEnabled() {
   static const bool keyboard_accessible_tooltip_enabled =
@@ -313,20 +334,22 @@
 }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-const base::Feature kHandwritingGesture = {"HandwritingGesture",
-                                           base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kHandwritingGesture,
+             "HandwritingGesture",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 #endif
 
-const base::Feature kSynchronousPageFlipTesting{
-    "SynchronousPageFlipTesting", base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kSynchronousPageFlipTesting,
+             "SynchronousPageFlipTesting",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 bool IsSynchronousPageFlipTestingEnabled() {
   return base::FeatureList::IsEnabled(kSynchronousPageFlipTesting);
 }
 
-const base::Feature kResamplingScrollEventsExperimentalPrediction{
-    "ResamplingScrollEventsExperimentalPrediction",
-    base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kResamplingScrollEventsExperimentalPrediction,
+             "ResamplingScrollEventsExperimentalPrediction",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 const char kPredictorNameLsq[] = "lsq";
 const char kPredictorNameKalman[] = "kalman";
@@ -343,11 +366,13 @@
 const char kPredictionTypeDefaultTime[] = "3.3";
 const char kPredictionTypeDefaultFramesRatio[] = "0.5";
 
-const base::Feature kSwipeToMoveCursor{"SwipeToMoveCursor",
-                                       base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kSwipeToMoveCursor,
+             "SwipeToMoveCursor",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kUIDebugTools{"ui-debug-tools",
-                                  base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kUIDebugTools,
+             "ui-debug-tools",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsSwipeToMoveCursorEnabled() {
   static const bool enabled =
@@ -361,7 +386,7 @@
 }
 
 // Enable raw draw for tiles.
-const base::Feature kRawDraw{"RawDraw", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kRawDraw, "RawDraw", base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Tile size = viewport size * TileSizeFactor
 const base::FeatureParam<double> kRawDrawTileSizeFactor{&kRawDraw,
@@ -381,35 +406,38 @@
   return kIsRawDrawUsingMSAA.Get();
 }
 
-const base::Feature kUiCompositorReleaseTileResourcesForHiddenLayers{
-    "UiCompositorReleaseTileResourcesForHiddenLayers",
-    base::FEATURE_ENABLED_BY_DEFAULT};
+BASE_FEATURE(kUiCompositorReleaseTileResourcesForHiddenLayers,
+             "UiCompositorReleaseTileResourcesForHiddenLayers",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
-const base::Feature kUiCompositorRequiredTilesOnly{
-    "UiCompositorRequiredTilesOnly", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kUiCompositorRequiredTilesOnly,
+             "UiCompositorRequiredTilesOnly",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
-const base::Feature kEnableVariableRefreshRate = {
-    "EnableVariableRefreshRate", base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kEnableVariableRefreshRate,
+             "EnableVariableRefreshRate",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 bool IsVariableRefreshRateEnabled() {
   return base::FeatureList::IsEnabled(kEnableVariableRefreshRate);
 }
 
-const base::Feature kWaylandScreenCoordinatesEnabled{
-  "WaylandScreenCoordinatesEnabled",
+BASE_FEATURE(kWaylandScreenCoordinatesEnabled,
+             "WaylandScreenCoordinatesEnabled",
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
-      base::FEATURE_ENABLED_BY_DEFAULT
+             base::FEATURE_ENABLED_BY_DEFAULT
 #else
-      base::FEATURE_DISABLED_BY_DEFAULT
+             base::FEATURE_DISABLED_BY_DEFAULT
 #endif
-};
+);
 
 bool IsWaylandScreenCoordinatesEnabled() {
   return base::FeatureList::IsEnabled(kWaylandScreenCoordinatesEnabled);
 }
 
 // Enables chrome color management wayland protocol for lacros.
-const base::Feature kLacrosColorManagement{"LacrosColorManagement",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
+BASE_FEATURE(kLacrosColorManagement,
+             "LacrosColorManagement",
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsLacrosColorManagementEnabled() {
   return base::FeatureList::IsEnabled(kLacrosColorManagement);
diff --git a/ui/base/ui_base_features.h b/ui/base/ui_base_features.h
index 17ecd17..5fb3a5d 100644
--- a/ui/base/ui_base_features.h
+++ b/ui/base/ui_base_features.h
@@ -16,39 +16,34 @@
 // Keep sorted!
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kCompositorThreadedScrollbarScrolling;
+BASE_DECLARE_FEATURE(kCompositorThreadedScrollbarScrolling);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kExperimentalFlingAnimation;
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kFocusFollowsCursor;
+BASE_DECLARE_FEATURE(kExperimentalFlingAnimation);
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kFocusFollowsCursor);
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kSettingsShowsPerKeyboardSettings;
+BASE_DECLARE_FEATURE(kSettingsShowsPerKeyboardSettings);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kInputMethodSettingsUiUpdate;
+BASE_DECLARE_FEATURE(kInputMethodSettingsUiUpdate);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kWindowsScrollingPersonality;
+BASE_DECLARE_FEATURE(kWindowsScrollingPersonality);
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsPercentBasedScrollingEnabled();
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kPointerLockOptions);
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kSystemCaptionStyle);
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kSystemKeyboardLock);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kPointerLockOptions;
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kSystemCaptionStyle;
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kSystemKeyboardLock;
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kUiCompositorScrollWithLayers;
+BASE_DECLARE_FEATURE(kUiCompositorScrollWithLayers);
 
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsUiGpuRasterizationEnabled();
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID)
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kElasticOverscroll;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kElasticOverscroll);
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_ANDROID)
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kAndroidPermissionsCache;
+BASE_DECLARE_FEATURE(kAndroidPermissionsCache);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 extern const char kElasticOverscrollType[];
 COMPONENT_EXPORT(UI_BASE_FEATURES)
@@ -59,9 +54,9 @@
 
 #if BUILDFLAG(IS_WIN)
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kApplyNativeOccludedRegionToWindowTracker;
+BASE_DECLARE_FEATURE(kApplyNativeOccludedRegionToWindowTracker);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kApplyNativeOcclusionToCompositor;
+BASE_DECLARE_FEATURE(kApplyNativeOcclusionToCompositor);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 extern const char kApplyNativeOcclusionToCompositorType[];
 COMPONENT_EXPORT(UI_BASE_FEATURES)
@@ -69,14 +64,13 @@
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 extern const char kApplyNativeOcclusionToCompositorTypeThrottle[];
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kCalculateNativeWinOcclusion;
+BASE_DECLARE_FEATURE(kCalculateNativeWinOcclusion);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kInputPaneOnScreenKeyboard;
+BASE_DECLARE_FEATURE(kInputPaneOnScreenKeyboard);
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kPointerEventsForTouch);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kPointerEventsForTouch;
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kScreenPowerListenerForNativeWinOcclusion;
-COMPONENT_EXPORT(UI_BASE_FEATURES) extern const base::Feature kTSFImeSupport;
+BASE_DECLARE_FEATURE(kScreenPowerListenerForNativeWinOcclusion);
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kTSFImeSupport);
 
 // Returns true if the system should use WM_POINTER events for touch events.
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsUsingWMPointerForTouch();
@@ -85,67 +79,63 @@
 #if BUILDFLAG(IS_CHROMEOS)
 // This flag is intended to supercede kNewShortcutMapping.
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kImprovedKeyboardShortcuts;
+BASE_DECLARE_FEATURE(kImprovedKeyboardShortcuts);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 bool IsImprovedKeyboardShortcutsEnabled();
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kDeprecateAltBasedSixPack;
+BASE_DECLARE_FEATURE(kDeprecateAltBasedSixPack);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 bool IsDeprecateAltBasedSixPackEnabled();
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 // Used to enable forced colors mode for web content.
-COMPONENT_EXPORT(UI_BASE_FEATURES) extern const base::Feature kForcedColors;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kForcedColors);
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsForcedColorsEnabled();
 
 // Used to enable the eye-dropper in the refresh color-picker.
-COMPONENT_EXPORT(UI_BASE_FEATURES) extern const base::Feature kEyeDropper;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kEyeDropper);
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsEyeDropperEnabled();
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kSystemCursorSizeSupported;
+BASE_DECLARE_FEATURE(kSystemCursorSizeSupported);
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsSystemCursorSizeSupported();
 
 // Used to enable the common select popup.
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kUseCommonSelectPopup;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kUseCommonSelectPopup);
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsUseCommonSelectPopupEnabled();
 
 // Used to enable keyboard accessible tooltips.
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kKeyboardAccessibleTooltip;
+BASE_DECLARE_FEATURE(kKeyboardAccessibleTooltip);
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsKeyboardAccessibleTooltipEnabled();
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kHandwritingGesture;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kHandwritingGesture);
 
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kNewShortcutMapping;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kNewShortcutMapping);
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 bool IsNewShortcutMappingEnabled();
 
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kDeprecateAltClick;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kDeprecateAltClick);
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 bool IsDeprecateAltClickEnabled();
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kShortcutCustomizationApp;
+BASE_DECLARE_FEATURE(kShortcutCustomizationApp);
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 bool IsShortcutCustomizationAppEnabled();
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kLacrosResourcesFileSharing;
+BASE_DECLARE_FEATURE(kLacrosResourcesFileSharing);
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 // Indicates whether DrmOverlayManager should used the synchronous API to
 // perform pageflip tests.
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kSynchronousPageFlipTesting;
+BASE_DECLARE_FEATURE(kSynchronousPageFlipTesting);
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 bool IsSynchronousPageFlipTestingEnabled();
@@ -166,7 +156,7 @@
 // Enables resampling of scroll events using an experimental latency of +3.3ms
 // instead of the original -5ms.
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kResamplingScrollEventsExperimentalPrediction;
+BASE_DECLARE_FEATURE(kResamplingScrollEventsExperimentalPrediction);
 
 // The type of prediction used. TimeBased uses a fixed timing, FramesBased uses
 // a ratio of the vsync refresh rate. The timing/ratio can be changed on the
@@ -186,38 +176,36 @@
 COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kFilterNameOneEuro[];
 
 // Android only feature, for swipe to move cursor.
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kSwipeToMoveCursor;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kSwipeToMoveCursor);
 
 // Enables UI debugging tools such as shortcuts.
-COMPONENT_EXPORT(UI_BASE_FEATURES) extern const base::Feature kUIDebugTools;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kUIDebugTools);
 
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsSwipeToMoveCursorEnabled();
 
 // Enables Raw Draw.
-COMPONENT_EXPORT(UI_BASE_FEATURES) extern const base::Feature kRawDraw;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kRawDraw);
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsUsingRawDraw();
 COMPONENT_EXPORT(UI_BASE_FEATURES) double RawDrawTileSizeFactor();
 COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsRawDrawUsingMSAA();
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kUiCompositorReleaseTileResourcesForHiddenLayers;
+BASE_DECLARE_FEATURE(kUiCompositorReleaseTileResourcesForHiddenLayers);
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kUiCompositorRequiredTilesOnly;
+BASE_DECLARE_FEATURE(kUiCompositorRequiredTilesOnly);
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kEnableVariableRefreshRate;
+BASE_DECLARE_FEATURE(kEnableVariableRefreshRate);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 bool IsVariableRefreshRateEnabled();
 
 COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kWaylandScreenCoordinatesEnabled;
+BASE_DECLARE_FEATURE(kWaylandScreenCoordinatesEnabled);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 bool IsWaylandScreenCoordinatesEnabled();
 
-COMPONENT_EXPORT(UI_BASE_FEATURES)
-extern const base::Feature kLacrosColorManagement;
+COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kLacrosColorManagement);
 COMPONENT_EXPORT(UI_BASE_FEATURES)
 bool IsLacrosColorManagementEnabled();
 
diff --git a/ui/base/webui/web_ui_util.cc b/ui/base/webui/web_ui_util.cc
index 6a1a631..2302ae1 100644
--- a/ui/base/webui/web_ui_util.cc
+++ b/ui/base/webui/web_ui_util.cc
@@ -7,18 +7,14 @@
 #include <vector>
 
 #include "base/base64.h"
-#include "base/feature_list.h"
 #include "base/i18n/rtl.h"
 #include "base/logging.h"
-#include "base/memory/ref_counted_memory.h"
 #include "base/strings/escape.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
-#include "base/strings/string_util.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
-#include "third_party/modp_b64/modp_b64.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -26,7 +22,6 @@
 #include "ui/base/window_open_disposition.h"
 #include "ui/gfx/codec/png_codec.h"
 #include "ui/gfx/font.h"
-#include "ui/gfx/image/image_skia.h"
 #include "ui/resources/grit/webui_generated_resources.h"
 #include "ui/strings/grit/app_locale_settings.h"
 #include "url/gurl.h"
@@ -55,19 +50,8 @@
 }
 
 std::string GetPngDataUrl(const unsigned char* data, size_t size) {
-  constexpr char kPrefix[] = "data:image/png;base64,";
-  constexpr size_t kPrefixLen = std::size(kPrefix) - 1;
-  // Includes room for trailing null byte.
-  size_t max_encode_len = modp_b64_encode_len(size);
-  std::string output;
-  // This initializes the characters in the string, but there's no good way to
-  // avoid that and maintain a std::string API.
-  output.resize(kPrefixLen + max_encode_len);
-  memcpy(&output[0], kPrefix, kPrefixLen);
-  // |max_encode_len| is >= 1, so &output[kPrefixLen] is valid.
-  size_t actual_encode_len = modp_b64_encode(
-      &output[kPrefixLen], reinterpret_cast<const char*>(data), size);
-  output.resize(kPrefixLen + actual_encode_len);
+  std::string output = "data:image/png;base64,";
+  base::Base64EncodeAppend(base::make_span(data, size), &output);
   return output;
 }
 
diff --git a/ui/events/ozone/evdev/keyboard_imposter_checker_evdev.cc b/ui/events/ozone/evdev/keyboard_imposter_checker_evdev.cc
index 58a34f0..6247207 100644
--- a/ui/events/ozone/evdev/keyboard_imposter_checker_evdev.cc
+++ b/ui/events/ozone/evdev/keyboard_imposter_checker_evdev.cc
@@ -5,6 +5,8 @@
 #include "ui/events/ozone/evdev/keyboard_imposter_checker_evdev.h"
 
 #include "base/containers/cxx20_erase_map.h"
+#include "base/logging.h"
+#include "base/strings/stringprintf.h"
 #include "ui/events/ozone/features.h"
 
 namespace ui {
@@ -49,6 +51,11 @@
   }
 
   converter->SetSuspectedImposter(true);
+  VLOG(1) << "Device Name: " << converter->input_device().name << " Vendor ID: "
+          << base::StringPrintf("%#06x", converter->input_device().vendor_id)
+          << " Product ID: "
+          << base::StringPrintf("%#06x", converter->input_device().product_id)
+          << " has been flagged as a suspected imposter keyboard";
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   fake_keyboard_heuristic_metrics_.RecordUsage(true);
 #endif
diff --git a/ui/gfx/color_space.cc b/ui/gfx/color_space.cc
index 944b7f0..a67f02c 100644
--- a/ui/gfx/color_space.cc
+++ b/ui/gfx/color_space.cc
@@ -15,6 +15,7 @@
 #include "base/notreached.h"
 #include "base/synchronization/lock.h"
 #include "skia/ext/skcolorspace_primaries.h"
+#include "skia/ext/skcolorspace_trfn.h"
 #include "third_party/skia/include/core/SkColorSpace.h"
 #include "third_party/skia/include/core/SkData.h"
 #include "third_party/skia/include/core/SkICC.h"
@@ -644,7 +645,7 @@
       return SkColorSpace::MakeSRGBLinear();
   }
 
-  skcms_TransferFunction transfer_fn = SkNamedTransferFn::kSRGB;
+  skcms_TransferFunction transfer_fn = SkNamedTransferFnExt::kSRGB;
   switch (transfer_) {
     case TransferID::SRGB:
       break;
@@ -754,7 +755,7 @@
 SkColorSpacePrimaries ColorSpace::GetColorSpacePrimaries(
     PrimaryID primary_id,
     const skcms_Matrix3x3* custom_primary_matrix = nullptr) {
-  SkColorSpacePrimaries primaries = skia::kSkColorSpacePrimariesZero;
+  SkColorSpacePrimaries primaries = SkNamedPrimariesExt::kInvalid;
 
   if (custom_primary_matrix && primary_id == PrimaryID::CUSTOM)
     return skia::GetD65PrimariesFromToXYZD50Matrix(*custom_primary_matrix);
@@ -769,116 +770,46 @@
       // in case we somehow get an id which is not listed in the switch.
       // (We don't want to use "default", because we want the compiler
       //  to tell us if we forgot some enum values.)
-      return skia::kSkColorSpacePrimariesSRGB;
+      return SkNamedPrimariesExt::kRec709;
 
     case ColorSpace::PrimaryID::BT470M:
-      primaries.fRX = 0.67f;
-      primaries.fRY = 0.33f;
-      primaries.fGX = 0.21f;
-      primaries.fGY = 0.71f;
-      primaries.fBX = 0.14f;
-      primaries.fBY = 0.08f;
-      primaries.fWX = 0.31f;
-      primaries.fWY = 0.316f;
-      break;
+      return SkNamedPrimariesExt::kRec470SystemM;
 
     case ColorSpace::PrimaryID::BT470BG:
-      primaries.fRX = 0.64f;
-      primaries.fRY = 0.33f;
-      primaries.fGX = 0.29f;
-      primaries.fGY = 0.60f;
-      primaries.fBX = 0.15f;
-      primaries.fBY = 0.06f;
-      primaries.fWX = 0.3127f;
-      primaries.fWY = 0.3290f;
-      break;
+      return SkNamedPrimariesExt::kRec470SystemBG;
 
     case ColorSpace::PrimaryID::SMPTE170M:
+      return SkNamedPrimariesExt::kRec601;
+
     case ColorSpace::PrimaryID::SMPTE240M:
-      primaries.fRX = 0.630f;
-      primaries.fRY = 0.340f;
-      primaries.fGX = 0.310f;
-      primaries.fGY = 0.595f;
-      primaries.fBX = 0.155f;
-      primaries.fBY = 0.070f;
-      primaries.fWX = 0.3127f;
-      primaries.fWY = 0.3290f;
-      break;
+      return SkNamedPrimariesExt::kSMPTE_ST_240;
 
     case ColorSpace::PrimaryID::APPLE_GENERIC_RGB:
-      primaries.fRX = 0.63002f;
-      primaries.fRY = 0.34000f;
-      primaries.fGX = 0.29505f;
-      primaries.fGY = 0.60498f;
-      primaries.fBX = 0.15501f;
-      primaries.fBY = 0.07701f;
-      primaries.fWX = 0.3127f;
-      primaries.fWY = 0.3290f;
-      break;
+      return SkNamedPrimariesExt::kAppleGenericRGB;
 
     case ColorSpace::PrimaryID::WIDE_GAMUT_COLOR_SPIN:
-      return skia::kSkColorSpacePrimariesWideGamutColorSpin;
+      return SkNamedPrimariesExt::kWideGamutColorSpin;
 
     case ColorSpace::PrimaryID::FILM:
-      primaries.fRX = 0.681f;
-      primaries.fRY = 0.319f;
-      primaries.fGX = 0.243f;
-      primaries.fGY = 0.692f;
-      primaries.fBX = 0.145f;
-      primaries.fBY = 0.049f;
-      primaries.fWX = 0.310f;
-      primaries.fWY = 0.136f;
-      break;
+      return SkNamedPrimariesExt::kGenericFilm;
 
     case ColorSpace::PrimaryID::BT2020:
-      return skia::kSkColorSpacePrimariesRec2020;
+      return SkNamedPrimariesExt::kRec2020;
 
     case ColorSpace::PrimaryID::SMPTEST428_1:
-      primaries.fRX = 1.0f;
-      primaries.fRY = 0.0f;
-      primaries.fGX = 0.0f;
-      primaries.fGY = 1.0f;
-      primaries.fBX = 0.0f;
-      primaries.fBY = 0.0f;
-      primaries.fWX = 1.0f / 3.0f;
-      primaries.fWY = 1.0f / 3.0f;
-      break;
+      return SkNamedPrimariesExt::kSMPTE_ST_428_1;
 
     case ColorSpace::PrimaryID::SMPTEST431_2:
-      primaries.fRX = 0.680f;
-      primaries.fRY = 0.320f;
-      primaries.fGX = 0.265f;
-      primaries.fGY = 0.690f;
-      primaries.fBX = 0.150f;
-      primaries.fBY = 0.060f;
-      primaries.fWX = 0.314f;
-      primaries.fWY = 0.351f;
-      break;
+      return SkNamedPrimariesExt::kSMPTE_RP_431_2;
 
     case ColorSpace::PrimaryID::P3:
-      return skia::kSkColorSpacePrimariesP3;
+      return SkNamedPrimariesExt::kP3;
 
     case ColorSpace::PrimaryID::XYZ_D50:
-      primaries.fRX = 1.0f;
-      primaries.fRY = 0.0f;
-      primaries.fGX = 0.0f;
-      primaries.fGY = 1.0f;
-      primaries.fBX = 0.0f;
-      primaries.fBY = 0.0f;
-      primaries.fWX = 0.34567f;
-      primaries.fWY = 0.35850f;
-      break;
+      return SkNamedPrimariesExt::kXYZD50;
 
     case ColorSpace::PrimaryID::ADOBE_RGB:
-      primaries.fRX = 0.6400f;
-      primaries.fRY = 0.3300f;
-      primaries.fGX = 0.2100f;
-      primaries.fGY = 0.7100f;
-      primaries.fBX = 0.1500f;
-      primaries.fBY = 0.0600f;
-      primaries.fWX = 0.3127f;
-      primaries.fWY = 0.3290f;
-      break;
+      return SkNamedPrimariesExt::kA98RGB;
   }
   return primaries;
 }
@@ -935,20 +866,16 @@
       fn->g = 1.801f;
       return true;
     case ColorSpace::TransferID::GAMMA22:
-      fn->g = 2.2f;
+      *fn = SkNamedTransferFnExt::kRec470SystemM;
       return true;
     case ColorSpace::TransferID::GAMMA24:
       fn->g = 2.4f;
       return true;
     case ColorSpace::TransferID::GAMMA28:
-      fn->g = 2.8f;
+      *fn = SkNamedTransferFnExt::kRec470SystemBG;
       return true;
     case ColorSpace::TransferID::SMPTE240M:
-      fn->a = 0.899626676224f;
-      fn->b = 0.100373323776f;
-      fn->c = 0.250000000000f;
-      fn->d = 0.091286342118f;
-      fn->g = 2.222222222222f;
+      *fn = SkNamedTransferFnExt::kSMPTE_ST_240;
       return true;
     case ColorSpace::TransferID::BT709:
     case ColorSpace::TransferID::SMPTE170M:
@@ -965,18 +892,13 @@
     // media players.
     case ColorSpace::TransferID::SRGB:
     case ColorSpace::TransferID::SRGB_HDR:
-      fn->a = 0.947867345704f;
-      fn->b = 0.052132654296f;
-      fn->c = 0.077399380805f;
-      fn->d = 0.040449937172f;
-      fn->g = 2.400000000000f;
+      *fn = SkNamedTransferFnExt::kSRGB;
       return true;
     case ColorSpace::TransferID::BT709_APPLE:
-      fn->g = 1.961000000000f;
+      *fn = SkNamedTransferFnExt::kRec709Apple;
       return true;
     case ColorSpace::TransferID::SMPTEST428_1:
-      fn->a = 1.034080527699f;  // (52.37 / 48.0) ^ (1.0 / 2.6) per ITU-T H.273.
-      fn->g = 2.600000000000f;
+      *fn = SkNamedTransferFnExt::kSMPTE_ST_428_1;
       return true;
     case ColorSpace::TransferID::IEC61966_2_4:
       // This could potentially be represented the same as SRGB, but it handles
diff --git a/ui/gfx/display_color_spaces.h b/ui/gfx/display_color_spaces.h
index b051533..8763a08f 100644
--- a/ui/gfx/display_color_spaces.h
+++ b/ui/gfx/display_color_spaces.h
@@ -138,7 +138,7 @@
 
   gfx::ColorSpace color_spaces_[kConfigCount];
   gfx::BufferFormat buffer_formats_[kConfigCount];
-  SkColorSpacePrimaries primaries_ = skia::kSkColorSpacePrimariesSRGB;
+  SkColorSpacePrimaries primaries_ = SkNamedPrimariesExt::kSRGB;
   float sdr_max_luminance_nits_ = ColorSpace::kDefaultSDRWhiteLevel;
   float hdr_max_luminance_relative_ = 1.f;
 };
diff --git a/ui/ozone/platform/wayland/host/wayland_cursor_factory_unittest.cc b/ui/ozone/platform/wayland/host/wayland_cursor_factory_unittest.cc
index 692d8d21..00e2d3c 100644
--- a/ui/ozone/platform/wayland/host/wayland_cursor_factory_unittest.cc
+++ b/ui/ozone/platform/wayland/host/wayland_cursor_factory_unittest.cc
@@ -86,7 +86,9 @@
 
 // Tests that the factory holds the cursor theme until a buffer taken from it
 // released.
-TEST_P(WaylandCursorFactoryTest, RetainOldThemeUntilNewBufferIsAttached) {
+// TODO(1357512): fails on Linux (not used on LaCros).
+TEST_P(WaylandCursorFactoryTest,
+       DISABLED_RetainOldThemeUntilNewBufferIsAttached) {
   std::unique_ptr<WaylandCursorFactory> cursor_factory =
       std::make_unique<DryRunningWaylandCursorFactory>(connection_.get());
   cursor_factory->AddObserver(this);
@@ -164,7 +166,8 @@
 
 // Tests that the factory keeps the caches when either cursor size or buffer
 // scale are changed, and only resets them when the theme is changed.
-TEST_P(WaylandCursorFactoryTest, CachesSizesUntilThemeNameIsChanged) {
+// TODO(1357512): fails on Linux (not used on LaCros).
+TEST_P(WaylandCursorFactoryTest, DISABLED_CachesSizesUntilThemeNameIsChanged) {
   std::unique_ptr<WaylandCursorFactory> cursor_factory =
       std::make_unique<DryRunningWaylandCursorFactory>(connection_.get());
   cursor_factory->AddObserver(this);
diff --git a/ui/views/accessibility/views_ax_tree_manager.cc b/ui/views/accessibility/views_ax_tree_manager.cc
index 9852547..80932c4 100644
--- a/ui/views/accessibility/views_ax_tree_manager.cc
+++ b/ui/views/accessibility/views_ax_tree_manager.cc
@@ -169,7 +169,7 @@
   for (const ui::AXEventGenerator::TargetedEvent& targeted_event :
        event_generator_) {
     if (ui::AXNode* node = ax_tree_->GetFromId(targeted_event.node_id))
-      FireGeneratedEvent(targeted_event.event_params.event, *node);
+      FireGeneratedEvent(targeted_event.event_params.event, node);
   }
   event_generator_.ClearEvents();
 }
@@ -182,11 +182,10 @@
     root_view->NotifyAccessibilityEvent(ax::mojom::Event::kLoadComplete, true);
 }
 
-void ViewsAXTreeManager::FireGeneratedEvent(
-    const ui::AXEventGenerator::Event& event,
-    const ui::AXNode& node) const {
+void ViewsAXTreeManager::FireGeneratedEvent(ui::AXEventGenerator::Event event,
+                                            const ui::AXNode* node) {
   if (!generated_event_callback_for_testing_.is_null())
-    generated_event_callback_for_testing_.Run(widget_.get(), event, node.id());
+    generated_event_callback_for_testing_.Run(widget_.get(), event, node->id());
   // TODO(nektar): Implement this other than "for testing".
 }
 
diff --git a/ui/views/accessibility/views_ax_tree_manager.h b/ui/views/accessibility/views_ax_tree_manager.h
index 1aa723da5..98b729f 100644
--- a/ui/views/accessibility/views_ax_tree_manager.h
+++ b/ui/views/accessibility/views_ax_tree_manager.h
@@ -105,8 +105,8 @@
   // fires the given |event| on it.
   //
   // TODO(nektar): Implement this other than for testing.
-  void FireGeneratedEvent(const ui::AXEventGenerator::Event& event,
-                          const ui::AXNode& node) const;
+  void FireGeneratedEvent(ui::AXEventGenerator::Event event,
+                          const ui::AXNode* node) override;
 
   // The Widget for which this class manages an AXTree.
   //
diff --git a/ui/webui/examples/BUILD.gn b/ui/webui/examples/BUILD.gn
index 73a10517..86dd381e 100644
--- a/ui/webui/examples/BUILD.gn
+++ b/ui/webui/examples/BUILD.gn
@@ -21,6 +21,12 @@
     "browser/browser_main_parts.h",
     "browser/content_browser_client.cc",
     "browser/content_browser_client.h",
+    "browser/ui/aura/aura_context.cc",
+    "browser/ui/aura/aura_context.h",
+    "browser/ui/aura/content_window.cc",
+    "browser/ui/aura/content_window.h",
+    "browser/ui/aura/fill_layout.cc",
+    "browser/ui/aura/fill_layout.h",
     "common/content_client.cc",
     "common/content_client.h",
   ]
@@ -29,26 +35,49 @@
 
   deps = [
     ":pak",
+    ":resources_grit",
     "//base",
     "//content/public/app",
     "//content/public/browser",
+    "//ui/aura",
+    "//ui/aura:test_support",
     "//ui/base",
     "//ui/display",
+    "//ui/platform_window",
+    "//ui/wm",
+    "//ui/wm/public",
     "//url",
   ]
 }
 
+grit("resources") {
+  testonly = true
+  grit_flags = [
+    "-E",
+    "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
+  ]
+  source = "resources/webui_examples_resources.grd"
+  outputs = [
+    "grit/webui_examples_resources.h",
+    "webui_examples_resources.pak",
+  ]
+}
+
 repack("pak") {
   testonly = true
   sources = [
     "$root_gen_dir/third_party/blink/public/resources/blink_resources.pak",
     "$root_gen_dir/third_party/blink/public/resources/blink_scaled_resources_100_percent.pak",
+    "$root_gen_dir/ui/resources/webui_generated_resources.pak",
     "$root_gen_dir/ui/strings/app_locale_settings_en-US.pak",
     "$root_gen_dir/ui/strings/ui_strings_en-US.pak",
+    "$target_gen_dir/webui_examples_resources.pak",
   ]
   deps = [
+    ":resources",
     "//third_party/blink/public:resources",
     "//third_party/blink/public:scaled_resources_100_percent",
+    "//ui/resources",
     "//ui/strings",
   ]
   output = "$root_out_dir/webui_examples.pak"
diff --git a/ui/webui/examples/DEPS b/ui/webui/examples/DEPS
index 43454cd2..094efb15 100644
--- a/ui/webui/examples/DEPS
+++ b/ui/webui/examples/DEPS
@@ -5,6 +5,13 @@
   # Sandbox is part of the main initialization.
   "+sandbox",
 
+  # The WebUI examples uses Chromium's UI libraries.
+  "+ui/aura",
+  "+ui/display",
+  "+ui/platform_window",
+  "+ui/wm",
+
   # The WebUI examples is an embedder so it must work with resource bundles.
+  "+ui/base/l10n",
   "+ui/base/resource",
 ]
diff --git a/ui/webui/examples/browser/browser_main_parts.cc b/ui/webui/examples/browser/browser_main_parts.cc
index 1a58b1e..723039d 100644
--- a/ui/webui/examples/browser/browser_main_parts.cc
+++ b/ui/webui/examples/browser/browser_main_parts.cc
@@ -6,9 +6,17 @@
 
 #include <tuple>
 
+#include "base/bind.h"
+#include "base/callback.h"
 #include "base/run_loop.h"
-#include "base/threading/sequenced_task_runner_handle.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/webui/examples/browser/browser_context.h"
+#include "ui/webui/examples/browser/ui/aura/aura_context.h"
+#include "ui/webui/examples/browser/ui/aura/content_window.h"
+#include "ui/webui/examples/grit/webui_examples_resources.h"
 
 namespace webui_examples {
 
@@ -18,18 +26,62 @@
 
 int BrowserMainParts::PreMainMessageLoopRun() {
   std::ignore = temp_dir_.CreateUniqueTempDir();
+
   browser_context_ = std::make_unique<BrowserContext>(temp_dir_.GetPath());
+
+  aura_context_ = std::make_unique<AuraContext>();
+
+  CreateAndShowContentWindow(
+      GURL("https://www.chromium.org/"),
+      l10n_util::GetStringUTF16(IDS_WEBUI_EXAMPLES_WINDOW_TITLE));
+
   return 0;
 }
 
 void BrowserMainParts::WillRunMainMessageLoop(
     std::unique_ptr<base::RunLoop>& run_loop) {
-  base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                   run_loop->QuitClosure());
+  quit_run_loop_ = run_loop->QuitClosure();
 }
 
 void BrowserMainParts::PostMainMessageLoopRun() {
   browser_context_.reset();
 }
 
+ContentWindow* BrowserMainParts::CreateAndShowContentWindow(
+    GURL url,
+    const std::u16string& title) {
+  auto content_window = std::make_unique<ContentWindow>(aura_context_.get(),
+                                                        browser_context_.get());
+  ContentWindow* content_window_ptr = content_window.get();
+  content_window_ptr->SetTitle(title);
+  content_window_ptr->NavigateToURL(url);
+  content_window_ptr->Show();
+  content_window_ptr->SetCloseCallback(
+      base::BindOnce(&BrowserMainParts::OnWindowClosed,
+                     weak_factory_.GetWeakPtr(), std::move(content_window)));
+  ++content_windows_outstanding_;
+  return content_window_ptr;
+}
+
+void BrowserMainParts::OnWindowClosed(
+    std::unique_ptr<ContentWindow> content_window) {
+  --content_windows_outstanding_;
+  auto task_runner = content::GetUIThreadTaskRunner({});
+  // We are dispatching a callback that originates from the content_window.
+  // Deleting soon instead of now eliminates the chance of a crash in case the
+  // content_window or associated objects have more work to do after this
+  // callback.
+  task_runner->DeleteSoon(FROM_HERE, std::move(content_window));
+  if (content_windows_outstanding_ == 0) {
+    task_runner->PostTask(FROM_HERE,
+                          base::BindOnce(&BrowserMainParts::QuitMessageLoop,
+                                         weak_factory_.GetWeakPtr()));
+  }
+}
+
+void BrowserMainParts::QuitMessageLoop() {
+  aura_context_.reset();
+  quit_run_loop_.Run();
+}
+
 }  // namespace webui_examples
diff --git a/ui/webui/examples/browser/browser_main_parts.h b/ui/webui/examples/browser/browser_main_parts.h
index 15006ac3..8edc0fa 100644
--- a/ui/webui/examples/browser/browser_main_parts.h
+++ b/ui/webui/examples/browser/browser_main_parts.h
@@ -10,13 +10,17 @@
 #include "base/files/scoped_temp_dir.h"
 #include "content/public/browser/browser_main_parts.h"
 
+class GURL;
+
 namespace content {
 class BrowserContext;
 }  // namespace content
 
 namespace webui_examples {
 
+class AuraContext;
 class BrowserContext;
+class ContentWindow;
 
 class BrowserMainParts : public content::BrowserMainParts {
  public:
@@ -32,8 +36,21 @@
       std::unique_ptr<base::RunLoop>& run_loop) override;
   void PostMainMessageLoopRun() override;
 
+  // ContentWindow is alive until the window is closed.
+  ContentWindow* CreateAndShowContentWindow(GURL url,
+                                            const std::u16string& title);
+  void OnWindowClosed(std::unique_ptr<ContentWindow> content_window);
+  void QuitMessageLoop();
+
   base::ScopedTempDir temp_dir_;
   std::unique_ptr<content::BrowserContext> browser_context_;
+
+  std::unique_ptr<AuraContext> aura_context_;
+  int content_windows_outstanding_ = 0;
+
+  base::RepeatingClosure quit_run_loop_;
+
+  base::WeakPtrFactory<BrowserMainParts> weak_factory_{this};
 };
 
 }  // namespace webui_examples
diff --git a/ui/webui/examples/browser/ui/aura/aura_context.cc b/ui/webui/examples/browser/ui/aura/aura_context.cc
new file mode 100644
index 0000000..a14bb596
--- /dev/null
+++ b/ui/webui/examples/browser/ui/aura/aura_context.cc
@@ -0,0 +1,159 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/webui/examples/browser/ui/aura/aura_context.h"
+
+#include "ui/aura/client/cursor_client.h"
+#include "ui/aura/client/focus_client.h"
+#include "ui/aura/test/test_screen.h"
+#include "ui/aura/window_event_dispatcher.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/display/screen.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/platform_window/platform_window_init_properties.h"
+#include "ui/webui/examples/browser/ui/aura/fill_layout.h"
+#include "ui/wm/core/base_focus_rules.h"
+#include "ui/wm/core/cursor_loader.h"
+#include "ui/wm/core/cursor_manager.h"
+#include "ui/wm/core/focus_controller.h"
+#include "ui/wm/core/native_cursor_manager.h"
+#include "ui/wm/public/activation_client.h"
+
+namespace webui_examples {
+
+namespace {
+
+class FocusRules : public wm::BaseFocusRules {
+ public:
+  FocusRules() = default;
+  FocusRules(const FocusRules&) = delete;
+  FocusRules& operator=(const FocusRules&) = delete;
+  ~FocusRules() override = default;
+
+ private:
+  // wm::BaseFocusRules:
+  bool SupportsChildActivation(const aura::Window* window) const override {
+    return true;
+  }
+};
+
+}  // namespace
+
+class AuraContext::NativeCursorManager : public wm::NativeCursorManager {
+ public:
+  NativeCursorManager() = default;
+  ~NativeCursorManager() override = default;
+
+  void AddHost(aura::WindowTreeHost* host) { hosts_.insert(host); }
+  void RemoveHost(aura::WindowTreeHost* host) { hosts_.erase(host); }
+
+ private:
+  // wm::NativeCursorManager:
+  void SetDisplay(const display::Display& display,
+                  wm::NativeCursorManagerDelegate* delegate) override {
+    cursor_loader_.SetDisplayData(display.rotation(),
+                                  display.device_scale_factor());
+    SetCursor(delegate->GetCursor(), delegate);
+  }
+
+  void SetCursor(gfx::NativeCursor cursor,
+                 wm::NativeCursorManagerDelegate* delegate) override {
+    gfx::NativeCursor new_cursor = cursor;
+    cursor_loader_.SetPlatformCursor(&new_cursor);
+    delegate->CommitCursor(new_cursor);
+    if (delegate->IsCursorVisible()) {
+      for (auto* host : hosts_)
+        host->SetCursor(new_cursor);
+    }
+  }
+
+  void SetVisibility(bool visible,
+                     wm::NativeCursorManagerDelegate* delegate) override {
+    delegate->CommitVisibility(visible);
+
+    if (visible) {
+      SetCursor(delegate->GetCursor(), delegate);
+    } else {
+      gfx::NativeCursor invisible_cursor(ui::mojom::CursorType::kNone);
+      cursor_loader_.SetPlatformCursor(&invisible_cursor);
+      for (auto* host : hosts_)
+        host->SetCursor(invisible_cursor);
+    }
+
+    for (auto* host : hosts_)
+      host->OnCursorVisibilityChanged(visible);
+  }
+
+  void SetCursorSize(ui::CursorSize cursor_size,
+                     wm::NativeCursorManagerDelegate* delegate) override {
+    NOTIMPLEMENTED();
+  }
+
+  void SetMouseEventsEnabled(
+      bool enabled,
+      wm::NativeCursorManagerDelegate* delegate) override {
+    delegate->CommitMouseEventsEnabled(enabled);
+    SetVisibility(delegate->IsCursorVisible(), delegate);
+    for (auto* host : hosts_)
+      host->dispatcher()->OnMouseEventsEnableStateChanged(enabled);
+  }
+
+  // The set of hosts to notify of changes in cursor state.
+  base::flat_set<aura::WindowTreeHost*> hosts_;
+
+  wm::CursorLoader cursor_loader_;
+};
+
+AuraContext::ContextualizedWindowTreeHost::ContextualizedWindowTreeHost(
+    base::PassKey<AuraContext>,
+    AuraContext* context,
+    std::unique_ptr<aura::WindowTreeHost> window_tree_host)
+    : context_(context), window_tree_host_(std::move(window_tree_host)) {
+  context_->InitializeWindowTreeHost(window_tree_host_.get());
+}
+
+AuraContext::ContextualizedWindowTreeHost::~ContextualizedWindowTreeHost() {
+  context_->UninitializeWindowTreeHost(window_tree_host_.get());
+}
+
+AuraContext::AuraContext()
+    : screen_(aura::TestScreen::Create(gfx::Size(1024, 768))) {
+  DCHECK(!display::Screen::GetScreen());
+  display::Screen::SetScreenInstance(screen_.get());
+  focus_controller_ = std::make_unique<wm::FocusController>(new FocusRules());
+  auto native_cursor_manager = std::make_unique<NativeCursorManager>();
+  native_cursor_manager_ = native_cursor_manager.get();
+  cursor_manager_ =
+      std::make_unique<wm::CursorManager>(std::move(native_cursor_manager));
+}
+
+AuraContext::~AuraContext() = default;
+
+std::unique_ptr<AuraContext::ContextualizedWindowTreeHost>
+AuraContext::CreateWindowTreeHost() {
+  ui::PlatformWindowInitProperties properties;
+  properties.bounds = gfx::Rect(gfx::Size(1024, 768));
+  auto host = aura::WindowTreeHost::Create(std::move(properties));
+  return std::make_unique<ContextualizedWindowTreeHost>(
+      base::PassKey<AuraContext>(), this, std::move(host));
+}
+
+void AuraContext::InitializeWindowTreeHost(aura::WindowTreeHost* host) {
+  host->InitHost();
+  aura::client::SetFocusClient(host->window(), focus_controller_.get());
+  wm::SetActivationClient(host->window(), focus_controller_.get());
+  host->window()->AddPreTargetHandler(focus_controller_.get());
+  host->window()->SetLayoutManager(
+      std::make_unique<FillLayout>(host->window()));
+
+  native_cursor_manager_->AddHost(host);
+  aura::client::SetCursorClient(host->window(), cursor_manager_.get());
+}
+
+void AuraContext::UninitializeWindowTreeHost(aura::WindowTreeHost* host) {
+  native_cursor_manager_->RemoveHost(host);
+  host->window()->RemovePreTargetHandler(focus_controller_.get());
+}
+
+}  // namespace webui_examples
diff --git a/ui/webui/examples/browser/ui/aura/aura_context.h b/ui/webui/examples/browser/ui/aura/aura_context.h
new file mode 100644
index 0000000..b1c2bed
--- /dev/null
+++ b/ui/webui/examples/browser/ui/aura/aura_context.h
@@ -0,0 +1,70 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_WEBUI_EXAMPLES_BROWSER_UI_AURA_AURA_CONTEXT_H_
+#define UI_WEBUI_EXAMPLES_BROWSER_UI_AURA_AURA_CONTEXT_H_
+
+#include <memory>
+
+#include "base/memory/raw_ptr.h"
+#include "base/types/pass_key.h"
+
+namespace aura {
+class WindowTreeHost;
+}
+
+namespace display {
+class Screen;
+}
+
+namespace wm {
+class CursorManager;
+class FocusController;
+}  // namespace wm
+
+namespace webui_examples {
+
+// Holds the necessary services so that a Aura WindowTreeHost behaves like a
+// normal application window, responding to focus and cursor events for example.
+class AuraContext {
+ public:
+  // Represents a WindowTreeHost with customizations and cleanup necessary for
+  // normal application window interaction.]
+  class ContextualizedWindowTreeHost {
+   public:
+    ContextualizedWindowTreeHost(
+        base::PassKey<AuraContext>,
+        AuraContext* context,
+        std::unique_ptr<aura::WindowTreeHost> window_tree_host);
+    ~ContextualizedWindowTreeHost();
+
+    aura::WindowTreeHost* window_tree_host() { return window_tree_host_.get(); }
+
+   private:
+    base::raw_ptr<AuraContext> const context_;
+    std::unique_ptr<aura::WindowTreeHost> const window_tree_host_;
+  };
+
+  AuraContext();
+  AuraContext(const AuraContext&) = delete;
+  AuraContext& operator=(const AuraContext&) = delete;
+  ~AuraContext();
+
+  std::unique_ptr<ContextualizedWindowTreeHost> CreateWindowTreeHost();
+
+ private:
+  class NativeCursorManager;
+
+  void InitializeWindowTreeHost(aura::WindowTreeHost* host);
+  void UninitializeWindowTreeHost(aura::WindowTreeHost* host);
+
+  std::unique_ptr<display::Screen> screen_;
+  std::unique_ptr<wm::FocusController> focus_controller_;
+  std::unique_ptr<wm::CursorManager> cursor_manager_;
+  base::raw_ptr<NativeCursorManager> native_cursor_manager_;
+};
+
+}  // namespace webui_examples
+
+#endif  // UI_WEBUI_EXAMPLES_BROWSER_UI_AURA_AURA_CONTEXT_H_
diff --git a/ui/webui/examples/browser/ui/aura/content_window.cc b/ui/webui/examples/browser/ui/aura/content_window.cc
new file mode 100644
index 0000000..ce85ec8
--- /dev/null
+++ b/ui/webui/examples/browser/ui/aura/content_window.cc
@@ -0,0 +1,83 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/webui/examples/browser/ui/aura/content_window.h"
+
+#include "base/containers/flat_set.h"
+#include "base/no_destructor.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/aura/window.h"
+#include "ui/aura/window_tree_host.h"
+#include "ui/aura/window_tree_host_observer.h"
+#include "ui/aura/window_tree_host_platform.h"
+#include "ui/platform_window/platform_window.h"
+#include "ui/wm/core/compound_event_filter.h"
+
+namespace webui_examples {
+
+namespace {
+
+class QuitOnClose : public aura::WindowTreeHostObserver {
+ public:
+  explicit QuitOnClose(base::OnceClosure window_close_requested)
+      : window_close_requested_(std::move(window_close_requested)) {}
+  QuitOnClose(const QuitOnClose&) = delete;
+  QuitOnClose& operator=(const QuitOnClose&) = delete;
+  ~QuitOnClose() override = default;
+
+  void OnHostCloseRequested(aura::WindowTreeHost* host) override {
+    std::move(window_close_requested_).Run();
+  }
+
+ private:
+  base::OnceClosure window_close_requested_;
+};
+
+}  // namespace
+
+ContentWindow::ContentWindow(AuraContext* aura_context,
+                             content::BrowserContext* browser_context) {
+  host_ = aura_context->CreateWindowTreeHost();
+
+  // Cursor support.
+  root_window_event_filter_ = std::make_unique<wm::CompoundEventFilter>();
+
+  content::WebContents::CreateParams params(browser_context);
+  web_contents_ = content::WebContents::Create(params);
+  aura::Window* web_contents_window = web_contents_->GetNativeView();
+  aura::WindowTreeHost* window_tree_host = host_->window_tree_host();
+  window_tree_host->window()->GetRootWindow()->AddChild(web_contents_window);
+  window_tree_host->window()->GetRootWindow()->AddPreTargetHandler(
+      root_window_event_filter_.get());
+}
+
+ContentWindow::~ContentWindow() = default;
+
+void ContentWindow::SetTitle(const std::u16string& title) {
+  aura::WindowTreeHost* window_tree_host = host_->window_tree_host();
+  window_tree_host->window()->SetTitle(title);
+  static_cast<aura::WindowTreeHostPlatform*>(window_tree_host)
+      ->platform_window()
+      ->SetTitle(title);
+}
+
+void ContentWindow::Show() {
+  web_contents_->GetNativeView()->Show();
+  aura::WindowTreeHost* window_tree_host = host_->window_tree_host();
+  window_tree_host->window()->Show();
+  window_tree_host->Show();
+}
+
+void ContentWindow::NavigateToURL(GURL url) {
+  content::NavigationController::LoadURLParams url_params(url);
+  web_contents_->GetController().LoadURLWithParams(url_params);
+}
+
+void ContentWindow::SetCloseCallback(base::OnceClosure on_close) {
+  host_->window_tree_host()->AddObserver(new QuitOnClose(std::move(on_close)));
+}
+
+}  // namespace webui_examples
diff --git a/ui/webui/examples/browser/ui/aura/content_window.h b/ui/webui/examples/browser/ui/aura/content_window.h
new file mode 100644
index 0000000..4edf997
--- /dev/null
+++ b/ui/webui/examples/browser/ui/aura/content_window.h
@@ -0,0 +1,49 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_WEBUI_EXAMPLES_BROWSER_UI_AURA_CONTENT_WINDOW_H_
+#define UI_WEBUI_EXAMPLES_BROWSER_UI_AURA_CONTENT_WINDOW_H_
+
+#include "base/callback.h"
+#include "ui/webui/examples/browser/ui/aura/aura_context.h"
+#include "url/gurl.h"
+
+namespace content {
+class BrowserContext;
+class WebContents;
+}  // namespace content
+
+namespace wm {
+class CompoundEventFilter;
+}  // namespace wm
+
+namespace webui_examples {
+
+// Represents a single window that hosts one WebContents stretched to the
+// window's size.
+class ContentWindow {
+ public:
+  ContentWindow(AuraContext* aura_context,
+                content::BrowserContext* browser_context);
+  ContentWindow(const ContentWindow&) = delete;
+  ContentWindow& operator=(const ContentWindow&) = delete;
+  ~ContentWindow();
+
+  void SetTitle(const std::u16string& title);
+
+  void Show();
+  void NavigateToURL(GURL url);
+  void SetCloseCallback(base::OnceClosure on_close);
+
+  content::WebContents* web_contents() { return web_contents_.get(); }
+
+ private:
+  std::unique_ptr<AuraContext::ContextualizedWindowTreeHost> host_;
+  std::unique_ptr<content::WebContents> web_contents_;
+  std::unique_ptr<wm::CompoundEventFilter> root_window_event_filter_;
+};
+
+}  // namespace webui_examples
+
+#endif  // UI_WEBUI_EXAMPLES_BROWSER_UI_AURA_CONTENT_WINDOW_H_
diff --git a/ui/webui/examples/browser/ui/aura/fill_layout.cc b/ui/webui/examples/browser/ui/aura/fill_layout.cc
new file mode 100644
index 0000000..8e8a3dd
--- /dev/null
+++ b/ui/webui/examples/browser/ui/aura/fill_layout.cc
@@ -0,0 +1,38 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/webui/examples/browser/ui/aura/fill_layout.h"
+
+#include "ui/aura/window.h"
+
+namespace webui_examples {
+
+FillLayout::FillLayout(aura::Window* root) : root_(root) {}
+
+FillLayout::~FillLayout() = default;
+
+void FillLayout::OnWindowResized() {
+  if (root_->bounds().IsEmpty())
+    return;
+  for (aura::Window* child : root_->children())
+    SetChildBoundsDirect(child, gfx::Rect(root_->bounds().size()));
+}
+
+void FillLayout::OnWindowAddedToLayout(aura::Window* child) {
+  child->SetBounds(root_->bounds());
+}
+
+void FillLayout::OnWillRemoveWindowFromLayout(aura::Window* child) {}
+
+void FillLayout::OnWindowRemovedFromLayout(aura::Window* child) {}
+
+void FillLayout::OnChildWindowVisibilityChanged(aura::Window* child,
+                                                bool visible) {}
+
+void FillLayout::SetChildBounds(aura::Window* child,
+                                const gfx::Rect& requested_bounds) {
+  SetChildBoundsDirect(child, requested_bounds);
+}
+
+}  // namespace webui_examples
diff --git a/ui/webui/examples/browser/ui/aura/fill_layout.h b/ui/webui/examples/browser/ui/aura/fill_layout.h
new file mode 100644
index 0000000..8c0a774
--- /dev/null
+++ b/ui/webui/examples/browser/ui/aura/fill_layout.h
@@ -0,0 +1,40 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_WEBUI_EXAMPLES_BROWSER_UI_AURA_FILL_LAYOUT_H_
+#define UI_WEBUI_EXAMPLES_BROWSER_UI_AURA_FILL_LAYOUT_H_
+
+#include "base/memory/raw_ptr.h"
+#include "ui/aura/layout_manager.h"
+
+namespace aura {
+class Window;
+}
+
+namespace webui_examples {
+
+class FillLayout : public aura::LayoutManager {
+ public:
+  explicit FillLayout(aura::Window* root);
+  FillLayout(const FillLayout&) = delete;
+  FillLayout& operator=(const FillLayout&) = delete;
+  ~FillLayout() override;
+
+ private:
+  // aura::LayoutManager:
+  void OnWindowResized() override;
+  void OnWindowAddedToLayout(aura::Window* child) override;
+  void OnWillRemoveWindowFromLayout(aura::Window* child) override;
+  void OnWindowRemovedFromLayout(aura::Window* child) override;
+  void OnChildWindowVisibilityChanged(aura::Window* child,
+                                      bool visible) override;
+  void SetChildBounds(aura::Window* child,
+                      const gfx::Rect& requested_bounds) override;
+
+  raw_ptr<aura::Window> const root_;
+};
+
+}  // namespace webui_examples
+
+#endif  // UI_WEBUI_EXAMPLES_BROWSER_UI_AURA_FILL_LAYOUT_H_
diff --git a/ui/webui/examples/resources/webui_examples_resources.grd b/ui/webui/examples/resources/webui_examples_resources.grd
new file mode 100644
index 0000000..801656f66
--- /dev/null
+++ b/ui/webui/examples/resources/webui_examples_resources.grd
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grit base_dir="." latest_public_release="0" current_release="1"
+      output_all_resource_defines="false" source_lang_id="en" enc_check="möl">
+  <outputs>
+    <output filename="grit/webui_examples_resources.h" type="rc_header">
+      <emit emit_type='prepend'></emit>
+    </output>
+    <output filename="webui_examples_resources.pak"
+            type="data_package" lang="en" />
+  </outputs>
+  <release seq="1">
+    <messages fallback_to_english="true">
+      <message translateable="false" name="IDS_WEBUI_EXAMPLES_WINDOW_TITLE">
+        WebUI Examples
+      </message>
+    </messages>
+  </release>
+</grit>
diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn
index 0f4c6ed..98d3623 100644
--- a/ui/webui/resources/BUILD.gn
+++ b/ui/webui/resources/BUILD.gn
@@ -161,7 +161,7 @@
   "cr_elements/policy/cr_policy_indicator_behavior.d.ts",
   "cr_elements/web_ui_listener_behavior.d.ts",
   "js/parse_html_subset.d.ts",
-  "js/promise_resolver.m.d.ts",
+  "js/promise_resolver.d.ts",
   "js/static_types.d.ts",
 ]
 
diff --git a/ui/webui/resources/html/BUILD.gn b/ui/webui/resources/html/BUILD.gn
index 51d21b7..8428583 100644
--- a/ui/webui/resources/html/BUILD.gn
+++ b/ui/webui/resources/html/BUILD.gn
@@ -15,9 +15,5 @@
     "test_loader.html",
   ]
 
-  if (is_chromeos_ash) {
-    input_files += [ "promise_resolver.html" ]
-  }
-
   input_files_base_dir = rebase_path(".", "//")
 }
diff --git a/ui/webui/resources/html/promise_resolver.html b/ui/webui/resources/html/promise_resolver.html
deleted file mode 100644
index 11f7be9f..0000000
--- a/ui/webui/resources/html/promise_resolver.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<link rel="import" href="assert.html">
-<script src="../js/promise_resolver.js"></script>
diff --git a/ui/webui/resources/js/BUILD.gn b/ui/webui/resources/js/BUILD.gn
index 106f280..ff6f896c 100644
--- a/ui/webui/resources/js/BUILD.gn
+++ b/ui/webui/resources/js/BUILD.gn
@@ -69,6 +69,7 @@
     "load_time_data.m.js",
     "parse_html_subset.js",
     "plural_string_proxy.js",
+    "promise_resolver.js",
     "static_types.js",
     "test_loader.js",
     "test_loader_util.js",
@@ -86,10 +87,7 @@
 
   # TODO(crbug.com/1184053): Fully remove once no longer used by CrOS.
   if (is_chromeos_ash) {
-    in_files += [
-      "list_property_update_behavior.js",
-      "promise_resolver.js",
-    ]
+    in_files += [ "list_property_update_behavior.js" ]
   }
 
   if (is_ios) {
@@ -111,7 +109,6 @@
   in_files = [
     "assert.m.js",
     "load_time_data.js",
-    "promise_resolver.m.js",
   ]
 }
 
@@ -124,7 +121,6 @@
   deps = [
     ":assert",
     ":load_time_data",
-    ":promise_resolver",
     ":util_deprecated",
     ":webui_resource_test",
   ]
@@ -151,10 +147,6 @@
   extra_deps = [ ":unmodulize" ]
 }
 
-js_library("promise_resolver") {
-  deps = [ ":assert" ]
-}
-
 js_library("util_deprecated") {
 }
 
@@ -168,10 +160,7 @@
 # Targets for auto-generating and type-checking JS Modules
 
 js_modulizer("modulize") {
-  input_files = [
-    "assert.js",
-    "promise_resolver.js",
-  ]
+  input_files = [ "assert.js" ]
 }
 
 js_unmodulizer("unmodulize") {
@@ -200,7 +189,7 @@
     ":load_time_data.m",
     ":parse_html_subset",
     ":plural_string_proxy",
-    ":promise_resolver.m",
+    ":promise_resolver",
     ":static_types",
     ":util.m",
   ]
@@ -214,7 +203,7 @@
 js_library("cr.m") {
   deps = [
     ":assert.m",
-    ":promise_resolver.m",
+    ":promise_resolver",
   ]
   externs_list = [ "$externs_path/chrome_send.js" ]
 }
@@ -242,10 +231,8 @@
   deps = [ ":cr.m" ]
 }
 
-js_library("promise_resolver.m") {
-  sources = [ "$root_gen_dir/ui/webui/resources/js/promise_resolver.m.js" ]
+js_library("promise_resolver") {
   deps = [ ":assert.m" ]
-  extra_deps = [ ":modulize" ]
 }
 
 js_library("static_types") {
diff --git a/ui/webui/resources/js/cr.m.js b/ui/webui/resources/js/cr.m.js
index 79bd0be..15debb9 100644
--- a/ui/webui/resources/js/cr.m.js
+++ b/ui/webui/resources/js/cr.m.js
@@ -10,7 +10,7 @@
  * it.
  */
 import {assert, assertNotReached} from './assert.m.js';
-import {PromiseResolver} from './promise_resolver.m.js';
+import {PromiseResolver} from './promise_resolver.js';
 
 /** @typedef {{eventName: string, uid: number}} */
 export let WebUIListener;
diff --git a/ui/webui/resources/js/promise_resolver.m.d.ts b/ui/webui/resources/js/promise_resolver.d.ts
similarity index 100%
rename from ui/webui/resources/js/promise_resolver.m.d.ts
rename to ui/webui/resources/js/promise_resolver.d.ts
diff --git a/ui/webui/resources/js/promise_resolver.js b/ui/webui/resources/js/promise_resolver.js
index 96b5a83..86b2936 100644
--- a/ui/webui/resources/js/promise_resolver.js
+++ b/ui/webui/resources/js/promise_resolver.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// #import {assertNotReached} from './assert.m.js';
+import {assertNotReached} from './assert.m.js';
 
 /**
  * @fileoverview PromiseResolver is a helper class that allows creating a
@@ -20,7 +20,7 @@
 
 /** @template T */
 // eslint-disable-next-line no-var
-/* #export */ var PromiseResolver = class {
+export var PromiseResolver = class {
   constructor() {
     /** @private {function(T=): void} */
     this.resolve_;
@@ -81,4 +81,3 @@
   }
 };
 
-/* #ignore */ console.warn('crbug/1173575, non-JS module files deprecated.');