Merge autoland to mozilla-central. a=merge
authorNarcis Beleuzu <nbeleuzu@mozilla.com>
Wed, 22 Sep 2021 07:06:10 +0300
changeset 592869 b6fd434586384c1ff3e4059dee52e465e7a63d49
parent 592603 abda04d0bfe3304e216ac64e2848e9867d9f494b (current diff)
parent 592868 5634136874d920ab4dbf6da06f9543eac90a32ed (diff)
child 592879 7c49ccf739711e11da285795789ce342e47a770d
push id38811
push usernbeleuzu@mozilla.com
push dateWed, 22 Sep 2021 04:09:13 +0000
treeherdermozilla-central@b6fd43458638 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone94.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge autoland to mozilla-central. a=merge
js/src/jsapi-tests/testGCExactRooting.cpp
netwerk/base/nsStandardURL.h
--- a/.cargo/config.in
+++ b/.cargo/config.in
@@ -20,17 +20,17 @@ rev = "72eb355ddeada541d7e57dbe5fb60eb51
 [source."https://github.com/mozilla/l10nregistry-rs"]
 git = "https://github.com/mozilla/l10nregistry-rs"
 replace-with = "vendored-sources"
 rev = "a69df9836b1ef536727195209013b9ad6b132618"
 
 [source."https://github.com/mozilla/cubeb-pulse-rs"]
 git = "https://github.com/mozilla/cubeb-pulse-rs"
 replace-with = "vendored-sources"
-rev = "3ad5978575f501ab10b1753626f176f1bba3f584"
+rev = "b5aea956e1478b9d0c67911a35fe0aa9d544307a"
 
 [source."https://github.com/mozilla/cubeb-coreaudio-rs"]
 git = "https://github.com/mozilla/cubeb-coreaudio-rs"
 replace-with = "vendored-sources"
 rev = "4ee3b283182926f9a8bb31d603219ff2db70d2fd"
 
 [source."https://github.com/mozilla/audioipc-2"]
 git = "https://github.com/mozilla/audioipc-2"
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,9 +17,9 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-Merge day clobber
\ No newline at end of file
+Bug 1717151 - ANGLE update requires clobber
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1053,17 +1053,17 @@ dependencies = [
  "mach",
  "ringbuf",
  "triple_buffer",
 ]
 
 [[package]]
 name = "cubeb-pulse"
 version = "0.3.0"
-source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=3ad5978575f501ab10b1753626f176f1bba3f584#3ad5978575f501ab10b1753626f176f1bba3f584"
+source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=b5aea956e1478b9d0c67911a35fe0aa9d544307a#b5aea956e1478b9d0c67911a35fe0aa9d544307a"
 dependencies = [
  "cubeb-backend",
  "pulse",
  "pulse-ffi",
  "ringbuf",
  "semver",
 ]
 
@@ -1776,19 +1776,21 @@ dependencies = [
  "rkv",
  "tempfile",
 ]
 
 [[package]]
 name = "gecko-profiler"
 version = "0.1.0"
 dependencies = [
+ "bincode",
  "bindgen",
  "lazy_static",
  "profiler-macros",
+ "serde",
 ]
 
 [[package]]
 name = "gecko_logger"
 version = "0.1.0"
 dependencies = [
  "app_services_logger",
  "env_logger",
@@ -3926,26 +3928,26 @@ dependencies = [
  "proc-macro2",
  "quote",
  "syn",
 ]
 
 [[package]]
 name = "pulse"
 version = "0.3.0"
-source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=3ad5978575f501ab10b1753626f176f1bba3f584#3ad5978575f501ab10b1753626f176f1bba3f584"
+source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=b5aea956e1478b9d0c67911a35fe0aa9d544307a#b5aea956e1478b9d0c67911a35fe0aa9d544307a"
 dependencies = [
  "bitflags",
  "pulse-ffi",
 ]
 
 [[package]]
 name = "pulse-ffi"
 version = "0.1.0"
-source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=3ad5978575f501ab10b1753626f176f1bba3f584#3ad5978575f501ab10b1753626f176f1bba3f584"
+source = "git+https://github.com/mozilla/cubeb-pulse-rs?rev=b5aea956e1478b9d0c67911a35fe0aa9d544307a#b5aea956e1478b9d0c67911a35fe0aa9d544307a"
 dependencies = [
  "libc",
 ]
 
 [[package]]
 name = "qcms"
 version = "0.2.0"
 dependencies = [
--- a/accessible/base/AccAttributes.h
+++ b/accessible/base/AccAttributes.h
@@ -40,18 +40,18 @@ struct Color {
 struct DeleteEntry {
   DeleteEntry() : mValue(true) {}
   bool mValue;
 };
 
 class AccAttributes {
   friend struct IPC::ParamTraits<AccAttributes*>;
   using AttrValueType =
-      Variant<bool, float, double, int32_t, RefPtr<nsAtom>, CopyableTArray<int32_t>,
-              CSSCoord, FontSize, Color, DeleteEntry>;
+      Variant<bool, float, double, int32_t, RefPtr<nsAtom>,
+              CopyableTArray<int32_t>, CSSCoord, FontSize, Color, DeleteEntry>;
   static_assert(sizeof(AttrValueType) <= 16);
   using AtomVariantMap = nsTHashMap<nsRefPtrHashKey<nsAtom>, AttrValueType>;
 
  protected:
   ~AccAttributes() = default;
 
  public:
   AccAttributes() = default;
--- a/accessible/ipc/IPCTypes.h
+++ b/accessible/ipc/IPCTypes.h
@@ -35,17 +35,18 @@ template <>
 struct ParamTraits<mozilla::a11y::AccGenericType>
     : public BitFlagsEnumSerializer<
           mozilla::a11y::AccGenericType,
           mozilla::a11y::AccGenericType::eAllGenericTypes> {};
 
 template <>
 struct ParamTraits<mozilla::a11y::CacheUpdateType>
     : public ContiguousEnumSerializerInclusive<
-          mozilla::a11y::CacheUpdateType, mozilla::a11y::CacheUpdateType::Initial,
+          mozilla::a11y::CacheUpdateType,
+          mozilla::a11y::CacheUpdateType::Initial,
           mozilla::a11y::CacheUpdateType::Update> {};
 
 template <>
 struct ParamTraits<mozilla::a11y::FontSize> {
   typedef mozilla::a11y::FontSize paramType;
 
   static void Write(Message* aMsg, const paramType& aParam) {
     WriteParam(aMsg, aParam.mValue);
--- a/browser/base/content/test/static/browser_all_files_referenced.js
+++ b/browser/base/content/test/static/browser_all_files_referenced.js
@@ -49,16 +49,20 @@ var gExceptionPaths = [
 
   // Exclude all services-automation because they are used through webdriver
   "resource://gre/modules/services-automation/",
   "resource://services-automation/ServicesAutomation.jsm",
 
   // Paths from this folder are constructed in NetErrorParent.jsm based on
   // the type of cert or net error the user is encountering.
   "chrome://browser/content/certerror/supportpages/",
+
+  // Points to theme preview images, which are defined in browser/ but only used
+  // in toolkit/mozapps/extensions/content/aboutaddons.js.
+  "resource://usercontext-content/builtin-themes/",
 ];
 
 // These are not part of the omni.ja file, so we find them only when running
 // the test on a non-packaged build.
 if (AppConstants.platform == "macosx") {
   gExceptionPaths.push("resource://gre/res/cursors/");
   gExceptionPaths.push("resource://gre/res/touchbar/");
 }
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -1388,38 +1388,140 @@ BrowserGlue.prototype = {
 
     if (
       AppConstants.NIGHTLY_BUILD &&
       Services.prefs.getBoolPref(
         "browser.theme.temporary.monochromatic.enabled",
         false
       )
     ) {
-      // Temporarily install a prototype monochromatic theme for UX iteration.
-      // We uninstall it during shutdown so it does not persist if the pref is
-      // disabled.
-      const kMonochromaticThemeID = "firefox-monochromatic-purple@mozilla.org";
-      AddonManager.maybeInstallBuiltinAddon(
-        kMonochromaticThemeID,
-        "1.0",
-        "resource://builtin-themes/monochromatic-purple/"
-      );
-      AsyncShutdown.profileChangeTeardown.addBlocker(
-        "Uninstall Prototype Monochromatic Theme",
-        async () => {
-          try {
-            let addon = await AddonManager.getAddonByID(kMonochromaticThemeID);
-            await addon.uninstall();
-          } catch (e) {
-            Cu.reportError(
-              "Failed to uninstall firefox-monochromatic-purple on shutdown"
-            );
+      // List of monochromatic themes. The themes are represented by objects
+      // containing their id, current version, and path relative to
+      // resource://builtin-themes/monochromatic/.
+      const kMonochromaticThemeList = [
+        {
+          id: "firefox-lush-soft@mozilla.org",
+          version: "1.0",
+          path: "lush/soft/",
+        },
+        {
+          id: "firefox-lush-balanced@mozilla.org",
+          version: "1.0",
+          path: "lush/balanced/",
+        },
+        {
+          id: "firefox-lush-soft@mozilla.org",
+          version: "1.0",
+          path: "lush/soft/",
+        },
+        {
+          id: "firefox-lush-balanced@mozilla.org",
+          version: "1.0",
+          path: "lush/balanced/",
+        },
+        {
+          id: "firefox-lush-bold@mozilla.org",
+          version: "1.0",
+          path: "lush/bold/",
+        },
+        {
+          id: "firefox-abstract-soft@mozilla.org",
+          version: "1.0",
+          path: "abstract/soft/",
+        },
+        {
+          id: "firefox-abstract-balanced@mozilla.org",
+          version: "1.0",
+          path: "abstract/balanced/",
+        },
+        {
+          id: "firefox-abstract-bold@mozilla.org",
+          version: "1.0",
+          path: "abstract/bold/",
+        },
+        {
+          id: "firefox-elemental-soft@mozilla.org",
+          version: "1.0",
+          path: "elemental/soft/",
+        },
+        {
+          id: "firefox-elemental-balanced@mozilla.org",
+          version: "1.0",
+          path: "elemental/balanced/",
+        },
+        {
+          id: "firefox-elemental-bold@mozilla.org",
+          version: "1.0",
+          path: "elemental/bold/",
+        },
+        {
+          id: "firefox-cheers-soft@mozilla.org",
+          version: "1.0",
+          path: "cheers/soft/",
+        },
+        {
+          id: "firefox-cheers-balanced@mozilla.org",
+          version: "1.0",
+          path: "cheers/balanced/",
+        },
+        {
+          id: "firefox-cheers-bold@mozilla.org",
+          version: "1.0",
+          path: "cheers/bold/",
+        },
+        {
+          id: "firefox-graffiti-soft@mozilla.org",
+          version: "1.0",
+          path: "graffiti/soft/",
+        },
+        {
+          id: "firefox-graffiti-balanced@mozilla.org",
+          version: "1.0",
+          path: "graffiti/balanced/",
+        },
+        {
+          id: "firefox-graffiti-bold@mozilla.org",
+          version: "1.0",
+          path: "graffiti/bold/",
+        },
+        {
+          id: "firefox-foto-soft@mozilla.org",
+          version: "1.0",
+          path: "foto/soft/",
+        },
+        {
+          id: "firefox-foto-balanced@mozilla.org",
+          version: "1.0",
+          path: "foto/balanced/",
+        },
+        {
+          id: "firefox-foto-bold@mozilla.org",
+          version: "1.0",
+          path: "foto/bold/",
+        },
+      ];
+      for (let { id, version, path } of kMonochromaticThemeList) {
+        AddonManager.maybeInstallBuiltinAddon(
+          id,
+          version,
+          `resource://builtin-themes/monochromatic/${path}`
+        );
+
+        AsyncShutdown.profileChangeTeardown.addBlocker(
+          "Uninstall Monochromatic Theme",
+          async () => {
+            try {
+              let addon = await AddonManager.getAddonByID(id);
+              await addon.uninstall();
+            } catch (e) {
+              Cu.reportError(`Failed to uninstall ${id} on shutdown`);
+            }
           }
-        }
-      );
+        );
+      }
     }
 
     if (AppConstants.MOZ_NORMANDY) {
       Normandy.init();
     }
 
     SaveToPocket.init();
 
@@ -3310,17 +3412,17 @@ BrowserGlue.prototype = {
       );
     });
   },
 
   // eslint-disable-next-line complexity
   _migrateUI: function BG__migrateUI() {
     // Use an increasing number to keep track of the current migration state.
     // Completely unrelated to the current Firefox release number.
-    const UI_VERSION = 117;
+    const UI_VERSION = 118;
     const BROWSER_DOCURL = AppConstants.BROWSER_CHROME_URL;
 
     if (!Services.prefs.prefHasUserValue("browser.migration.version")) {
       // This is a new profile, nothing to migrate.
       Services.prefs.setIntPref("browser.migration.version", UI_VERSION);
       this._isNewProfile = true;
       return;
     }
@@ -3938,16 +4040,39 @@ BrowserGlue.prototype = {
       // 113 (bug 1714409): Add HEURISTIC_ENGINE_ALIAS group
       // 114 (bug 1662172): Add HEURISTIC_BOOKMARK_KEYWORD group
       // 115 (bug 1713322): Move TAIL_SUGGESTION group and rename properties
       // 116 (bug 1717509): Remove HEURISTIC_UNIFIED_COMPLETE group
       // 117 (bug 1710518): Add GENERAL_PARENT group
       UrlbarPrefs.migrateResultBuckets();
     }
 
+    if (currentUIVersion < 118 && AppConstants.NIGHTLY_BUILD) {
+      // Uninstall experimental monochromatic purple theme.
+      let addonPromise;
+      try {
+        addonPromise = AddonManager.getAddonByID(
+          "firefox-monochromatic-purple@mozilla.org"
+        );
+      } catch (error) {
+        Cu.reportError(
+          "Could not access the AddonManager to upgrade the profile. This is most " +
+            "likely because the upgrader is being run from an xpcshell test where " +
+            "the AddonManager is not initialized."
+        );
+      }
+      Promise.resolve(addonPromise).then(addon => {
+        if (!addon) {
+          // Either the addon wasn't installed, or the call to getAddonByID failed.
+          return;
+        }
+        addon.uninstall().catch(Cu.reportError);
+      }, Cu.reportError);
+    }
+
     // Update the migration version.
     Services.prefs.setIntPref("browser.migration.version", UI_VERSION);
   },
 
   _showUpgradeDialog() {
     BrowserWindowTracker.getTopWindow().gDialogBox.open(
       "chrome://browser/content/upgradeDialog.html"
     );
--- a/browser/components/customizableui/CustomizeMode.jsm
+++ b/browser/components/customizableui/CustomizeMode.jsm
@@ -83,18 +83,16 @@ XPCOMUtils.defineLazyGetter(this, "log",
   };
   return new scope.ConsoleAPI(consoleOptions);
 });
 
 const DEFAULT_THEME_ID = "default-theme@mozilla.org";
 const LIGHT_THEME_ID = "firefox-compact-light@mozilla.org";
 const DARK_THEME_ID = "firefox-compact-dark@mozilla.org";
 const ALPENGLOW_THEME_ID = "firefox-alpenglow@mozilla.org";
-const MONOCHROMATIC_PURPLE_THEME_ID =
-  "firefox-monochromatic-purple@mozilla.org";
 
 const _defaultImportantThemes = [
   DEFAULT_THEME_ID,
   LIGHT_THEME_ID,
   DARK_THEME_ID,
   ALPENGLOW_THEME_ID,
 ];
 
@@ -1581,24 +1579,16 @@ CustomizeMode.prototype = {
       return tbb;
     }
 
     let themes = await AddonManager.getAddonsByTypes(["theme"]);
     let currentTheme = themes.find(theme => theme.isActive);
 
     // Move the current theme (if any) and the default themes to the start:
     let importantThemes = new Set(_defaultImportantThemes);
-    if (
-      Services.prefs.getBoolPref(
-        "browser.theme.temporary.monochromatic.enabled",
-        false
-      )
-    ) {
-      importantThemes.add(MONOCHROMATIC_PURPLE_THEME_ID);
-    }
     if (currentTheme) {
       importantThemes.add(currentTheme.id);
     }
     let importantList = [];
     for (let importantTheme of importantThemes) {
       importantList.push(
         ...themes.splice(
           themes.findIndex(theme => theme.id == importantTheme),
--- a/browser/components/newtab/lib/ASRouterTargeting.jsm
+++ b/browser/components/newtab/lib/ASRouterTargeting.jsm
@@ -190,21 +190,23 @@ function CheckBrowserNeedsUpdate(
     expire() {
       this._lastUpdated = 0;
       this._value = null;
     },
     get() {
       return new Promise((resolve, reject) => {
         const now = Date.now();
         const updateServiceListener = {
-          onCheckComplete(request, updates) {
+          // eslint-disable-next-line require-await
+          async onCheckComplete(request, updates) {
             checker._value = !!updates.length;
             resolve(checker._value);
           },
-          onError(request, update) {
+          // eslint-disable-next-line require-await
+          async onError(request, update) {
             reject(request);
           },
 
           QueryInterface: ChromeUtils.generateQI(["nsIUpdateCheckListener"]),
         };
 
         if (UpdateChecker && now - this._lastUpdated >= updateInterval) {
           const checkerInstance = UpdateChecker.createInstance(
--- a/browser/components/places/metadataViewer/interactionsViewer.js
+++ b/browser/components/places/metadataViewer/interactionsViewer.js
@@ -91,16 +91,17 @@ class TableViewer {
 #tableViewer {
   display: grid;
   grid-template-columns: ${this.cssGridTemplateColumns}
 }
 
 /* Sets the first row of elements to bold. The number is the number of columns */
 #tableViewer > div:nth-child(-n+${numColumns}) {
   font-weight: bold;
+  white-space: break-spaces;
 }
 
 /* Highlights every other row to make visual scanning of the table easier.
    The numbers need to be adapted if the number of columns changes. */
 `;
     for (let i = numColumns + 1; i <= numColumns * 2 - 1; i++) {
       styleText += `#tableViewer > div:nth-child(${numColumns}n+${i}):nth-child(${numColumns *
         2}n+${i}),\n`;
@@ -182,17 +183,17 @@ class TableViewer {
 }
 
 /**
  * Viewer definition for the page metadata.
  */
 const metadataHandler = new (class extends TableViewer {
   title = "Interactions";
   cssGridTemplateColumns =
-    "max-content fit-content(100%) repeat(4, max-content) fit-content(100%);";
+    "max-content fit-content(100%) repeat(6, min-content) fit-content(100%);";
 
   /**
    * @see TableViewer.columnMap
    */
   columnMap = new Map([
     ["id", { header: "ID" }],
     ["url", { header: "URL", includeTitle: true }],
     [
@@ -212,16 +213,24 @@ const metadataHandler = new (class exten
     [
       "typing_time",
       {
         header: "Typing Time (s)",
         modifier: typingTime => (typingTime / 1000).toFixed(2),
       },
     ],
     ["key_presses", { header: "Key Presses" }],
+    [
+      "scrolling_time",
+      {
+        header: "Scroll Time (s)",
+        modifier: scrollingTime => (scrollingTime / 1000).toFixed(2),
+      },
+    ],
+    ["scrolling_distance", { header: "Scroll Distance (pixels)" }],
     ["referrer", { header: "Referrer", includeTitle: true }],
   ]);
 
   /**
    * A reference to the database connection.
    *
    * @typedef {mozIStorageConnection}
    */
@@ -242,17 +251,17 @@ const metadataHandler = new (class exten
   }
 
   /**
    * Loads the current metadata from the database and updates the display.
    */
   async updateDisplay() {
     let rows = await this.#getRows(
       `SELECT m.id AS id, h.url AS url, updated_at, total_view_time,
-              typing_time, key_presses, h2.url as referrer
+              typing_time, key_presses, scrolling_time, scrolling_distance, h2.url as referrer
        FROM moz_places_metadata m
        JOIN moz_places h ON h.id = m.place_id
        LEFT JOIN moz_places h2 ON h2.id = m.referrer_place_id
        ORDER BY updated_at DESC
        LIMIT ${this.maxRows}`
     );
     this.displayData(rows);
   }
@@ -267,16 +276,18 @@ const metadataHandler = new (class exten
       m.referrer_place_id,
       h.origin_id,
       m.updated_at,
       m.total_view_time,
       h.visit_count,
       h.frecency,
       m.typing_time,
       m.key_presses,
+      m.scrolling_time,
+      m.scrolling_distance,
       vall.visit_dates,
       vall.visit_types
   FROM moz_places_metadata m
   JOIN moz_places h ON h.id = m.place_id
   JOIN
       (SELECT
           place_id,
           group_concat(visit_date, ',') AS visit_dates,
@@ -293,16 +304,18 @@ const metadataHandler = new (class exten
         "referrer_place_id",
         "origin_id",
         "updated_at",
         "total_view_time",
         "visit_count",
         "frecency",
         "typing_time",
         "key_presses",
+        "scrolling_time",
+        "scrolling_distance",
         "visit_dates",
         "visit_types",
       ]
     );
   }
 })();
 
 /**
--- a/browser/components/preferences/main.inc.xhtml
+++ b/browser/components/preferences/main.inc.xhtml
@@ -82,18 +82,23 @@
 
 #ifdef XP_WIN
     <checkbox id="showTabsInTaskbar" data-l10n-id="show-tabs-in-taskbar"
               preference="browser.taskbar.previews.enable"/>
 #endif
 
     <vbox id="browserContainersbox" hidden="true">
       <hbox id="browserContainersExtensionContent"
-            align="center" class="extension-controlled">
-        <description control="disableContainersExtension" flex="1" />
+            align="center" class="extension-controlled info-box-container">
+        <hbox flex="1">
+          <hbox class="info-icon-container">
+            <image class="info-icon"></image>
+          </hbox>
+          <description control="disableContainersExtension" class="description-with-side-element" flex="1" />
+        </hbox>
         <button id="disableContainersExtension"
                 is="highlightable-button"
                 class="extension-controlled-button accessory-button"
                 data-l10n-id="disable-extension" />
       </hbox>
       <hbox align="center">
         <checkbox id="browserContainersCheckbox"
                   class="tail-with-learn-more"
@@ -541,34 +546,40 @@
                 disabled="true"/>
       </hbox>
     </stack>
   </vbox>
 #endif
 
 #ifdef MOZ_UPDATER
   <description id="updateAllowDescription" data-l10n-id="update-application-allow-description"></description>
-  <vbox id="updateSettingsContainer">
+  <vbox id="updateSettingsContainer" class="info-box-container">
     <radiogroup id="updateRadioGroup">
       <radio id="autoDesktop"
              value="true"
              data-l10n-id="update-application-auto"/>
 #ifdef MOZ_UPDATE_AGENT
       <checkbox id="backgroundUpdate"
                 class="indent"
                 hidden="true"
                 data-l10n-id="update-application-background-enabled"/>
 #endif
       <radio id="manualDesktop"
              value="false"
              data-l10n-id="update-application-check-choose"/>
     </radiogroup>
-    <description id="updateSettingCrossUserWarning" hidden="true"
-                 data-l10n-id="update-application-warning-cross-user-setting">
-    </description>
+    <hbox id="updateSettingCrossUserWarningDesc" hidden="true">
+      <hbox class="info-icon-container">
+        <image class="info-icon"></image>
+      </hbox>
+      <description id="updateSettingCrossUserWarning"
+                   flex="1"
+                   data-l10n-id="update-application-warning-cross-user-setting">
+      </description>
+    </hbox>
   </vbox>
 #ifdef MOZ_MAINTENANCE_SERVICE
   <checkbox id="useService"
             data-l10n-id="update-application-use-service"
             preference="app.update.service.enabled"/>
 #endif
 #endif
 </groupbox>
--- a/browser/components/preferences/main.js
+++ b/browser/components/preferences/main.js
@@ -734,17 +734,19 @@ var gMainPane = {
       if (AppConstants.platform == "win") {
         // On Windows, the Application Update setting is an installation-
         // specific preference, not a profile-specific one. Show a warning to
         // inform users of this.
         let updateContainer = document.getElementById(
           "updateSettingsContainer"
         );
         updateContainer.classList.add("updateSettingCrossUserWarningContainer");
-        document.getElementById("updateSettingCrossUserWarning").hidden = false;
+        document.getElementById(
+          "updateSettingCrossUserWarningDesc"
+        ).hidden = false;
       }
 
       if (AppConstants.MOZ_MAINTENANCE_SERVICE) {
         // Check to see if the maintenance service is installed.
         // If it isn't installed, don't show the preference at all.
         let installed;
         try {
           let wrk = Cc["@mozilla.org/windows-registry-key;1"].createInstance(
--- a/browser/components/preferences/preferences.xhtml
+++ b/browser/components/preferences/preferences.xhtml
@@ -172,23 +172,22 @@
       <!-- If you change the code within the oncommand handler of 'focusSearch1' you have to update the current hash of
            sha512-X8+p/CqXeMdssOoFOf5RV+RpkvnN9pukQ20acGc7LqMgfYLW+lR0WAYT66OtSTpFHE/Qgx/ZCBs2RMc4QrA8FQ== within the CSP above. -->
       <key data-l10n-id="focus-search" key="" modifiers="accel" id="focusSearch1" oncommand="gSearchResultsPane.searchInput.focus();"/>
     </keyset>
 
     <vbox class="main-content" flex="1" align="start">
       <vbox class="pane-container">
         <hbox class="sticky-container" pack="end" align="start">
-          <hbox id="policies-container" align="stretch" flex="1" hidden="true">
-            <hbox align="center">
+          <hbox id="policies-container" class="info-box-container smaller-font-size" flex="1" hidden="true">
+            <hbox class="info-icon-container">
               <image class="info-icon"></image>
             </hbox>
             <hbox align="center" flex="1">
-              <label class="policies-label"
-                     flex="1"
+              <label flex="1"
                      href="about:policies"
                      useoriginprincipal="true"
                      is="text-link"
                      data-l10n-id="managed-notice"/>
             </hbox>
           </hbox>
           <search-textbox
             id="searchInput"
--- a/browser/components/preferences/privacy.inc.xhtml
+++ b/browser/components/preferences/privacy.inc.xhtml
@@ -39,175 +39,179 @@
                     permissions-remove.label,
                     permissions-remove-all.label,
                     permissions-exceptions-etp-window.title,
                     permissions-exceptions-etp-desc,
                   "/>
         </hbox>
       </vbox>
     </hbox>
-    <hbox id="fpiIncompatibilityWarning" align="start" hidden="true">
-      <image class="info-icon fpi-warning-icon"></image>
+    <hbox id="fpiIncompatibilityWarning" class="info-box-container" hidden="true">
+      <vbox class="info-icon-container">
+        <image class="info-icon"></image>
+      </vbox>
       <vbox flex="1">
         <description>
-          <html:span class="tail-with-learn-more" data-l10n-id="content-blocking-fpi-incompatibility-warning"/>
+          <html:span data-l10n-id="content-blocking-fpi-incompatibility-warning"/>
         </description>
       </vbox>
     </hbox>
     <vbox id="contentBlockingCategories">
-        <radiogroup id="contentBlockingCategoryRadio"
-                    preference="browser.contentblocking.category"
-                    aria-labelledby="trackingProtectionMenuDesc">
-          <vbox id="contentBlockingOptionStandard" class="content-blocking-category">
-            <hbox>
-              <radio id="standardRadio"
-                     value="standard"
-                     data-l10n-id="enhanced-tracking-protection-setting-standard"
-                     flex="1"/>
-              <button id="standardArrow"
-                      is="highlightable-button"
-                      class="arrowhead default-content-blocking-ui"
-                      data-l10n-id="content-blocking-expand-section"
-                      aria-expanded="false"/>
-            </hbox>
-            <vbox class="indent default-content-blocking-ui">
-              <description data-l10n-id="content-blocking-etp-standard-desc"></description>
-              <vbox class="content-blocking-extra-information">
-                <label class="content-blocking-extra-blocking-desc" data-l10n-id="content-blocking-etp-blocking-desc"/>
-                <vbox class="indent">
-                  <hbox class="extra-information-label social-media-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-social-media-trackers"/>
-                  </hbox>
-                  <hbox class="extra-information-label cross-site-cookies-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-cookies-in-all-windows"/>
-                  </hbox>
-                  <hbox class="extra-information-label third-party-tracking-cookies-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-tracking-cookies"/>
-                  </hbox>
-                  <hbox class="extra-information-label all-third-party-cookies-private-windows-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-all-cross-site-cookies-private-windows"/>
-                  </hbox>
-                  <hbox class="extra-information-label third-party-tracking-cookies-plus-isolate-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-tracking-cookies-plus-isolate"/>
-                  </hbox>
-                  <hbox class="extra-information-label pb-trackers-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-private-windows"/>
-                  </hbox>
-                  <hbox class="extra-information-label trackers-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-all-windows-tracking-content"/>
-                  </hbox>
-                  <hbox class="extra-information-label all-third-party-cookies-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-all-third-party-cookies"/>
-                  </hbox>
-                  <hbox class="extra-information-label all-cookies-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-all-cookies"/>
-                  </hbox>
-                  <hbox class="extra-information-label unvisited-cookies-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-unvisited-cookies"/>
-                  </hbox>
-                  <hbox class="extra-information-label cryptominers-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-cryptominers"/>
-                  </hbox>
-                  <hbox class="extra-information-label fingerprinters-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-fingerprinters"/>
-                  </hbox>
-                </vbox>
-                <html:div class="content-blocking-warning reload-tabs" hidden="true">
-                  <html:div class="content-blocking-reload-desc-container">
-                    <image class="content-blocking-info-image"/>
-                    <html:span data-l10n-id="content-blocking-reload-description"
-                               class="content-blocking-reload-description" />
+      <radiogroup id="contentBlockingCategoryRadio"
+                  preference="browser.contentblocking.category"
+                  aria-labelledby="trackingProtectionMenuDesc">
+        <vbox id="contentBlockingOptionStandard" class="content-blocking-category info-box-container">
+          <hbox>
+            <radio id="standardRadio"
+                   value="standard"
+                   data-l10n-id="enhanced-tracking-protection-setting-standard"
+                   flex="1"/>
+            <button id="standardArrow"
+                    is="highlightable-button"
+                    class="arrowhead"
+                    data-l10n-id="content-blocking-expand-section"
+                    aria-expanded="false"/>
+          </hbox>
+          <vbox class="indent">
+            <description data-l10n-id="content-blocking-etp-standard-desc"></description>
+            <vbox class="content-blocking-extra-information">
+              <label class="content-blocking-extra-blocking-desc" data-l10n-id="content-blocking-etp-blocking-desc"/>
+              <vbox class="indent">
+                <hbox class="extra-information-label social-media-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-social-media-trackers"/>
+                </hbox>
+                <hbox class="extra-information-label cross-site-cookies-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-cookies-in-all-windows"/>
+                </hbox>
+                <hbox class="extra-information-label third-party-tracking-cookies-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-tracking-cookies"/>
+                </hbox>
+                <hbox class="extra-information-label all-third-party-cookies-private-windows-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-all-cross-site-cookies-private-windows"/>
+                </hbox>
+                <hbox class="extra-information-label third-party-tracking-cookies-plus-isolate-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-tracking-cookies-plus-isolate"/>
+                </hbox>
+                <hbox class="extra-information-label pb-trackers-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-private-windows"/>
+                </hbox>
+                <hbox class="extra-information-label trackers-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-all-windows-tracking-content"/>
+                </hbox>
+                <hbox class="extra-information-label all-third-party-cookies-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-all-third-party-cookies"/>
+                </hbox>
+                <hbox class="extra-information-label all-cookies-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-all-cookies"/>
+                </hbox>
+                <hbox class="extra-information-label unvisited-cookies-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-unvisited-cookies"/>
+                </hbox>
+                <hbox class="extra-information-label cryptominers-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-cryptominers"/>
+                </hbox>
+                <hbox class="extra-information-label fingerprinters-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-fingerprinters"/>
+                </hbox>
+              </vbox>
+              <html:div class="content-blocking-warning info-box-container reload-tabs" hidden="true">
+                <html:div class="content-blocking-reload-desc-container">
+                  <html:div class="info-icon-container">
+                    <image class="info-icon"/>
                   </html:div>
-                  <button class="accessory-button reload-tabs-button primary"
-                          is="highlightable-button"
-                          data-l10n-id="content-blocking-reload-tabs-button"/>
+                  <html:span data-l10n-id="content-blocking-reload-description"
+                             class="content-blocking-reload-description" />
                 </html:div>
+                <button class="accessory-button reload-tabs-button primary"
+                        is="highlightable-button"
+                        data-l10n-id="content-blocking-reload-tabs-button"/>
+              </html:div>
+            </vbox>
+          </vbox>
+        </vbox>
+        <vbox id="contentBlockingOptionStrict" class="content-blocking-category info-box-container">
+          <hbox>
+            <radio id="strictRadio"
+                   value="strict"
+                   data-l10n-id="enhanced-tracking-protection-setting-strict"
+                   flex="1"/>
+            <button id="strictArrow"
+                    is="highlightable-button"
+                    class="arrowhead"
+                    data-l10n-id="content-blocking-expand-section"
+                    aria-expanded="false"/>
+          </hbox>
+          <vbox class="indent">
+            <label data-l10n-id="content-blocking-etp-strict-desc"></label>
+            <vbox class="content-blocking-extra-information">
+              <label class="content-blocking-extra-blocking-desc" data-l10n-id="content-blocking-etp-blocking-desc"/>
+              <vbox class="indent">
+                <hbox class="extra-information-label social-media-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-social-media-trackers"/>
+                </hbox>
+                <hbox class="extra-information-label third-party-tracking-cookies-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-tracking-cookies"/>
+                </hbox>
+                <hbox class="extra-information-label all-third-party-cookies-private-windows-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-all-cross-site-cookies-private-windows"/>
+                </hbox>
+                <hbox class="extra-information-label cross-site-cookies-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-cookies-in-all-windows"/>
+                </hbox>
+                <hbox class="extra-information-label pb-trackers-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-private-windows"/>
+                </hbox>
+                <hbox class="extra-information-label trackers-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-all-windows-tracking-content"/>
+                </hbox>
+                <hbox class="extra-information-label all-third-party-cookies-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-all-third-party-cookies"/>
+                </hbox>
+                <hbox class="extra-information-label all-cookies-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-all-cookies"/>
+                </hbox>
+                <hbox class="extra-information-label unvisited-cookies-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-unvisited-cookies"/>
+                </hbox>
+                <hbox class="extra-information-label third-party-tracking-cookies-plus-isolate-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-tracking-cookies-plus-isolate"/>
+                </hbox>
+                <hbox class="extra-information-label cryptominers-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-cryptominers"/>
+                </hbox>
+                <hbox class="extra-information-label fingerprinters-option" hidden="true">
+                  <label class="content-blocking-label" data-l10n-id="content-blocking-fingerprinters"/>
+                </hbox>
+              </vbox>
+              <html:div class="content-blocking-warning info-box-container reload-tabs" hidden="true">
+                <html:div class="content-blocking-reload-desc-container">
+                  <html:div class="info-icon-container">
+                    <image class="info-icon"/>
+                  </html:div>
+                  <html:span data-l10n-id="content-blocking-reload-description"
+                             class="content-blocking-reload-description" />
+                </html:div>
+                <button class="accessory-button reload-tabs-button primary"
+                        is="highlightable-button"
+                        data-l10n-id="content-blocking-reload-tabs-button"/>
+              </html:div>
+              <vbox class="content-blocking-warning info-box-container">
+                <hbox>
+                  <image class="content-blocking-warning-image"/>
+                  <label class="content-blocking-warning-title" data-l10n-id="content-blocking-warning-title"/>
+                </hbox>
+                <description class="indent">
+                  <html:span class="tail-with-learn-more content-blocking-warning-description" data-l10n-id="content-blocking-and-isolating-etp-warning-description"></html:span>
+                  <label id="" class="learnMore contentBlockWarningLink" data-l10n-id="content-blocking-warning-learn-how" is="text-link"/>
+                </description>
               </vbox>
             </vbox>
           </vbox>
-          <vbox id="contentBlockingOptionStrict" class="content-blocking-category">
-            <hbox>
-              <radio id="strictRadio"
-                     value="strict"
-                     data-l10n-id="enhanced-tracking-protection-setting-strict"
-                     flex="1"/>
-              <button id="strictArrow"
-                      is="highlightable-button"
-                      class="arrowhead"
-                      data-l10n-id="content-blocking-expand-section"
-                      aria-expanded="false"/>
-            </hbox>
-            <vbox class="indent">
-              <label data-l10n-id="content-blocking-etp-strict-desc"></label>
-              <vbox class="content-blocking-extra-information">
-                <label class="content-blocking-extra-blocking-desc" data-l10n-id="content-blocking-etp-blocking-desc"/>
-                <vbox class="indent">
-                  <hbox class="extra-information-label social-media-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-social-media-trackers"/>
-                  </hbox>
-                  <hbox class="extra-information-label third-party-tracking-cookies-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-tracking-cookies"/>
-                  </hbox>
-                  <hbox class="extra-information-label all-third-party-cookies-private-windows-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-all-cross-site-cookies-private-windows"/>
-                  </hbox>
-                  <hbox class="extra-information-label cross-site-cookies-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-cookies-in-all-windows"/>
-                  </hbox>
-                  <hbox class="extra-information-label pb-trackers-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-private-windows"/>
-                  </hbox>
-                  <hbox class="extra-information-label trackers-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-all-windows-tracking-content"/>
-                  </hbox>
-                  <hbox class="extra-information-label all-third-party-cookies-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-all-third-party-cookies"/>
-                  </hbox>
-                  <hbox class="extra-information-label all-cookies-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-all-cookies"/>
-                  </hbox>
-                  <hbox class="extra-information-label unvisited-cookies-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-unvisited-cookies"/>
-                  </hbox>
-                  <hbox class="extra-information-label third-party-tracking-cookies-plus-isolate-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-cross-site-tracking-cookies-plus-isolate"/>
-                  </hbox>
-                  <hbox class="extra-information-label cryptominers-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-cryptominers"/>
-                  </hbox>
-                  <hbox class="extra-information-label fingerprinters-option" hidden="true">
-                    <label class="content-blocking-label" data-l10n-id="content-blocking-fingerprinters"/>
-                  </hbox>
-                </vbox>
-                <html:div class="content-blocking-warning reload-tabs" hidden="true">
-                  <html:div class="content-blocking-reload-desc-container">
-                    <image class="content-blocking-info-image"/>
-                    <html:span data-l10n-id="content-blocking-reload-description"
-                               class="content-blocking-reload-description" />
-                  </html:div>
-                  <button class="accessory-button reload-tabs-button primary"
-                          is="highlightable-button"
-                          data-l10n-id="content-blocking-reload-tabs-button"/>
-                </html:div>
-                <vbox class="content-blocking-warning">
-                  <vbox class="indent">
-                    <hbox>
-                      <image class="content-blocking-warning-image"/>
-                      <label class="content-blocking-warning-title" data-l10n-id="content-blocking-warning-title"/>
-                    </hbox>
-                    <description class="indent">
-                      <html:span class="tail-with-learn-more content-blocking-warning-description" data-l10n-id="content-blocking-and-isolating-etp-warning-description"></html:span>
-                      <label id="" class="learnMore contentBlockWarningLink" data-l10n-id="content-blocking-warning-learn-how" is="text-link"/>
-                    </description>
-                  </vbox>
-                </vbox>
-              </vbox>
-            </vbox>
-          </vbox>
-        <vbox id="contentBlockingOptionCustom" class="tracking-protection-ui content-blocking-category">
+        </vbox>
+        <vbox id="contentBlockingOptionCustom" class="content-blocking-category info-box-container">
           <hbox>
             <radio id="customRadio"
                    value="custom"
                    data-l10n-id="enhanced-tracking-protection-setting-custom"
                    flex="1"/>
             <button id="customArrow"
                     is="highlightable-button"
                     class="arrowhead"
@@ -276,37 +280,37 @@
                 </hbox>
                 <hbox class="custom-option" id="contentBlockingFingerprintersOption">
                   <checkbox id="contentBlockingFingerprintersCheckbox"
                             class="content-blocking-checkbox" flex="1"
                             preference="privacy.trackingprotection.fingerprinting.enabled"
                             data-l10n-id="content-blocking-fingerprinters-label"
                             aria-describedby="contentBlockingCustomDesc"/>
                 </hbox>
-              <html:div class="content-blocking-warning reload-tabs" hidden="true">
+              <html:div class="content-blocking-warning info-box-container reload-tabs" hidden="true">
                 <html:div class="content-blocking-reload-desc-container">
-                  <image class="content-blocking-info-image"/>
+                  <html:div class="info-icon-container">
+                    <image class="info-icon"/>
+                  </html:div>
                   <html:span data-l10n-id="content-blocking-reload-description"
                              class="content-blocking-reload-description" />
                 </html:div>
                 <button class="accessory-button reload-tabs-button primary"
                         is="highlightable-button"
                         data-l10n-id="content-blocking-reload-tabs-button"/>
               </html:div>
-              <vbox class="content-blocking-warning">
-                <vbox class="indent">
-                  <hbox>
-                    <image class="content-blocking-warning-image"/>
-                    <label class="content-blocking-warning-title" data-l10n-id="content-blocking-warning-title"/>
-                  </hbox>
-                  <description class="indent">
-                    <html:span class="tail-with-learn-more content-blocking-warning-description" data-l10n-id="content-blocking-and-isolating-etp-warning-description"></html:span>
-                    <label id="" class="learnMore contentBlockWarningLink" data-l10n-id="content-blocking-warning-learn-how" is="text-link"/>
-                  </description>
-                </vbox>
+              <vbox class="content-blocking-warning info-box-container">
+                <hbox>
+                  <image class="content-blocking-warning-image"/>
+                  <label class="content-blocking-warning-title" data-l10n-id="content-blocking-warning-title"/>
+                </hbox>
+                <description class="indent">
+                  <html:span class="tail-with-learn-more content-blocking-warning-description" data-l10n-id="content-blocking-and-isolating-etp-warning-description"></html:span>
+                  <label id="" class="learnMore contentBlockWarningLink" data-l10n-id="content-blocking-warning-learn-how" is="text-link"/>
+                </description>
               </vbox>
             </vbox>
           </vbox>
         </vbox>
       </radiogroup>
     </vbox>
     <vbox id="doNotTrackLearnMoreBox">
       <label><label class="tail-with-learn-more" data-l10n-id="do-not-track-description" id="doNotTrackDesc"></label><label
@@ -326,17 +330,20 @@
 
   <hbox data-subcategory="sitedata" align="baseline">
     <vbox flex="1">
       <description class="description-with-side-element" flex="1">
         <html:span id="totalSiteDataSize" class="tail-with-learn-more"></html:span>
         <label id="siteDataLearnMoreLink"
           class="learnMore" is="text-link" data-l10n-id="sitedata-learn-more"/>
       </description>
-      <hbox flex="1" id="deleteOnCloseNote" class="info-panel">
+      <hbox flex="1" id="deleteOnCloseNote" class="info-box-container smaller-font-size">
+        <hbox class="info-icon-container">
+          <image class="info-icon"></image>
+        </hbox>
         <description flex="1" data-l10n-id="sitedata-delete-on-close-private-browsing" />
       </hbox>
       <hbox id="keepRow"
             align="center">
         <checkbox id="deleteOnClose"
                   data-l10n-id="sitedata-delete-on-close"
                   preference="network.cookie.lifetimePolicy"
                   flex="1" />
@@ -864,27 +871,26 @@
 
   <description>
     <label class="tail-with-learn-more" data-l10n-id="collection-description"/>
     <label id="dataCollectionPrivacyNotice"
            class="learnMore" is="text-link"
            data-l10n-id="collection-privacy-notice"/>
   </description>
   <description>
-    <hbox id="telemetry-container" align="stretch" flex="1" hidden="true">
-      <hbox align="top">
-        <image class="info-icon-telemetry" flex="1"></image>
+    <hbox id="telemetry-container" class="info-box-container smaller-font-size" hidden="true">
+      <hbox class="info-icon-container">
+        <image class="info-icon"></image>
       </hbox>
-      <hbox align="center" id="dataDescriptionBox" flex="1">
-        <html:span id="telemetryDisabledDescription" class="tail-with-learn-more" data-l10n-id="collection-health-report-telemetry-disabled"/>
-      </hbox>
-      <hbox>
-          <button id="telemetryDataDeletionLearnMore"
-                 class="learnMore" is="text-link"
-                 data-l10n-id="collection-health-report-telemetry-disabled-link"/>
+      <hbox align="center" flex="1">
+        <html:span id="telemetryDisabledDescription" class="tail-with-learn-more"
+                   data-l10n-id="collection-health-report-telemetry-disabled"/>
+        <label id="telemetryDataDeletionLearnMore"
+               class="learnMore text-link" is="text-link"
+               data-l10n-id="collection-health-report-telemetry-disabled-link"/>
       </hbox>
     </hbox>
   </description>
   <vbox data-subcategory="reports">
     <description flex="1">
       <checkbox id="submitHealthReportBox"
                 data-l10n-id="collection-health-report"
                 class="tail-with-learn-more"/>
--- a/browser/components/preferences/privacy.js
+++ b/browser/components/preferences/privacy.js
@@ -769,17 +769,17 @@ var gPrivacyPane = {
       this.initSubmitHealthReport();
       setEventListener(
         "submitHealthReportBox",
         "command",
         gPrivacyPane.updateSubmitHealthReport
       );
       setEventListener(
         "telemetryDataDeletionLearnMore",
-        "command",
+        "click",
         gPrivacyPane.showDataDeletion
       );
       if (AppConstants.MOZ_NORMANDY) {
         this.initOptOutStudyCheckbox();
       }
       this.initAddonRecommendationsCheckbox();
     }
 
--- a/browser/components/preferences/sync.inc.xhtml
+++ b/browser/components/preferences/sync.inc.xhtml
@@ -158,17 +158,17 @@
 
         <groupbox>
           <deck id="syncStatus" flex="1">
             <!-- sync not yet configured. -->
             <vbox id="syncNotConfigured">
               <label>
                 <html:h2 data-l10n-id="prefs-syncing-off"/>
               </label>
-              <hbox class="sync-group sync-not-configured">
+              <hbox class="sync-group info-box-container">
                 <vbox flex="1">
                   <label data-l10n-id="prefs-sync-offer-setup-label2"/>
                 </vbox>
                 <vbox>
                   <button id="syncSetup"
                           is="highlightable-button"
                           class="accessory-button needs-account-ready"
                           data-l10n-id="prefs-sync-turn-on-syncing"/>
@@ -180,17 +180,17 @@
               <hbox>
                 <html:h2 data-l10n-id="prefs-syncing-on"/>
                 <spacer flex="1"/>
                 <button id="syncNow"
                         class="accessory-button needs-account-ready"
                         data-l10n-id="prefs-sync-now"
                         data-l10n-attrs="labelnotsyncing, accesskeynotsyncing, labelsyncing"/>
               </hbox>
-              <vbox class="sync-group sync-configured">
+              <vbox class="sync-group info-box-container sync-configured">
                 <label data-l10n-id="sync-currently-syncing-heading"/>
                 <html:div class="sync-engines-list">
                   <html:div engine_preference="services.sync.engine.bookmarks">
                     <image class="sync-engine-image sync-engine-bookmarks"/>
                     <label data-l10n-id="sync-currently-syncing-bookmarks"/>
                   </html:div>
                   <html:div engine_preference="services.sync.engine.history">
                     <image class="sync-engine-image sync-engine-history"/>
--- a/browser/components/screenshots/content/screenshots.css
+++ b/browser/components/screenshots/content/screenshots.css
@@ -403,16 +403,21 @@ body {
 .left {
   margin-inline-start: 0;
 }
 
 .right {
   margin-inline-start: 20px;
 }
 
+#placeholder-image {
+  width: 100%;
+  height: 100%;
+}
+
 @keyframes pulse {
   0% {
     transform: scale(1);
   }
   50% {
     transform: scale(1.06);
   }
   100% {
--- a/browser/components/screenshots/content/screenshots.html
+++ b/browser/components/screenshots/content/screenshots.html
@@ -27,19 +27,18 @@
             <span data-l10n-id="screenshots-copy-button"/>
           </button>
           <button class="highlight-button-download" title="Download">
             <img src="chrome://browser/content/screenshots/download-white.svg"/>
             <span data-l10n-id="screenshots-download-button"/>
           </button>
         </div>
         <div class="preview-image">
-          <div class="preview-image-area">
-            <!-- This is a placeholder image. -->
-            <img id="placeholder-image" src="chrome://browser/content/static-robot.png"/>
+          <div id="preview-image-div" class="preview-image-area">
+            <img id="placeholder-image"/>
           </div>
         </div>
       </div>
     </template>
 
     <screenshots-ui></screenshots-ui>
   </body>
 </html>
--- a/browser/components/screenshots/content/screenshots.js
+++ b/browser/components/screenshots/content/screenshots.js
@@ -14,18 +14,20 @@ XPCOMUtils.defineLazyModuleGetters(this,
   Downloads: "resource://gre/modules/Downloads.jsm",
   FileUtils: "resource://gre/modules/FileUtils.jsm",
 });
 
 class ScreenshotsUI extends HTMLElement {
   constructor() {
     super();
   }
-  connectedCallback() {
+  async connectedCallback() {
     this.initialize();
+
+    await this.takeScreenshot();
   }
 
   initialize() {
     if (this._initialized) {
       return;
     }
     this._initialized = true;
     let template = this.ownerDocument.getElementById(
@@ -173,10 +175,38 @@ class ScreenshotsUI extends HTMLElement 
         0,
         clipFilename.length - excedingchars
       );
       clipFilename = clipFilename + "[...]";
     }
     let extension = ".png";
     return clipFilename + extension;
   }
+
+  async takeScreenshot() {
+    let params = new URLSearchParams(location.search);
+    let browsingContextId = parseInt(params.get("browsingContextId"), 10);
+    let browsingContext = BrowsingContext.get(browsingContextId);
+
+    let snapshot = await browsingContext.currentWindowGlobal.drawSnapshot(
+      null,
+      1,
+      "rgb(255,255,255)"
+    );
+
+    let canvas = this.ownerDocument.createElementNS(
+      "http://www.w3.org/1999/xhtml",
+      "html:canvas"
+    );
+    let context = canvas.getContext("2d");
+
+    canvas.width = snapshot.width;
+    canvas.height = snapshot.height;
+
+    context.drawImage(snapshot, 0, 0);
+
+    let imgEle = this.ownerDocument.getElementById("placeholder-image");
+    imgEle.src = canvas.toDataURL();
+
+    snapshot.close();
+  }
 }
 customElements.define("screenshots-ui", ScreenshotsUI);
--- a/browser/installer/windows/docs/MSIX.rst
+++ b/browser/installer/windows/docs/MSIX.rst
@@ -62,17 +62,17 @@ early enough to impact loading the signe
 1721764 <https://bugzilla.mozilla.org/show_bug.cgi?id=1721764>`__), and
 once the signed langpacks fail to load once, they will not be reloaded
 (see `Bug
 1721763 <https://bugzilla.mozilla.org/show_bug.cgi?id=1721763>`__). This
 make testing the first-run experience challenging. What can be done is
 to install the MSIX package (perhaps using
 ``Add-AppxPackage -Path ...``) and determine the profile directory
 (using ``about:support``). Uninstall the MSIX package (perhaps using
-``Get-AppxPackage | Where -Property Name -like "Mozilla.Firefox.*" | Remove-AppxPackage``).
+``Get-AppxPackage | Where -Property Name -like "Mozilla.*" | Remove-AppxPackage``).
 Delete the contents of the profile directory entirely, but add a file
 ``user.js`` containing:
 
 ::
 
     user_pref("xpinstall.signatures.dev-root", true);
     user_pref("extensions.logging.enabled", true);
 
--- a/browser/installer/windows/msix/AppxManifest.xml.in
+++ b/browser/installer/windows/msix/AppxManifest.xml.in
@@ -2,25 +2,25 @@
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
 - License, v. 2.0. If a copy of the MPL was not distributed with this file,
 - You can obtain one at http://mozilla.org/MPL/2.0/. -->
 <!-- #filter substitution -->
 <Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:com="http://schemas.microsoft.com/appx/manifest/com/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap2="http://schemas.microsoft.com/appx/manifest/uap/windows10/2" xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap uap2 uap3 uap10 rescap">
   <Identity Name="@APPX_IDENTITY@" Publisher="@APPX_PUBLISHER@" Version="@APPX_VERSION@" ProcessorArchitecture="@APPX_ARCH@" />
   <Properties>
     <DisplayName>@APPX_DISPLAYNAME@</DisplayName>
-    <PublisherDisplayName>@MOZ_APP_VENDOR@</PublisherDisplayName>
+    <PublisherDisplayName>@APPX_PUBLISHER_DISPLAY_NAME@</PublisherDisplayName>
     <Description>@APPX_DESCRIPTION@</Description>
     <Logo>Assets\StoreLogo.png</Logo>
     <uap10:PackageIntegrity>
       <uap10:Content Enforcement="on" />
     </uap10:PackageIntegrity>
   </Properties>
   <Resources>
-    <Resource Language="en-us" />
+@APPX_RESOURCE_LANGUAGE_LIST@
   </Resources>
   <Dependencies>
     <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.1" />
   </Dependencies>
   <Capabilities>
     <rescap:Capability Name="runFullTrust" />
   </Capabilities>
   <Applications>
new file mode 100644
--- /dev/null
+++ b/browser/installer/windows/msix/msix-all-locales
@@ -0,0 +1,361 @@
+# Locale codes supported by Microsoft Windows and MSIX packages.
+#
+# From https://docs.microsoft.com/en-us/windows/uwp/publish/supported-languages.
+# Fetched on September 15, 2021.
+#
+# The following codes are listed as supported but for reasons unknown, Windows won't install
+# packages advertising them:
+#
+# sr* (Serbian)
+# uz* (Uzbek)
+
+af
+af-za
+am
+am-et
+ar
+ar-ae
+ar-bh
+ar-dz
+ar-eg
+ar-iq
+ar-jo
+ar-kw
+ar-lb
+ar-ly
+ar-ma
+ar-om
+ar-qa
+ar-sa
+ar-sy
+ar-tn
+ar-ye
+as
+as-in
+az-arab
+az-arab-az
+az-cyrl
+az-cyrl-az
+az-latn
+az-latn-az
+be
+be-by
+bg
+bg-bg
+bn
+bn-bd
+bn-in
+bs
+bs-cyrl
+bs-cyrl-ba
+bs-latn
+bs-latn-ba
+ca
+ca-es
+ca-es-valencia
+chr-cher
+chr-cher-us
+chr-latn
+cs
+cs-cz
+cy
+cy-gb
+da
+da-dk
+de
+de-at
+de-ch
+de-de
+de-li
+de-lu
+el
+el-gr
+en
+en-011
+en-014
+en-018
+en-021
+en-029
+en-053
+en-au
+en-bz
+en-ca
+en-gb
+en-hk
+en-id
+en-ie
+en-in
+en-jm
+en-kz
+en-mt
+en-my
+en-nz
+en-ph
+en-pk
+en-sg
+en-tt
+en-us
+en-vn
+en-za
+en-zw
+es
+es-019
+es-419
+es-ar
+es-bo
+es-cl
+es-co
+es-cr
+es-do
+es-ec
+es-es
+es-gt
+es-hn
+es-mx
+es-ni
+es-pa
+es-pe
+es-pr
+es-py
+es-sv
+es-us
+es-uy
+es-ve
+et
+et-ee
+eu
+eu-es
+fa
+fa-ir
+fi
+fi-fi
+fil
+fil-latn
+fil-ph
+fr
+fr-011
+fr-015
+fr-021
+fr-029
+fr-155
+fr-be
+fr-ca
+fr-cd
+fr-ch
+fr-ci
+fr-cm
+fr-fr
+fr-ht
+fr-lu
+fr-ma
+fr-mc
+fr-ml
+fr-re
+frc-latn
+frp-latn
+ga
+ga-ie
+gd-gb
+gd-latn
+gl
+gl-es
+gu
+gu-in
+ha
+ha-latn
+ha-latn-ng
+he
+he-il
+hi
+hi-in
+hr
+hr-ba
+hr-hr
+hu
+hu-hu
+hy
+hy-am
+id
+id-id
+ig-latn
+ig-ng
+is
+is-is
+it
+it-ch
+it-it
+iu-cans
+iu-latn
+iu-latn-ca
+ja
+ja-jp
+ka
+ka-ge
+kk
+kk-kz
+km
+km-kh
+kn
+kn-in
+ko
+ko-kr
+kok
+kok-in
+ku-arab
+ku-arab-iq
+ky-cyrl
+ky-kg
+lb
+lb-lu
+lo
+lo-la
+lt
+lt-lt
+lv
+lv-lv
+mi
+mi-latn
+mi-nz
+mk
+mk-mk
+ml
+ml-in
+mn-cyrl
+mn-mn
+mn-mong
+mn-phag
+mr
+mr-in
+ms
+ms-bn
+ms-my
+mt
+mt-mt
+nb
+nb-no
+ne
+ne-np
+nl
+nl-be
+nl-nl
+nn
+nn-no
+no
+no-no
+nso
+nso-za
+or
+or-in
+pa
+pa-arab
+pa-arab-pk
+pa-deva
+pa-in
+pl
+pl-pl
+prs
+prs-af
+prs-arab
+pt
+pt-br
+pt-pt
+quc-latn
+qut-gt
+qut-latn
+quz
+quz-bo
+quz-ec
+quz-pe
+ro
+ro-ro
+ru
+ru-ru
+rw
+rw-rw
+sd-arab
+sd-arab-pk
+sd-deva
+si
+si-lk
+sk
+sk-sk
+sl
+sl-si
+sq
+sq-al
+# sr # For reasons unknown, Windows won't install packages advertising these locales.
+# sr-Latn
+# sr-cyrl
+# sr-cyrl-ba
+# sr-cyrl-cs
+# sr-cyrl-me
+# sr-cyrl-rs
+# sr-latn-ba
+# sr-latn-cs
+# sr-latn-me
+# sr-latn-rs
+sv
+sv-fi
+sv-se
+sw
+sw-ke
+ta
+ta-in
+te
+te-in
+tg-arab
+tg-cyrl
+tg-cyrl-tj
+tg-latn
+th
+th-th
+ti
+ti-et
+tk-cyrl
+tk-cyrl-tr
+tk-latn
+tk-latn-tr
+tk-tm
+tn
+tn-bw
+tn-za
+tr
+tr-tr
+tt-arab
+tt-cyrl
+tt-latn
+tt-ru
+ug-arab
+ug-cn
+ug-cyrl
+ug-latn
+uk
+uk-ua
+ur
+ur-pk
+# uz # For reasons unknown, Windows won't install packages advertising these locales.
+# uz-cyrl
+# uz-latn
+# uz-latn-uz
+vi
+vi-vn
+wo
+wo-sn
+xh
+xh-za
+yo-latn
+yo-ng
+zh-Hans
+zh-Hant
+zh-cn
+zh-hans-cn
+zh-hans-sg
+zh-hant-hk
+zh-hant-mo
+zh-hant-tw
+zh-hk
+zh-mo
+zh-sg
+zh-tw
+zu
+zu-za
--- a/browser/locales/en-US/chrome/browser/browser.properties
+++ b/browser/locales/en-US/chrome/browser/browser.properties
@@ -982,17 +982,16 @@ storageAccess1.DontAllow.accesskey = B
 storageAccess4.message = Allow %1$S to use its cookies on %2$S?
 storageAccess1.hintText = You may want to block access if it’s not clear why %1$S needs this data.
 
 
 
 confirmationHint.sendToDevice.label = Sent!
 confirmationHint.copyURL.label = Copied to clipboard!
 confirmationHint.pageBookmarked2.label = Saved to bookmarks
-confirmationHint.addSearchEngine.label = Search engine added!
 confirmationHint.pinTab.label = Pinned!
 confirmationHint.pinTab.description = Right-click the tab to unpin it.
 confirmationHint.passwordSaved.label = Password saved!
 confirmationHint.loginRemoved.label = Login removed!
 confirmationHint.breakageReport.label = Report sent. Thank you!
 
 # LOCALIZATION NOTE (gnomeSearchProviderSearch):
 # Used for search by Gnome Shell activity screen, %S is a searched string.
--- a/browser/modules/AppUpdater.jsm
+++ b/browser/modules/AppUpdater.jsm
@@ -226,17 +226,17 @@ class AppUpdater {
    * to make it clear which are used by each interface.
    */
   get _updateCheckListener() {
     if (!this.__updateCheckListener) {
       this.__updateCheckListener = {
         /**
          * See nsIUpdateService.idl
          */
-        onCheckComplete: (aRequest, aUpdates) => {
+        onCheckComplete: async (aRequest, aUpdates) => {
           this.update = this.aus.selectUpdate(aUpdates);
           if (!this.update) {
             this._setStatus(AppUpdater.STATUS.NO_UPDATES_FOUND);
             return;
           }
 
           if (this.update.unsupported) {
             this._setStatus(AppUpdater.STATUS.UNSUPPORTED_SYSTEM);
@@ -260,17 +260,17 @@ class AppUpdater {
               this._setStatus(AppUpdater.STATUS.DOWNLOAD_AND_INSTALL);
             }
           });
         },
 
         /**
          * See nsIUpdateService.idl
          */
-        onError: (aRequest, aUpdate) => {
+        onError: async (aRequest, aUpdate) => {
           // Errors in the update check are treated as no updates found. If the
           // update check fails repeatedly without a success the user will be
           // notified with the normal app update user interface so this is safe.
           this._setStatus(AppUpdater.STATUS.NO_UPDATES_FOUND);
         },
 
         /**
          * See nsISupports.idl
--- a/browser/themes/addons/alpenglow/manifest.json
+++ b/browser/themes/addons/alpenglow/manifest.json
@@ -22,17 +22,18 @@
     },
 
     "properties": {
       "additional_backgrounds_alignment": [
         "right top",
         "left top",
         "right top"
       ],
-      "additional_backgrounds_tiling": ["no-repeat", "no-repeat", "repeat-x"]
+      "additional_backgrounds_tiling": ["no-repeat", "no-repeat", "repeat-x"],
+      "zap_gradient": "linear-gradient(90deg, #9059FF 0%, #FF4AA2 52.08%, #FFBD4F 100%)"
     },
     "colors": {
       "frame": "hsla(240, 20%, 98%, 1)",
       "toolbar": "hsla(0, 0%, 100%, .76)",
       "button_background_active": "hsla(240, 26%, 11%, .16)",
       "button_background_hover": "hsla(240, 26%, 11%, .08)",
       "icons": "hsla(258, 66%, 48%, 1)",
       "icons_attention": "hsla(180, 100%, 32%, 1)",
@@ -78,17 +79,18 @@
     },
 
     "properties": {
       "additional_backgrounds_alignment": [
         "right top",
         "left top",
         "right top"
       ],
-      "additional_backgrounds_tiling": ["no-repeat", "no-repeat", "repeat-x"]
+      "additional_backgrounds_tiling": ["no-repeat", "no-repeat", "repeat-x"],
+      "zap_gradient": "linear-gradient(90deg, #9059FF 0%, #FF4AA2 52.08%, #FFBD4F 100%)"
     },
     "colors": {
       "frame": "hsla(240, 20%, 98%, 1)",
       "toolbar": "hsla(254, 46%, 21%, .96)",
       "button_background_active": "hsla(255, 100%, 94%, .24)",
       "button_background_hover": "hsla(255, 100%, 94%, .12)",
       "icons": "hsla(271, 100%, 77%, 1)",
       "icons_attention": "hsla(157, 100%, 66%, 1)",
@@ -124,11 +126,14 @@
       "sidebar_highlight_text": "hsla(0, 0%, 100%, 1)",
       "focus_outline": "hsla(265, 100%, 72%, 1)"
     }
   },
 
   "theme_experiment": {
     "colors": {
       "focus_outline": "--focus-outline-color"
+    },
+    "properties": {
+      "zap_gradient": "--panel-separator-zap-gradient"
     }
   }
 }
rename from toolkit/mozapps/extensions/content/firefox-alpenglow.svg
rename to browser/themes/addons/alpenglow/preview.svg
--- a/browser/themes/addons/dark/manifest.json
+++ b/browser/themes/addons/dark/manifest.json
@@ -59,17 +59,18 @@
       "warning_icon_color": "#FFBD4F",
       "tab_icon_overlay_stroke": "rgb(66,65,77)",
       "tab_icon_overlay_fill": "rgb(251,251,254)"
     },
     "properties": {
       "panel_hover": "color-mix(in srgb, currentColor 9%, transparent)",
       "panel_active": "color-mix(in srgb, currentColor 14%, transparent)",
       "panel_active_darker": "color-mix(in srgb, currentColor 25%, transparent)",
-      "toolbar_field_icon_opacity": "1"
+      "toolbar_field_icon_opacity": "1",
+      "zap_gradient": "linear-gradient(90deg, #9059FF 0%, #FF4AA2 52.08%, #FFBD4F 100%)"
     }
   },
 
   "theme_experiment": {
     "stylesheet": "experiment.css",
     "colors": {
       "button": "--button-bgcolor",
       "button_hover": "--button-hover-bgcolor",
@@ -90,12 +91,13 @@
       "warning_icon_color": "--warning-icon-bgcolor",
       "tab_icon_overlay_stroke": "--tab-icon-overlay-stroke",
       "tab_icon_overlay_fill": "--tab-icon-overlay-fill"
     },
     "properties": {
       "panel_hover": "--arrowpanel-dimmed",
       "panel_active": "--arrowpanel-dimmed-further",
       "panel_active_darker": "--arrowpanel-dimmed-even-further",
-      "toolbar_field_icon_opacity": "--urlbar-icon-fill-opacity"
+      "toolbar_field_icon_opacity": "--urlbar-icon-fill-opacity",
+      "zap_gradient": "--panel-separator-zap-gradient"
     }
   }
 }
rename from toolkit/mozapps/extensions/content/firefox-compact-dark.svg
rename to browser/themes/addons/dark/preview.svg
--- a/browser/themes/addons/jar.mn
+++ b/browser/themes/addons/jar.mn
@@ -11,10 +11,44 @@ browser.jar:
   content/builtin-themes/dark                      (dark/*.svg)
   content/builtin-themes/dark                      (dark/*.css)
   content/builtin-themes/dark/manifest.json        (dark/manifest.json)
 
   content/builtin-themes/light                     (light/*.svg)
   content/builtin-themes/light                     (light/*.css)
   content/builtin-themes/light/manifest.json       (light/manifest.json)
 
-  content/builtin-themes/monochromatic-purple                    (monochromatic-purple/*.svg)
-  content/builtin-themes/monochromatic-purple/manifest.json      (monochromatic-purple/manifest.json)
+  content/builtin-themes/monochromatic/lush/soft                          (monochromatic/lush/soft/*.svg)
+  content/builtin-themes/monochromatic/lush/soft/manifest.json            (monochromatic/lush/soft/manifest.json)
+  content/builtin-themes/monochromatic/lush/balanced                      (monochromatic/lush/balanced/*.svg)
+  content/builtin-themes/monochromatic/lush/balanced/manifest.json        (monochromatic/lush/balanced/manifest.json)
+  content/builtin-themes/monochromatic/lush/bold                          (monochromatic/lush/bold/*.svg)
+  content/builtin-themes/monochromatic/lush/bold/manifest.json            (monochromatic/lush/bold/manifest.json)
+  content/builtin-themes/monochromatic/abstract/soft                      (monochromatic/abstract/soft/*.svg)
+  content/builtin-themes/monochromatic/abstract/soft/manifest.json        (monochromatic/abstract/soft/manifest.json)
+  content/builtin-themes/monochromatic/abstract/balanced                  (monochromatic/abstract/balanced/*.svg)
+  content/builtin-themes/monochromatic/abstract/balanced/manifest.json    (monochromatic/abstract/balanced/manifest.json)
+  content/builtin-themes/monochromatic/abstract/bold                      (monochromatic/abstract/bold/*.svg)
+  content/builtin-themes/monochromatic/abstract/bold/manifest.json        (monochromatic/abstract/bold/manifest.json)
+  content/builtin-themes/monochromatic/elemental/soft                     (monochromatic/elemental/soft/*.svg)
+  content/builtin-themes/monochromatic/elemental/soft/manifest.json       (monochromatic/elemental/soft/manifest.json)
+  content/builtin-themes/monochromatic/elemental/balanced                 (monochromatic/elemental/balanced/*.svg)
+  content/builtin-themes/monochromatic/elemental/balanced/manifest.json   (monochromatic/elemental/balanced/manifest.json)
+  content/builtin-themes/monochromatic/elemental/bold                     (monochromatic/elemental/bold/*.svg)
+  content/builtin-themes/monochromatic/elemental/bold/manifest.json       (monochromatic/elemental/bold/manifest.json)
+  content/builtin-themes/monochromatic/cheers/soft                        (monochromatic/cheers/soft/*.svg)
+  content/builtin-themes/monochromatic/cheers/soft/manifest.json          (monochromatic/cheers/soft/manifest.json)
+  content/builtin-themes/monochromatic/cheers/balanced                    (monochromatic/cheers/balanced/*.svg)
+  content/builtin-themes/monochromatic/cheers/balanced/manifest.json      (monochromatic/cheers/balanced/manifest.json)
+  content/builtin-themes/monochromatic/cheers/bold                        (monochromatic/cheers/bold/*.svg)
+  content/builtin-themes/monochromatic/cheers/bold/manifest.json          (monochromatic/cheers/bold/manifest.json)
+  content/builtin-themes/monochromatic/graffiti/soft                      (monochromatic/graffiti/soft/*.svg)
+  content/builtin-themes/monochromatic/graffiti/soft/manifest.json        (monochromatic/graffiti/soft/manifest.json)
+  content/builtin-themes/monochromatic/graffiti/balanced                  (monochromatic/graffiti/balanced/*.svg)
+  content/builtin-themes/monochromatic/graffiti/balanced/manifest.json    (monochromatic/graffiti/balanced/manifest.json)
+  content/builtin-themes/monochromatic/graffiti/bold                      (monochromatic/graffiti/bold/*.svg)
+  content/builtin-themes/monochromatic/graffiti/bold/manifest.json        (monochromatic/graffiti/bold/manifest.json)
+  content/builtin-themes/monochromatic/foto/soft                          (monochromatic/foto/soft/*.svg)
+  content/builtin-themes/monochromatic/foto/soft/manifest.json            (monochromatic/foto/soft/manifest.json)
+  content/builtin-themes/monochromatic/foto/balanced                      (monochromatic/foto/balanced/*.svg)
+  content/builtin-themes/monochromatic/foto/balanced/manifest.json        (monochromatic/foto/balanced/manifest.json)
+  content/builtin-themes/monochromatic/foto/bold                          (monochromatic/foto/bold/*.svg)
+  content/builtin-themes/monochromatic/foto/bold/manifest.json            (monochromatic/foto/bold/manifest.json)
--- a/browser/themes/addons/light/manifest.json
+++ b/browser/themes/addons/light/manifest.json
@@ -57,17 +57,18 @@
       "tab_icon_overlay_stroke": "rgb(255,255,255)",
       "tab_icon_overlay_fill": "rgb(91,91,102)"
     },
     "properties": {
       "panel_hover": "color-mix(in srgb, currentColor 12%, transparent)",
       "panel_active": "color-mix(in srgb, currentColor 20%, transparent)",
       "panel_active_darker": "color-mix(in srgb, currentColor 27%, transparent)",
       "toolbar_field_icon_opacity": "0.72",
-      "input_border_color": "color-mix(in srgb, currentColor 41%, transparent)"
+      "input_border_color": "color-mix(in srgb, currentColor 41%, transparent)",
+      "zap_gradient": "linear-gradient(90deg, #9059FF 0%, #FF4AA2 52.08%, #FFBD4F 100%)"
     }
   },
 
   "theme_experiment": {
     "stylesheet": "experiment.css",
     "colors": {
       "popup_action_color": "--urlbar-popup-action-color",
       "button": "--button-bgcolor",
@@ -90,12 +91,13 @@
       "tab_icon_overlay_stroke": "--tab-icon-overlay-stroke",
       "tab_icon_overlay_fill": "--tab-icon-overlay-fill"
     },
     "properties": {
       "panel_hover": "--arrowpanel-dimmed",
       "panel_active": "-arrowpanel-dimmed-further",
       "panel_active_darker": "--arrowpanel-dimmed-even-further",
       "toolbar_field_icon_opacity": "--urlbar-icon-fill-opacity",
-      "input_border_color": "--input-border-color"
+      "input_border_color": "--input-border-color",
+      "zap_gradient": "--panel-separator-zap-gradient"
     }
   }
 }
rename from toolkit/mozapps/extensions/content/firefox-compact-light.svg
rename to browser/themes/addons/light/preview.svg
deleted file mode 100644
--- a/browser/themes/addons/monochromatic-purple/icon.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
-  <path d="M53.8717 54C66.0976 41.5959 66.0425 21.6295 53.7065 9.29348C41.3705 -3.04253 21.4041 -3.09758 9 9.12833L53.8717 54Z" fill="rgb(150,43,185)"/>
-  <path d="M9.12833 9C-3.09758 21.4041 -3.04253 41.3705 9.29348 53.7065C21.6295 66.0425 41.5959 66.0976 54 53.8717L9.12833 9Z" fill="rgb(247,227,255)"/>
-</svg>
deleted file mode 100644
--- a/browser/themes/addons/monochromatic-purple/manifest.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "manifest_version": 2,
-
-  "applications": {
-    "gecko": {
-      "id": "firefox-monochromatic-purple@mozilla.org"
-    }
-  },
-
-  "name": "Firefox Monochromatic - Purple",
-  "description": "Use a purple appearance for buttons, menus, and windows.",
-  "author": "Mozilla",
-  "version": "1.0",
-
-  "icons": { "32": "icon.svg" },
-
-  "theme": {
-    "colors": {
-      "toolbar": "color-mix(in srgb, rgb(247,227,255) 60%, white)",
-      "frame": "rgb(247,227,255)",
-      "toolbar_text": "color-mix(in srgb, rgb(247,227,255) 15%, black)",
-      "toolbar_field": "rgb(247,227,255)",
-      "toolbar_field_focus": "color-mix(in srgb, rgb(247,227,255) 60%, white)",
-      "toolbar_field_text": "color-mix(in srgb, rgb(247,227,255) 15%, black)",
-      "toolbar_field_highlight": "color-mix(in srgb, rgb(247,227,255) 5%, white)",
-      "toolbar_bottom_separator": "rgb(247,227,255)",
-      "tab_background_text": "color-mix(in srgb, rgb(247,227,255) 15%, black)",
-      "tab_line": "color-mix(in srgb, rgb(247,227,255) 15%, white)",
-      "ntp_background": "color-mix(in srgb, rgb(247,227,255) 40%, white)",
-      "ntp_card_background": "rgb(247,227,255)",
-      "ntp_text": "color-mix(in srgb, rgb(247,227,255) 15%, black)",
-      "popup": "color-mix(in srgb, rgb(247,227,255) 60%, white)",
-      "popup_text": "color-mix(in srgb, rgb(247,227,255) 15%, black)",
-      "popup_border": "color-mix(in srgb, rgb(247,227,255) 60%, white)",
-      "popup_highlight": "color-mix(in srgb, rgb(247,227,255) 25%, white)",
-      "popup_highlight_text": "color-mix(in srgb, rgb(247,227,255) 15%, black)",
-      "sidebar": "color-mix(in srgb, rgb(247,227,255) 80%, white)",
-      "sidebar_text": "color-mix(in srgb, rgb(247,227,255) 15%, black)",
-      "sidebar_highlight": "color-mix(in srgb, rgb(247,227,255) 60%, white)",
-      "focus_outline": "color-mix(in srgb, rgb(247,227,255) 65%, black)"
-    }
-  },
-
-  "dark_theme": {
-    "colors": {
-      "toolbar": "color-mix(in srgb, rgb(150,43,185) 85%, white)",
-      "frame": "rgb(150,43,185)",
-      "toolbar_text": "color-mix(in srgb, rgb(150,43,185) 10%, white)",
-      "toolbar_field": "rgb(150,43,185)",
-      "toolbar_field_focus": "color-mix(in srgb, rgb(150,43,185) 85%, white)",
-      "toolbar_field_text": "color-mix(in srgb, rgb(150,43,185) 10%, white)",
-      "toolbar_field_highlight": "color-mix(in srgb, rgb(150,43,185) 60%, white)",
-      "toolbar_bottom_separator": "rgb(150,43,185)",
-      "tab_background_text": "color-mix(in srgb, rgb(150,43,185) 10%, white)",
-      "tab_line": "color-mix(in srgb, rgb(150,43,185) 30%, white)",
-      "ntp_background": "color-mix(in srgb, rgb(150,43,185) 75%, white)",
-      "ntp_card_background": "rgb(150,43,185)",
-      "ntp_text": "color-mix(in srgb, rgb(150,43,185) 10%, white)",
-      "popup": "color-mix(in srgb, rgb(150,43,185) 85%, white)",
-      "popup_text": "color-mix(in srgb, rgb(150,43,185) 10%, white)",
-      "popup_border": "color-mix(in srgb, rgb(150,43,185) 60%, white)",
-      "popup_highlight": "color-mix(in srgb, rgb(150,43,185) 95%, white)",
-      "sidebar": "color-mix(in srgb, rgb(150,43,185) 80%, white)",
-      "sidebar_text": "color-mix(in srgb, rgb(150,43,185) 10%, white)",
-      "sidebar_highlight": "color-mix(in srgb, rgb(150,43,185) 60%, white)",
-      "focus_outline": "color-mix(in srgb, rgb(150,43,185) 30%, white)"
-    }
-  },
-
-  "theme_experiment": {
-    "colors": {
-      "focus_outline": "--focus-outline-color"
-    }
-  }
-}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/abstract/balanced/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(15, 62%, 34%)"/>
+      <stop offset="1" stop-color="hsl(15, 62%, 40%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/abstract/balanced/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-abstract-balanced@mozilla.org"
+    }
+  },
+  "name": "Abstract – Balanced",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 100%)",
+      "tab_text": "hsl(0, 0%, 0%)",
+      "tab_selected": "hsl(16, 73%, 97%)",
+      "tab_line": "transparent",
+      "frame": "hsl(15, 62%, 34%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(0, 0%, 0%)",
+      "popup_border": "hsl(15, 74%, 63%)",
+      "popup_highlight": "hsla(15, 84%, 65%, 0.3)",
+      "popup_highlight_text": "hsl(0, 0%, 0%)",
+      "toolbar": "hsl(15, 62%, 40%)",
+      "toolbar_text": "hsl(0, 0%, 100%)",
+      "toolbar_field": "hsl(16, 73%, 97%)",
+      "toolbar_field_text": "hsl(0, 0%, 0%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(15, 74%, 63%)",
+      "ntp_background": "hsl(15, 39%, 80%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(0, 0%, 0%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(0, 0%, 0%)",
+      "sidebar_highlight": "hsla(15, 84%, 65%, 0.3)",
+      "address_bar_box": "hsl(15, 62%, 34%)",
+      "address_bar_box_focus": "hsl(15, 62%, 40%)",
+      "address_bar_url_color": "hsl(15, 62%, 40%)",
+      "panel_item_hover": "hsla(15, 84%, 65%, 0.3)",
+      "panel_item_active": "hsla(15, 84%, 65%, 0.45)",
+      "panel_separator": "hsl(15, 74%, 63%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/abstract/balanced/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(15, 62%, 34%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(16, 73%, 97%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect y="44" width="680" height="48" fill="hsl(15, 62%, 40%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(16, 73%, 97%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/abstract/bold/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(15, 10%, 16%)"/>
+      <stop offset="1" stop-color="hsl(18, 10%, 25%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/abstract/bold/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-abstract-bold@mozilla.org"
+    }
+  },
+  "name": "Abstract – Bold",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(17, 89%, 86%)",
+      "tab_text": "hsl(17, 89%, 86%)",
+      "tab_selected": "hsl(12, 5%, 21%)",
+      "tab_line": "hsl(16, 100%, 86%)",
+      "frame": "hsl(15, 10%, 16%)",
+      "popup": "hsl(12, 5%, 21%)",
+      "popup_text": "hsl(17, 89%, 86%)",
+      "popup_border": "hsl(16, 100%, 86%)",
+      "popup_highlight": "hsla(16, 100%, 86%, 0.2)",
+      "popup_highlight_text": "hsl(17, 89%, 86%)",
+      "toolbar": "hsl(18, 10%, 25%)",
+      "toolbar_text": "hsl(17, 89%, 86%)",
+      "toolbar_field": "hsl(15, 10%, 16%)",
+      "toolbar_field_text": "hsl(17, 89%, 86%)",
+      "toolbar_field_focus": "hsl(12, 5%, 21%)",
+      "toolbar_field_border_focus": "hsl(16, 100%, 86%)",
+      "ntp_background": "hsl(20, 9%, 13%)",
+      "ntp_card_background": "hsl(12, 5%, 21%)",
+      "ntp_text": "hsl(17, 89%, 86%)",
+      "sidebar": "hsl(12, 5%, 21%)",
+      "sidebar_text": "hsl(17, 89%, 86%)",
+      "sidebar_highlight": "hsla(16, 100%, 86%, 0.2)",
+      "address_bar_box": "hsl(12, 5%, 21%)",
+      "address_bar_box_focus": "hsl(18, 10%, 25%)",
+      "address_bar_url_color": "hsl(17, 89%, 82%)",
+      "panel_item_hover": "hsla(16, 100%, 86%, 0.2)",
+      "panel_item_active": "hsla(16, 100%, 86%, 0.35)",
+      "panel_separator": "hsl(16, 100%, 86%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/abstract/bold/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(15, 10%, 16%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(12, 5%, 21%)" stroke="hsl(16, 100%, 86%)" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(17, 89%, 86%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(17, 89%, 86%)" />
+  <rect y="44" width="680" height="48" fill="hsl(18, 10%, 25%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(17, 89%, 86%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(17, 89%, 86%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(17, 89%, 86%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(17, 89%, 86%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(17, 89%, 86%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(15, 10%, 16%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(17, 89%, 86%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(17, 89%, 86%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/abstract/soft/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(16, 100%, 75%)"/>
+      <stop offset="1" stop-color="hsl(16, 100%, 82%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/abstract/soft/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-abstract-soft@mozilla.org"
+    }
+  },
+  "name": "Abstract – Soft",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(30, 5%, 8%)",
+      "tab_text": "hsl(30, 5%, 8%)",
+      "tab_selected": "hsl(0, 0%, 100%)",
+      "tab_line": "transparent",
+      "frame": "hsl(16, 100%, 75%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(30, 5%, 8%)",
+      "popup_border": "hsl(15, 71%, 80%)",
+      "popup_highlight": "hsla(15, 90%, 50%, 0.2)",
+      "popup_highlight_text": "hsl(30, 5%, 8%)",
+      "toolbar": "hsl(16, 100%, 82%)",
+      "toolbar_text": "hsl(30, 5%, 8%)",
+      "toolbar_field": "hsl(16, 100%, 75%)",
+      "toolbar_field_text": "hsl(30, 5%, 8%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(15, 71%, 80%)",
+      "ntp_background": "hsl(16, 73%, 97%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(30, 5%, 8%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(30, 5%, 8%)",
+      "sidebar_highlight": "hsla(15, 90%, 50%, 0.2)",
+      "address_bar_box": "hsl(0, 0%, 100%)",
+      "address_bar_box_focus": "hsl(16, 100%, 82%)",
+      "address_bar_url_color": "hsl(15, 70%, 38%)",
+      "panel_item_hover": "hsla(15, 90%, 50%, 0.2)",
+      "panel_item_active": "hsla(15, 90%, 50%, 0.35)",
+      "panel_separator": "hsl(15, 71%, 80%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/abstract/soft/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(16, 100%, 75%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(0, 0%, 100%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(30, 5%, 8%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(30, 5%, 8%)" />
+  <rect y="44" width="680" height="48" fill="hsl(16, 100%, 82%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(30, 5%, 8%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(30, 5%, 8%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(30, 5%, 8%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(30, 5%, 8%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(30, 5%, 8%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(16, 100%, 75%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(30, 5%, 8%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(30, 5%, 8%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/cheers/balanced/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(42, 95%, 60%)"/>
+      <stop offset="1" stop-color="hsl(42, 95%, 70%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/cheers/balanced/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-cheers-balanced@mozilla.org"
+    }
+  },
+  "name": "Cheers – Balanced",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 0%)",
+      "tab_text": "hsl(0, 0%, 100%)",
+      "tab_selected": "hsl(0, 0%, 20%)",
+      "tab_line": "transparent",
+      "frame": "hsl(42, 95%, 60%)",
+      "popup": "hsl(0, 0%, 20%)",
+      "popup_text": "hsl(0, 0%, 100%)",
+      "popup_border": "hsl(42, 63%, 78%)",
+      "popup_highlight": "hsla(42, 100%, 62%, 0.22)",
+      "popup_highlight_text": "hsl(0, 0%, 100%)",
+      "toolbar": "hsl(42, 95%, 70%)",
+      "toolbar_text": "hsl(0, 0%, 0%)",
+      "toolbar_field": "hsl(0, 0%, 20%)",
+      "toolbar_field_text": "hsl(0, 0%, 100%)",
+      "toolbar_field_focus": "hsl(0, 0%, 20%)",
+      "toolbar_field_border_focus": "hsl(42, 63%, 78%)",
+      "ntp_background": "hsl(0, 0%, 9%)",
+      "ntp_card_background": "hsl(0, 0%, 20%)",
+      "ntp_text": "hsl(0, 0%, 100%)",
+      "sidebar": "hsl(0, 0%, 20%)",
+      "sidebar_text": "hsl(0, 0%, 100%)",
+      "sidebar_highlight": "hsla(42, 100%, 62%, 0.22)",
+      "address_bar_box": "hsl(42, 95%, 60%)",
+      "address_bar_box_focus": "hsl(42, 95%, 70%)",
+      "address_bar_url_color": "hsl(42, 95%, 60%)",
+      "panel_item_hover": "hsla(42, 100%, 62%, 0.22)",
+      "panel_item_active": "hsla(42, 100%, 62%, 0.37)",
+      "panel_separator": "hsl(42, 63%, 78%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/cheers/balanced/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(42, 95%, 60%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(0, 0%, 20%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+  <rect y="44" width="680" height="48" fill="hsl(42, 95%, 70%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(0, 0%, 20%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/cheers/bold/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(0, 0%, 11%)"/>
+      <stop offset="1" stop-color="hsl(0, 0%, 24%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/cheers/bold/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-cheers-bold@mozilla.org"
+    }
+  },
+  "name": "Cheers – Bold",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(42, 96%, 65%)",
+      "tab_text": "hsl(42, 96%, 65%)",
+      "tab_selected": "hsl(0, 0%, 20%)",
+      "tab_line": "hsl(42, 80%, 58%)",
+      "frame": "hsl(0, 0%, 11%)",
+      "popup": "hsl(0, 0%, 20%)",
+      "popup_text": "hsl(42, 96%, 65%)",
+      "popup_border": "hsl(42, 95%, 60%)",
+      "popup_highlight": "hsla(42, 95%, 60%, 0.2)",
+      "popup_highlight_text": "hsl(42, 96%, 65%)",
+      "toolbar": "hsl(0, 0%, 24%)",
+      "toolbar_text": "hsl(42, 96%, 65%)",
+      "toolbar_field": "hsl(0, 0%, 11%)",
+      "toolbar_field_text": "hsl(42, 96%, 65%)",
+      "toolbar_field_focus": "hsl(0, 0%, 20%)",
+      "toolbar_field_border_focus": "hsl(42, 95%, 60%)",
+      "ntp_background": "hsl(0, 0%, 11%)",
+      "ntp_card_background": "hsl(0, 0%, 20%)",
+      "ntp_text": "hsl(42, 96%, 65%)",
+      "sidebar": "hsl(0, 0%, 20%)",
+      "sidebar_text": "hsl(42, 96%, 65%)",
+      "sidebar_highlight": "hsla(42, 95%, 60%, 0.2)",
+      "address_bar_box": "hsl(0, 0%, 20%)",
+      "address_bar_box_focus": "hsl(0, 0%, 24%)",
+      "address_bar_url_color": "hsl(42, 70%, 72%)",
+      "panel_item_hover": "hsla(42, 95%, 60%, 0.2)",
+      "panel_item_active": "hsla(42, 95%, 60%, 0.35)",
+      "panel_separator": "hsl(42, 95%, 60%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/cheers/bold/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(0, 0%, 11%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(0, 0%, 20%)" stroke="hsl(42, 80%, 58%)" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(42, 96%, 65%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(42, 96%, 65%)" />
+  <rect y="44" width="680" height="48" fill="hsl(0, 0%, 24%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(42, 96%, 65%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(42, 96%, 65%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(42, 96%, 65%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(42, 96%, 65%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(42, 96%, 65%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(0, 0%, 11%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(42, 96%, 65%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(42, 96%, 65%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/cheers/soft/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(42, 100%, 70%)"/>
+      <stop offset="1" stop-color="hsl(42, 100%, 84%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/cheers/soft/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-cheers-soft@mozilla.org"
+    }
+  },
+  "name": "Cheers – Soft",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 0%)",
+      "tab_text": "hsl(0, 0%, 0%)",
+      "tab_selected": "hsl(0, 0%, 100%)",
+      "tab_line": "transparent",
+      "frame": "hsl(42, 100%, 70%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(0, 0%, 0%)",
+      "popup_border": "hsl(42, 100%, 60%)",
+      "popup_highlight": "hsla(42, 100%, 78%, 0.3)",
+      "popup_highlight_text": "hsl(0, 0%, 0%)",
+      "toolbar": "hsl(42, 100%, 84%)",
+      "toolbar_text": "hsl(0, 0%, 0%)",
+      "toolbar_field": "hsl(42, 100%, 70%)",
+      "toolbar_field_text": "hsl(0, 0%, 0%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(42, 100%, 60%)",
+      "ntp_background": "hsl(43, 61%, 92%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(0, 0%, 0%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(0, 0%, 0%)",
+      "sidebar_highlight": "hsla(42, 100%, 78%, 0.3)",
+      "address_bar_box": "hsl(0, 0%, 100%)",
+      "address_bar_box_focus": "hsl(42, 100%, 84%)",
+      "address_bar_url_color": "hsl(42, 100%, 28%)",
+      "panel_item_hover": "hsla(42, 100%, 78%, 0.3)",
+      "panel_item_active": "hsla(42, 100%, 78%, 0.45)",
+      "panel_separator": "hsl(42, 100%, 60%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/cheers/soft/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(42, 100%, 70%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(0, 0%, 100%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+  <rect y="44" width="680" height="48" fill="hsl(42, 100%, 84%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(42, 100%, 70%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/elemental/balanced/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(38, 7%, 30%)"/>
+      <stop offset="1" stop-color="hsl(41, 7%, 52%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/elemental/balanced/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-elemental-balanced@mozilla.org"
+    }
+  },
+  "name": "Elemental – Balanced",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 100%)",
+      "tab_text": "hsl(0, 0%, 0%)",
+      "tab_selected": "hsl(40, 7%, 92%)",
+      "tab_line": "transparent",
+      "frame": "hsl(38, 7%, 30%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(0, 0%, 0%)",
+      "popup_border": "hsl(43, 7%, 60%)",
+      "popup_highlight": "hsla(38, 7%, 70%, 0.6)",
+      "popup_highlight_text": "hsl(0, 0%, 0%)",
+      "toolbar": "hsl(41, 7%, 52%)",
+      "toolbar_text": "hsl(0, 0%, 100%)",
+      "toolbar_field": "hsl(40, 7%, 92%)",
+      "toolbar_field_text": "hsl(0, 0%, 0%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(43, 7%, 60%)",
+      "ntp_background": "hsl(40, 7%, 18%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(0, 0%, 0%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(0, 0%, 0%)",
+      "sidebar_highlight": "hsla(38, 7%, 70%, 0.6)",
+      "address_bar_box": "hsl(38, 7%, 30%)",
+      "address_bar_box_focus": "hsl(41, 7%, 52%)",
+      "address_bar_url_color": "hsl(150, 2%, 20%)",
+      "panel_item_hover": "hsla(38, 7%, 70%, 0.6)",
+      "panel_item_active": "hsla(38, 7%, 70%, 0.75)",
+      "panel_separator": "hsl(43, 7%, 60%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/elemental/balanced/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(38, 7%, 30%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(40, 7%, 92%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect y="44" width="680" height="48" fill="hsl(41, 7%, 52%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(40, 7%, 92%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/elemental/bold/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(38, 7%, 30%)"/>
+      <stop offset="1" stop-color="hsl(43, 7%, 42%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/elemental/bold/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-elemental-bold@mozilla.org"
+    }
+  },
+  "name": "Elemental – Bold",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 100%)",
+      "tab_text": "hsl(0, 0%, 100%)",
+      "tab_selected": "hsl(40, 7%, 25%)",
+      "tab_line": "hsl(42, 7%, 38%)",
+      "frame": "hsl(38, 7%, 30%)",
+      "popup": "hsl(40, 7%, 25%)",
+      "popup_text": "hsl(0, 0%, 100%)",
+      "popup_border": "hsl(43, 7%, 40%)",
+      "popup_highlight": "hsla(38, 7%, 70%, 0.3)",
+      "popup_highlight_text": "hsl(0, 0%, 100%)",
+      "toolbar": "hsl(43, 7%, 42%)",
+      "toolbar_text": "hsl(0, 0%, 100%)",
+      "toolbar_field": "hsl(38, 7%, 30%)",
+      "toolbar_field_text": "hsl(0, 0%, 100%)",
+      "toolbar_field_focus": "hsl(40, 7%, 25%)",
+      "toolbar_field_border_focus": "hsl(43, 7%, 40%)",
+      "ntp_background": "hsl(38, 7%, 30%)",
+      "ntp_card_background": "hsl(40, 7%, 25%)",
+      "ntp_text": "hsl(0, 0%, 100%)",
+      "sidebar": "hsl(40, 7%, 25%)",
+      "sidebar_text": "hsl(0, 0%, 100%)",
+      "sidebar_highlight": "hsla(38, 7%, 70%, 0.3)",
+      "address_bar_box": "hsl(40, 7%, 25%)",
+      "address_bar_box_focus": "hsl(43, 7%, 42%)",
+      "address_bar_url_color": "hsl(40, 6%, 90%)",
+      "panel_item_hover": "hsla(38, 7%, 70%, 0.3)",
+      "panel_item_active": "hsla(38, 7%, 70%, 0.45)",
+      "panel_separator": "hsl(43, 7%, 40%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/elemental/bold/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(38, 7%, 30%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(40, 7%, 25%)" stroke="hsl(42, 7%, 38%)" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect y="44" width="680" height="48" fill="hsl(43, 7%, 42%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(38, 7%, 30%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/elemental/soft/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(45, 6%, 88%)"/>
+      <stop offset="1" stop-color="hsl(30, 7%, 94%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/elemental/soft/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-elemental-soft@mozilla.org"
+    }
+  },
+  "name": "Elemental – Soft",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(48, 10%, 10%)",
+      "tab_text": "hsl(48, 10%, 10%)",
+      "tab_selected": "hsl(0, 0%, 100%)",
+      "tab_line": "transparent",
+      "frame": "hsl(45, 6%, 88%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(48, 10%, 10%)",
+      "popup_border": "hsl(48, 6%, 85%)",
+      "popup_highlight": "hsla(40, 7%, 73%, 0.4)",
+      "popup_highlight_text": "hsl(48, 10%, 10%)",
+      "toolbar": "hsl(30, 7%, 94%)",
+      "toolbar_text": "hsl(48, 10%, 10%)",
+      "toolbar_field": "hsl(45, 6%, 88%)",
+      "toolbar_field_text": "hsl(48, 10%, 10%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(48, 6%, 85%)",
+      "ntp_background": "hsl(60, 8%, 95%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(48, 10%, 10%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(48, 10%, 10%)",
+      "sidebar_highlight": "hsla(40, 7%, 73%, 0.4)",
+      "address_bar_box": "hsl(0, 0%, 100%)",
+      "address_bar_box_focus": "hsl(30, 7%, 94%)",
+      "address_bar_url_color": "hsl(42, 7%, 38%)",
+      "panel_item_hover": "hsla(40, 7%, 73%, 0.4)",
+      "panel_item_active": "hsla(40, 7%, 73%, 0.55)",
+      "panel_separator": "hsl(48, 6%, 85%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/elemental/soft/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(45, 6%, 88%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(0, 0%, 100%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(48, 10%, 10%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(48, 10%, 10%)" />
+  <rect y="44" width="680" height="48" fill="hsl(30, 7%, 94%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(48, 10%, 10%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(48, 10%, 10%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(48, 10%, 10%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(48, 10%, 10%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(48, 10%, 10%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(45, 6%, 88%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(48, 10%, 10%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(48, 10%, 10%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/foto/balanced/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(351, 37%, 40%)"/>
+      <stop offset="1" stop-color="hsl(351, 37%, 47%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/foto/balanced/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-foto-balanced@mozilla.org"
+    }
+  },
+  "name": "Foto – Balanced",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 100%)",
+      "tab_text": "hsl(0, 0%, 0%)",
+      "tab_selected": "hsl(349, 35%, 94%)",
+      "tab_line": "transparent",
+      "frame": "hsl(351, 37%, 40%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(0, 0%, 0%)",
+      "popup_border": "hsl(351, 44%, 63%)",
+      "popup_highlight": "hsla(350, 53%, 75%, 0.5)",
+      "popup_highlight_text": "hsl(0, 0%, 0%)",
+      "toolbar": "hsl(351, 37%, 47%)",
+      "toolbar_text": "hsl(0, 0%, 100%)",
+      "toolbar_field": "hsl(349, 35%, 94%)",
+      "toolbar_field_text": "hsl(0, 0%, 0%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(351, 44%, 63%)",
+      "ntp_background": "hsl(351, 37%, 80%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(0, 0%, 0%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(0, 0%, 0%)",
+      "sidebar_highlight": "hsla(350, 53%, 75%, 0.5)",
+      "address_bar_box": "hsl(351, 37%, 40%)",
+      "address_bar_box_focus": "hsl(351, 37%, 47%)",
+      "address_bar_url_color": "hsl(351, 37%, 40%)",
+      "panel_item_hover": "hsla(350, 53%, 75%, 0.5)",
+      "panel_item_active": "hsla(350, 53%, 75%, 0.65)",
+      "panel_separator": "hsl(351, 44%, 63%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/foto/balanced/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(351, 37%, 40%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(349, 35%, 94%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect y="44" width="680" height="48" fill="hsl(351, 37%, 47%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(349, 35%, 94%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/foto/bold/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(351, 32%, 42%)"/>
+      <stop offset="1" stop-color="hsl(351, 32%, 50%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/foto/bold/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-foto-bold@mozilla.org"
+    }
+  },
+  "name": "Foto – Bold",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 100%)",
+      "tab_text": "hsl(0, 0%, 100%)",
+      "tab_selected": "hsl(351, 27%, 25%)",
+      "tab_line": "hsl(351, 31%, 52%)",
+      "frame": "hsl(351, 32%, 42%)",
+      "popup": "hsl(351, 27%, 25%)",
+      "popup_text": "hsl(0, 0%, 100%)",
+      "popup_border": "hsl(351, 32%, 46%)",
+      "popup_highlight": "hsla(351, 32%, 50%, 0.6)",
+      "popup_highlight_text": "hsl(0, 0%, 100%)",
+      "toolbar": "hsl(351, 32%, 50%)",
+      "toolbar_text": "hsl(0, 0%, 100%)",
+      "toolbar_field": "hsl(351, 32%, 42%)",
+      "toolbar_field_text": "hsl(0, 0%, 100%)",
+      "toolbar_field_focus": "hsl(351, 27%, 25%)",
+      "toolbar_field_border_focus": "hsl(351, 32%, 46%)",
+      "ntp_background": "hsl(350, 14%, 17%)",
+      "ntp_card_background": "hsl(351, 27%, 25%)",
+      "ntp_text": "hsl(0, 0%, 100%)",
+      "sidebar": "hsl(351, 27%, 25%)",
+      "sidebar_text": "hsl(0, 0%, 100%)",
+      "sidebar_highlight": "hsla(351, 32%, 50%, 0.6)",
+      "address_bar_box": "hsl(351, 27%, 25%)",
+      "address_bar_box_focus": "hsl(351, 32%, 50%)",
+      "address_bar_url_color": "hsl(352, 57%, 90%)",
+      "panel_item_hover": "hsla(351, 32%, 50%, 0.6)",
+      "panel_item_active": "hsla(351, 32%, 50%, 0.75)",
+      "panel_separator": "hsl(351, 32%, 46%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/foto/bold/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(351, 32%, 42%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(351, 27%, 25%)" stroke="hsl(351, 31%, 52%)" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect y="44" width="680" height="48" fill="hsl(351, 32%, 50%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(351, 32%, 42%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/foto/soft/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(352, 56%, 84%)"/>
+      <stop offset="1" stop-color="hsl(350, 46%, 87%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/foto/soft/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-foto-soft@mozilla.org"
+    }
+  },
+  "name": "Foto – Soft",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(351, 32%, 8%)",
+      "tab_text": "hsl(351, 32%, 8%)",
+      "tab_selected": "hsl(0, 0%, 100%)",
+      "tab_line": "transparent",
+      "frame": "hsl(352, 56%, 84%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(351, 32%, 8%)",
+      "popup_border": "hsl(350, 61%, 88%)",
+      "popup_highlight": "hsla(351, 52%, 82%, 0.5)",
+      "popup_highlight_text": "hsl(351, 32%, 8%)",
+      "toolbar": "hsl(350, 46%, 87%)",
+      "toolbar_text": "hsl(351, 32%, 8%)",
+      "toolbar_field": "hsl(352, 56%, 84%)",
+      "toolbar_field_text": "hsl(351, 32%, 8%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(350, 61%, 88%)",
+      "ntp_background": "hsl(354, 33%, 94%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(351, 32%, 8%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(351, 32%, 8%)",
+      "sidebar_highlight": "hsla(351, 52%, 82%, 0.5)",
+      "address_bar_box": "hsl(0, 0%, 100%)",
+      "address_bar_box_focus": "hsl(350, 46%, 87%)",
+      "address_bar_url_color": "hsl(351, 37%, 40%)",
+      "panel_item_hover": "hsla(351, 52%, 82%, 0.5)",
+      "panel_item_active": "hsla(351, 52%, 82%, 0.65)",
+      "panel_separator": "hsl(350, 61%, 88%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/foto/soft/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(352, 56%, 84%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(0, 0%, 100%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(351, 32%, 8%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(351, 32%, 8%)" />
+  <rect y="44" width="680" height="48" fill="hsl(350, 46%, 87%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(351, 32%, 8%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(351, 32%, 8%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(351, 32%, 8%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(351, 32%, 8%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(351, 32%, 8%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(352, 56%, 84%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(351, 32%, 8%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(351, 32%, 8%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/graffiti/balanced/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(278, 33%, 40%)"/>
+      <stop offset="1" stop-color="hsl(279, 29%, 52%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/graffiti/balanced/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-graffiti-balanced@mozilla.org"
+    }
+  },
+  "name": "Graffiti – Balanced",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 100%)",
+      "tab_text": "hsl(0, 0%, 0%)",
+      "tab_selected": "hsl(278, 31%, 95%)",
+      "tab_line": "transparent",
+      "frame": "hsl(278, 33%, 40%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(0, 0%, 0%)",
+      "popup_border": "hsl(278, 32%, 50%)",
+      "popup_highlight": "hsla(278, 80%, 78%, 0.4)",
+      "popup_highlight_text": "hsl(0, 0%, 0%)",
+      "toolbar": "hsl(279, 29%, 52%)",
+      "toolbar_text": "hsl(0, 0%, 100%)",
+      "toolbar_field": "hsl(278, 31%, 95%)",
+      "toolbar_field_text": "hsl(0, 0%, 0%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(278, 32%, 50%)",
+      "ntp_background": "hsl(277, 30%, 86%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(0, 0%, 0%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(0, 0%, 0%)",
+      "sidebar_highlight": "hsla(278, 80%, 78%, 0.4)",
+      "address_bar_box": "hsl(278, 33%, 40%)",
+      "address_bar_box_focus": "hsl(279, 29%, 52%)",
+      "address_bar_url_color": "hsl(278, 32%, 35%)",
+      "panel_item_hover": "hsla(278, 80%, 78%, 0.4)",
+      "panel_item_active": "hsla(278, 80%, 78%, 0.55)",
+      "panel_separator": "hsl(278, 32%, 50%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/graffiti/balanced/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(278, 33%, 40%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(278, 31%, 95%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect y="44" width="680" height="48" fill="hsl(279, 29%, 52%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(278, 31%, 95%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/graffiti/bold/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(278, 32%, 35%)"/>
+      <stop offset="1" stop-color="hsl(278, 27%, 48%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/graffiti/bold/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-graffiti-bold@mozilla.org"
+    }
+  },
+  "name": "Graffiti – Bold",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 100%)",
+      "tab_text": "hsl(0, 0%, 100%)",
+      "tab_selected": "hsl(275, 15%, 22%)",
+      "tab_line": "hsl(278, 32%, 50%)",
+      "frame": "hsl(278, 32%, 35%)",
+      "popup": "hsl(275, 15%, 22%)",
+      "popup_text": "hsl(0, 0%, 100%)",
+      "popup_border": "hsl(278, 30%, 42%)",
+      "popup_highlight": "hsla(278, 33%, 52%, 0.6)",
+      "popup_highlight_text": "hsl(0, 0%, 100%)",
+      "toolbar": "hsl(278, 27%, 48%)",
+      "toolbar_text": "hsl(0, 0%, 100%)",
+      "toolbar_field": "hsl(278, 32%, 35%)",
+      "toolbar_field_text": "hsl(0, 0%, 100%)",
+      "toolbar_field_focus": "hsl(275, 15%, 22%)",
+      "toolbar_field_border_focus": "hsl(278, 30%, 42%)",
+      "ntp_background": "hsl(270, 10%, 12%)",
+      "ntp_card_background": "hsl(275, 15%, 22%)",
+      "ntp_text": "hsl(0, 0%, 100%)",
+      "sidebar": "hsl(275, 15%, 22%)",
+      "sidebar_text": "hsl(0, 0%, 100%)",
+      "sidebar_highlight": "hsla(278, 33%, 52%, 0.6)",
+      "address_bar_box": "hsl(275, 15%, 22%)",
+      "address_bar_box_focus": "hsl(278, 27%, 48%)",
+      "address_bar_url_color": "hsl(278, 80%, 88%)",
+      "panel_item_hover": "hsla(278, 33%, 52%, 0.6)",
+      "panel_item_active": "hsla(278, 33%, 52%, 0.75)",
+      "panel_separator": "hsl(278, 30%, 42%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/graffiti/bold/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(278, 32%, 35%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(275, 15%, 22%)" stroke="hsl(278, 32%, 50%)" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect y="44" width="680" height="48" fill="hsl(278, 27%, 48%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(278, 32%, 35%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/graffiti/soft/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(278, 80%, 80%)"/>
+      <stop offset="1" stop-color="hsl(278, 79%, 85%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/graffiti/soft/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-graffiti-soft@mozilla.org"
+    }
+  },
+  "name": "Graffiti – Soft",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(278, 22%, 10%)",
+      "tab_text": "hsl(278, 22%, 10%)",
+      "tab_selected": "hsl(0, 0%, 100%)",
+      "tab_line": "transparent",
+      "frame": "hsl(278, 80%, 80%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(278, 22%, 10%)",
+      "popup_border": "hsl(278, 80%, 86%)",
+      "popup_highlight": "hsla(278, 80%, 78%, 0.4)",
+      "popup_highlight_text": "hsl(278, 22%, 10%)",
+      "toolbar": "hsl(278, 79%, 85%)",
+      "toolbar_text": "hsl(278, 22%, 10%)",
+      "toolbar_field": "hsl(278, 80%, 80%)",
+      "toolbar_field_text": "hsl(278, 22%, 10%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(278, 80%, 86%)",
+      "ntp_background": "hsl(279, 77%, 95%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(278, 22%, 10%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(278, 22%, 10%)",
+      "sidebar_highlight": "hsla(278, 80%, 78%, 0.4)",
+      "address_bar_box": "hsl(0, 0%, 100%)",
+      "address_bar_box_focus": "hsl(278, 79%, 85%)",
+      "address_bar_url_color": "hsl(278, 33%, 44%)",
+      "panel_item_hover": "hsla(278, 80%, 78%, 0.4)",
+      "panel_item_active": "hsla(278, 80%, 78%, 0.55)",
+      "panel_separator": "hsl(278, 80%, 86%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/graffiti/soft/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(278, 80%, 80%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(0, 0%, 100%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(278, 22%, 10%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(278, 22%, 10%)" />
+  <rect y="44" width="680" height="48" fill="hsl(278, 79%, 85%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(278, 22%, 10%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(278, 22%, 10%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(278, 22%, 10%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(278, 22%, 10%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(278, 22%, 10%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(278, 80%, 80%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(278, 22%, 10%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(278, 22%, 10%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/lush/balanced/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(144, 16%, 30%)"/>
+      <stop offset="1" stop-color="hsl(146, 15%, 36%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/lush/balanced/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-lush-balanced@mozilla.org"
+    }
+  },
+  "name": "Lush – Balanced",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 100%)",
+      "tab_text": "hsl(0, 0%, 0%)",
+      "tab_selected": "hsl(120, 7%, 94%)",
+      "tab_line": "transparent",
+      "frame": "hsl(144, 16%, 30%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(0, 0%, 0%)",
+      "popup_border": "hsl(145, 25%, 50%)",
+      "popup_highlight": "hsla(145, 36%, 40%, 0.3)",
+      "popup_highlight_text": "hsl(0, 0%, 0%)",
+      "toolbar": "hsl(146, 15%, 36%)",
+      "toolbar_text": "hsl(0, 0%, 100%)",
+      "toolbar_field": "hsl(120, 7%, 94%)",
+      "toolbar_field_text": "hsl(0, 0%, 0%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(145, 25%, 50%)",
+      "ntp_background": "hsl(140, 10%, 82%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(0, 0%, 0%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(0, 0%, 0%)",
+      "sidebar_highlight": "hsla(145, 36%, 40%, 0.3)",
+      "address_bar_box": "hsl(144, 16%, 30%)",
+      "address_bar_box_focus": "hsl(146, 15%, 36%)",
+      "address_bar_url_color": "hsl(138, 16%, 32%)",
+      "panel_item_hover": "hsla(145, 36%, 40%, 0.3)",
+      "panel_item_active": "hsla(145, 36%, 40%, 0.45)",
+      "panel_separator": "hsl(145, 25%, 50%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/lush/balanced/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(144, 16%, 30%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(120, 7%, 94%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect y="44" width="680" height="48" fill="hsl(146, 15%, 36%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(120, 7%, 94%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 0%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 0%)" />
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/lush/bold/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(138, 16%, 32%)"/>
+      <stop offset="1" stop-color="hsl(138, 15%, 44%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/lush/bold/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-lush-bold@mozilla.org"
+    }
+  },
+  "name": "Lush – Bold",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(0, 0%, 100%)",
+      "tab_text": "hsl(0, 0%, 100%)",
+      "tab_selected": "hsl(140, 2%, 28%)",
+      "tab_line": "hsl(139, 8%, 48%)",
+      "frame": "hsl(138, 16%, 32%)",
+      "popup": "hsl(140, 2%, 28%)",
+      "popup_text": "hsl(0, 0%, 100%)",
+      "popup_border": "hsl(140, 10%, 35%)",
+      "popup_highlight": "hsla(137, 18%, 50%, 0.42)",
+      "popup_highlight_text": "hsl(0, 0%, 100%)",
+      "toolbar": "hsl(138, 15%, 44%)",
+      "toolbar_text": "hsl(0, 0%, 100%)",
+      "toolbar_field": "hsl(138, 16%, 32%)",
+      "toolbar_field_text": "hsl(0, 0%, 100%)",
+      "toolbar_field_focus": "hsl(140, 2%, 28%)",
+      "toolbar_field_border_focus": "hsl(140, 10%, 35%)",
+      "ntp_background": "hsl(150, 2%, 20%)",
+      "ntp_card_background": "hsl(140, 2%, 28%)",
+      "ntp_text": "hsl(0, 0%, 100%)",
+      "sidebar": "hsl(140, 2%, 28%)",
+      "sidebar_text": "hsl(0, 0%, 100%)",
+      "sidebar_highlight": "hsla(137, 18%, 50%, 0.42)",
+      "address_bar_box": "hsl(140, 2%, 28%)",
+      "address_bar_box_focus": "hsl(138, 15%, 44%)",
+      "address_bar_url_color": "hsl(146, 44%, 86%)",
+      "panel_item_hover": "hsla(137, 18%, 50%, 0.42)",
+      "panel_item_active": "hsla(137, 18%, 50%, 0.57)",
+      "panel_separator": "hsl(140, 10%, 35%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
rename from toolkit/mozapps/extensions/content/firefox-monochromatic-purple.svg
rename to browser/themes/addons/monochromatic/lush/bold/preview.svg
--- a/toolkit/mozapps/extensions/content/firefox-monochromatic-purple.svg
+++ b/browser/themes/addons/monochromatic/lush/bold/preview.svg
@@ -1,46 +1,18 @@
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 <svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
-  <rect width="680" height="92" fill="rgb(247,227,255)"/>
-  <g filter="url(#filter0_dd)">
-    <rect x="28" y="5" width="166" height="34" rx="4" fill="color-mix(in srgb, rgb(247,227,255) 60%, white)"/>
-  </g>
-  <rect x="51" y="20" width="121" height="4" rx="2" fill="color-mix(in srgb, rgb(247,227,255) 15%, black)"/>
-  <rect x="221" y="20" width="121" height="4" rx="2" fill="color-mix(in srgb, rgb(247,227,255) 15%, black)"/>
-  <rect y="44" width="680" height="48" fill="color-mix(in srgb, rgb(247,227,255) 60%, white)"/>
-  <circle cx="24" cy="68" r="6.25" stroke-width="1.5" stroke="color-mix(in srgb, rgb(247,227,255) 15%, black)"/>
-  <circle cx="60" cy="68" r="6.25" stroke-width="1.5" stroke="color-mix(in srgb, rgb(247,227,255) 15%, black)"/>
-  <rect x="114" y="52" width="488" height="32" rx="4" fill="rgb(247,227,255)"/>
-  <circle cx="130" cy="68" r="6.25" stroke-width="1.5" stroke="color-mix(in srgb, rgb(247,227,255) 15%, black)"/>
-  <rect x="146" y="66" width="308" height="4" rx="2" fill="color-mix(in srgb, rgb(247,227,255) 15%, black)"/>
-  <mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="680" height="92">
-    <path d="M680 92V0H334C321.85 0 312 9.84974 312 22C312 34.1503 302.15 44 290 44H252C238.745 44 228 54.7452 228 68C228 81.2548 217.255 92 204 92H680Z" fill="#C4C4C4"/>
-  </mask>
-  <g mask="url(#mask0)">
-    <rect width="680" height="92" fill="rgb(150,43,185)"/>
-    <rect x="221" y="20" width="121" height="4" rx="2" fill="color-mix(in srgb, rgb(150,43,185) 10%, white)"/>
-    <rect y="44" width="680" height="48" fill="color-mix(in srgb, rgb(150,43,185) 85%, white)"/>
-    <line x1="663" y1="73.75" x2="649" y2="73.75" stroke-width="1.5" stroke="color-mix(in srgb, rgb(150,43,185) 10%, white)"/>
-    <line x1="663" y1="67.75" x2="649" y2="67.75" stroke-width="1.5" stroke="color-mix(in srgb, rgb(150,43,185) 10%, white)"/>
-    <line x1="663" y1="61.75" x2="649" y2="61.75" stroke-width="1.5" stroke="color-mix(in srgb, rgb(150,43,185) 10%, white)"/>
-    <rect x="114" y="52" width="488" height="32" rx="4" fill="rgb(150,43,185)"/>
-    <rect x="146" y="66" width="308" height="4" rx="2" fill="color-mix(in srgb, rgb(150,43,185) 10%, white)"/>
-  </g>
-  <defs>
-    <filter id="filter0_dd" x="24" y="1" width="174" height="42" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
-      <feFlood flood-opacity="0" result="BackgroundImageFix"/>
-      <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
-      <feOffset/>
-      <feGaussianBlur stdDeviation="2"/>
-      <feColorMatrix type="matrix" values="0 0 0 0 0.501961 0 0 0 0 0.501961 0 0 0 0 0.556863 0 0 0 0.5 0"/>
-      <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/>
-      <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
-      <feOffset/>
-      <feGaussianBlur stdDeviation="0.5"/>
-      <feColorMatrix type="matrix" values="0 0 0 0 0.501961 0 0 0 0 0.501961 0 0 0 0 0.556863 0 0 0 0.9 0"/>
-      <feBlend mode="normal" in2="effect1_dropShadow" result="effect2_dropShadow"/>
-      <feBlend mode="normal" in="SourceGraphic" in2="effect2_dropShadow" result="shape"/>
-    </filter>
-  </defs>
+  <rect width="680" height="92" fill="hsl(138, 16%, 32%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(140, 2%, 28%)" stroke="hsl(139, 8%, 48%)" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
+  <rect y="44" width="680" height="48" fill="hsl(138, 15%, 44%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(138, 16%, 32%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(0, 0%, 100%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(0, 0%, 100%)" />
 </svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/lush/soft/icon.svg
@@ -0,0 +1,12 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="63" height="62" viewBox="0 0 63 62" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <circle cx="31.5" cy="31" r="31" fill="url(#paint0_linear)"/>
+  <defs>
+    <linearGradient id="paint0_linear" x1="44.4829" y1="19" x2="10.4829" y2="53" gradientUnits="userSpaceOnUse">
+      <stop stop-color="hsl(147, 25%, 86%)"/>
+      <stop offset="1" stop-color="hsl(140, 26%, 93%)"/>
+    </linearGradient>
+  </defs>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/lush/soft/manifest.json
@@ -0,0 +1,56 @@
+{
+  "manifest_version": 2,
+  "applications": {
+    "gecko": {
+      "id": "firefox-lush-soft@mozilla.org"
+    }
+  },
+  "name": "Lush – Soft",
+  "author": "Mozilla",
+  "version": "1.0",
+  "icons": {
+    "32": "icon.svg"
+  },
+  "theme": {
+    "colors": {
+      "tab_background_text": "hsl(150, 6%, 20%)",
+      "tab_text": "hsl(150, 6%, 20%)",
+      "tab_selected": "hsl(0, 0%, 100%)",
+      "tab_line": "transparent",
+      "frame": "hsl(147, 25%, 86%)",
+      "popup": "hsl(0, 0%, 100%)",
+      "popup_text": "hsl(150, 6%, 20%)",
+      "popup_border": "hsl(144, 25%, 88%)",
+      "popup_highlight": "hsla(143, 25%, 86%, 0.7)",
+      "popup_highlight_text": "hsl(150, 6%, 20%)",
+      "toolbar": "hsl(140, 26%, 93%)",
+      "toolbar_text": "hsl(150, 6%, 20%)",
+      "toolbar_field": "hsl(147, 25%, 86%)",
+      "toolbar_field_text": "hsl(150, 6%, 20%)",
+      "toolbar_field_focus": "hsl(0, 0%, 100%)",
+      "toolbar_field_border_focus": "hsl(144, 25%, 88%)",
+      "ntp_background": "hsl(150, 25%, 97%)",
+      "ntp_card_background": "hsl(0, 0%, 100%)",
+      "ntp_text": "hsl(150, 6%, 20%)",
+      "sidebar": "hsl(0, 0%, 100%)",
+      "sidebar_text": "hsl(150, 6%, 20%)",
+      "sidebar_highlight": "hsla(143, 25%, 86%, 0.7)",
+      "address_bar_box": "hsl(0, 0%, 100%)",
+      "address_bar_box_focus": "hsl(140, 26%, 93%)",
+      "address_bar_url_color": "hsl(145, 24%, 32%)",
+      "panel_item_hover": "hsla(143, 25%, 86%, 0.7)",
+      "panel_item_active": "hsla(143, 25%, 86%, 0.85)",
+      "panel_separator": "hsl(144, 25%, 88%)"
+    }
+  },
+  "theme_experiment": {
+    "colors": {
+      "address_bar_box": "--urlbar-box-bgcolor",
+      "address_bar_box_focus": "--urlbar-box-focus-bgcolor",
+      "address_bar_url_color": "--urlbar-popup-url-color",
+      "panel_item_hover": "--panel-item-hover-bgcolor",
+      "panel_item_active": "--panel-item-active-bgcolor",
+      "panel_separator": "--panel-separator-color"
+    }
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/themes/addons/monochromatic/lush/soft/preview.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+  - License, v. 2.0. If a copy of the MPL was not distributed with this
+  - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="680" height="92" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect width="680" height="92" fill="hsl(147, 25%, 86%)" />
+  <rect x="28" y="5" width="166" height="34" rx="4" fill="hsl(0, 0%, 100%)" stroke="transparent" stroke-width="1.5" />
+  <rect x="51" y="20" width="121" height="4" rx="2" fill="hsl(150, 6%, 20%)" />
+  <rect x="221" y="20" width="121" height="4" rx="2" fill="hsl(150, 6%, 20%)" />
+  <rect y="44" width="680" height="48" fill="hsl(140, 26%, 93%)" />
+  <circle cx="24" cy="68" r="6.25" stroke="hsl(150, 6%, 20%)" stroke-width="1.5" />
+  <circle cx="60" cy="68" r="6.25" stroke="hsl(150, 6%, 20%)" stroke-width="1.5" />
+  <line x1="663" y1="73.75" x2="649" y2="73.75" stroke="hsl(150, 6%, 20%)" stroke-width="1.5" />
+  <line x1="663" y1="67.75" x2="649" y2="67.75" stroke="hsl(150, 6%, 20%)" stroke-width="1.5" />
+  <line x1="663" y1="61.75" x2="649" y2="61.75" stroke="hsl(150, 6%, 20%)" stroke-width="1.5" />
+  <rect x="114" y="52" width="488" height="32" rx="4" fill="hsl(147, 25%, 86%)" />
+  <circle cx="130" cy="68" r="6.25" stroke="hsl(150, 6%, 20%)" stroke-width="1.5" />
+  <rect x="146" y="66" width="308" height="4" rx="2" fill="hsl(150, 6%, 20%)" />
+</svg>
--- a/browser/themes/shared/customizableui/panelUI.inc.css
+++ b/browser/themes/shared/customizableui/panelUI.inc.css
@@ -22,19 +22,20 @@
 %define appmenuWarningBackgroundColorActive #FFE38F
 %define appmenuWarningColor black
 %define appmenuWarningBorderColor hsl(45,100%,77%)
 
 
 :root {
   --warning-icon-bgcolor: #FFA436;
 
-  --panel-separator-zap-gradient: linear-gradient(90deg, #9059FF 0%, #FF4AA2 52.08%, #FFBD4F 100%);
   --panelview-toolbarbutton-focus-box-shadow: inset 0 0 0 2px var(--focus-outline-color);
 
+  --panel-item-hover-bgcolor: var(--button-hover-bgcolor);
+  --panel-item-active-bgcolor: var(--button-active-bgcolor);
   --panel-banner-item-color: var(--button-color);
   --panel-banner-item-background-color: var(--button-bgcolor);
   --panel-banner-item-hover-bgcolor: var(--button-hover-bgcolor);
   --panel-banner-item-active-bgcolor: var(--button-active-bgcolor);
   --panel-banner-item-update-supported-bgcolor: #2AC3A2;
   --panel-banner-item-info-icon-bgcolor: #0090ED;
 
   --arrowpanel-menuitem-margin: 0 8px;
@@ -43,16 +44,20 @@
   --arrowpanel-menuitem-padding: var(--arrowpanel-menuitem-padding-block) var(--arrowpanel-menuitem-padding-inline);
   --arrowpanel-menuitem-border-radius: 4px;
   --panel-separator-margin-vertical: 4px;
   --panel-separator-margin-horizontal: 8px;
   --panel-separator-margin: var(--panel-separator-margin-vertical) var(--panel-separator-margin-horizontal);
   --panel-subview-body-padding: 8px 0;
 }
 
+:root:not(:-moz-lwtheme) {
+  --panel-separator-zap-gradient: linear-gradient(90deg, #9059FF 0%, #FF4AA2 52.08%, #FFBD4F 100%);
+}
+
 :root[uidensity=compact] {
   --arrowpanel-menuitem-margin: 0 4px;
   --arrowpanel-menuitem-padding-block: 0;
 }
 
 #PanelUI-menu-button[badge-status] > .toolbarbutton-badge-stack > .toolbarbutton-badge {
   display: -moz-box;
   height: 10px;
@@ -1091,30 +1096,30 @@ panelview .toolbarbutton-1,
 
 #appMenu-fullscreen-button2 > .toolbarbutton-icon {
   padding: 1px;
   background-color: var(--zoom-controls-bgcolor, var(--button-bgcolor, ButtonFace));
 }
 
 #appMenu-zoomReset-button2@buttonStateHover@ > .toolbarbutton-text,
 #appMenu-fullscreen-button2@buttonStateHover@ > .toolbarbutton-icon {
-  background-color: var(--button-hover-bgcolor);
+  background-color: var(--panel-item-hover-bgcolor);
 }
 #appMenu-zoomReduce-button2@buttonStateHover@ > .toolbarbutton-icon,
 #appMenu-zoomEnlarge-button2@buttonStateHover@ > .toolbarbutton-icon {
-  stroke: var(--button-hover-bgcolor);
+  stroke: var(--panel-item-hover-bgcolor);
 }
 
 #appMenu-zoomReset-button2@buttonStateActive@ > .toolbarbutton-text,
 #appMenu-fullscreen-button2@buttonStateActive@ > .toolbarbutton-icon {
-  background-color: var(--button-active-bgcolor);
+  background-color: var(--panel-item-active-bgcolor);
 }
 #appMenu-zoomReduce-button2@buttonStateActive@ > .toolbarbutton-icon,
 #appMenu-zoomEnlarge-button2@buttonStateActive@ > .toolbarbutton-icon {
-  stroke: var(--button-active-bgcolor);
+  stroke: var(--panel-item-active-bgcolor);
 }
 
 #appMenu-zoomReset-button2@buttonStateFocus@ > .toolbarbutton-text,
 #appMenu-fullscreen-button2@buttonStateFocus@ > .toolbarbutton-icon {
   box-shadow: var(--panelview-toolbarbutton-focus-box-shadow);
 }
 #appMenu-zoomReduce-button2@buttonStateFocus@ > .toolbarbutton-icon,
 #appMenu-zoomEnlarge-button2@buttonStateFocus@ > .toolbarbutton-icon {
@@ -1297,17 +1302,17 @@ toolbarbutton.subviewbutton@buttonStateH
 .navigable.subviewbutton@buttonStateHover@,
 menu.subviewbutton@menuStateHover@,
 #PlacesToolbar menuitem@menuStateHover@,
 #PlacesToolbar menu@menuStateHover@,
 menuitem.subviewbutton@menuStateHover@,
 .widget-overflow-list .toolbarbutton-1@buttonStateHover@,
 .toolbaritem-combined-buttons@inAnyPanel@ > toolbarbutton@buttonStateHover@ {
   color: inherit;
-  background-color: var(--button-hover-bgcolor);
+  background-color: var(--panel-item-hover-bgcolor);
 }
 
 .subview-subheader {
   font-size: 11px;
   padding-block: 4px;
 }
 
 panelview .toolbarbutton-1@buttonStateActive@,
@@ -1315,17 +1320,17 @@ toolbarbutton.subviewbutton@buttonStateA
 .navigable.subviewbutton@buttonStateActive@,
 menu.subviewbutton@menuStateActive@,
 #PlacesToolbar menuitem@menuStateActive@,
 #PlacesToolbar menu@menuStateActive@,
 menuitem.subviewbutton@menuStateActive@,
 .widget-overflow-list .toolbarbutton-1@buttonStateActive@,
 .toolbaritem-combined-buttons@inAnyPanel@ > toolbarbutton@buttonStateActive@ {
   color: inherit;
-  background-color: var(--button-active-bgcolor);
+  background-color: var(--panel-item-active-bgcolor);
   box-shadow: 0 1px 0 hsla(210,4%,10%,.03) inset;
 }
 
 #PlacesToolbar menuitem,
 #PlacesToolbar menu {
   color: var(--arrowpanel-color);
 }
 
@@ -1380,17 +1385,17 @@ menuitem.subviewbutton@menuStateActive@,
   content: '';
   position: absolute;
   width: 100%;
   border-top: 1px solid var(--panel-separator-color);
   border-bottom: none;
 }
 
 .PanelUI-subView toolbarseparator.proton-zap {
-  border-image: var(--panel-separator-zap-gradient) 1;
+  border-image: var(--panel-separator-zap-gradient, none) 1;
 }
 
 .PanelUI-subView toolbarseparator.small-separator {
   margin-inline: 5px;
 }
 
 .cui-widget-panelview menuseparator.small-separator {
   margin-inline: 10px;
--- a/browser/themes/shared/preferences/preferences.inc.css
+++ b/browser/themes/shared/preferences/preferences.inc.css
@@ -211,59 +211,39 @@ checkbox {
 #category-experimental > .category-icon {
   list-style-image: url("chrome://browser/skin/preferences/category-experiments.svg");
 }
 
 /* All panes */
 
 .info-icon,
 .androidIcon,
-.iOSIcon,
-#updateSettingCrossUserWarning,
-.extension-controlled > description,
-.info-panel > description {
+.iOSIcon {
   -moz-context-properties: fill;
   fill: currentColor;
 }
 
 /* General Pane */
 
 .is-default > #isNotDefaultPane,
 :not(.is-default) > #isDefaultPane {
   visibility: hidden;
 }
 
 #isDefaultLabel,
 #isNotDefaultLabel {
   font-weight: 600;
 }
 
-.info-panel,
-.extension-controlled {
-  margin-block: 18px !important;
-  background: var(--in-content-box-info-background);
-  border-radius: 5px;
-  padding-inline-end: 10px;
+#browserContainersExtensionContent {
+  padding-block: 5px;
 }
 
-.info-panel > description,
-.extension-controlled > description {
-  line-height: 16px;
-  background: url(chrome://global/skin/icons/info.svg) 10px 14px no-repeat;
-  padding: 10px;
-  padding-inline-start: 32px;
-}
-
-.info-panel > description {
-  line-height: unset;
-}
-
-.info-panel > description:-moz-locale-dir(rtl),
-.extension-controlled > description:-moz-locale-dir(rtl) {
-  background-position-x: right 10px;
+.extension-controlled {
+  margin-block: 18px;
 }
 
 .extension-controlled-icon {
   height: 20px;
   margin: 2px 0 6px;
   vertical-align: middle;
   width: 20px;
   -moz-context-properties: fill;
@@ -754,20 +734,17 @@ richlistitem[selected] .actionsMenu:focu
   margin-inline: 4px 8px;
 }
 
 #syncStatus {
   margin-top: 32px;
 }
 
 .sync-group {
-  border-radius: 4px;
-  padding: 16px;
   margin-block: 16px;
-  background-color: var(--in-content-box-info-background);
   border: 1px solid var(--in-content-border-color);
 }
 
 .sync-configured {
   display: block;
 }
 
 .sync-engines-list > div,
@@ -925,38 +902,51 @@ image.update-throbber {
 
 #policies-container,
 #searchInput {
   min-height: 32px;
   margin: 20px 0 30px;
 }
 
 #policies-container {
+  margin-inline-end: 16px;
+  /* Make sure the container is at least the same height as the searchbox.
+     This is needed in addition to the min-height above to make the info icon
+     the same height as the first line in the policies label.
+     Searchbox's height - line-height - border top and bottom */
+  padding-block: max(0px, calc((32px - 1.8em - 2px) / 2));
+}
+
+.info-box-container {
   background-color: var(--in-content-box-info-background);
-  padding: 0 8px;
-  margin-inline-end: 16px;
-  border-radius: 2px;
+  padding: 9px;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+
+.info-box-container.smaller-font-size {
   font-size: 85%;
 }
 
-.policies-label {
-  margin-inline-start: 2px;
+.info-icon-container {
+  display: flex;
 }
 
 .info-icon {
   list-style-image: url("chrome://global/skin/icons/info.svg");
   width: 16px;
   height: 16px;
+  margin-inline-end: 6px;
+  align-self: start;
+  margin-top: 0.4em;
+  flex-shrink: 0;
 }
 
-.info-icon-telemetry {
-  list-style-image: url("chrome://global/skin/icons/info.svg");
-  width: 16px;
-  height: 16px;
-  margin-inline: 2px 8px;
+.info-box-container.smaller-font-size .info-icon {
+  margin-top: 0.3em;
 }
 
 .sticky-container {
   position: sticky;
   background-color: var(--in-content-page-background);
   top: 0;
   z-index: 1;
   /* The sticky-container should have the capability to cover all spotlight area. */
@@ -1084,35 +1074,22 @@ menulist[indicator=true] > menupopup men
 }
 
 /* Menulist styles */
 .label-item {
   font-size: 0.8em;
 }
 
 .updateSettingCrossUserWarningContainer {
-  background: var(--in-content-box-info-background);
-  border-radius: 5px;
-  padding: 2px 8px 8px;
   margin-block-end: 17px;
 }
 
-#updateSettingCrossUserWarning {
-  padding-inline-start: 30px;
+#updateSettingCrossUserWarningDesc {
+  padding-inline-start: calc(16px + 6px); /* radio-check's width + margin-inline-end */
   margin-block-start: 20px;
-  line-height: 20px;
-  background-image: url("chrome://global/skin/icons/info.svg");
-  background-position-x: left 2px;
-  background-position-y: top 2px;
-  background-size: 16px 16px;
-  background-repeat: no-repeat;
-}
-
-#updateSettingCrossUserWarning:-moz-locale-dir(rtl) {
-  background-position-x: right 2px;
 }
 
 richlistitem .text-link {
   color: inherit;
   text-decoration: underline;
 }
 
 richlistitem .text-link:hover {
--- a/browser/themes/shared/preferences/privacy.css
+++ b/browser/themes/shared/preferences/privacy.css
@@ -20,34 +20,22 @@
   margin-inline-end: 0.2em;
 }
 
 .content-blocking-icon,
 .permission-icon,
 .content-blocking-category .checkbox-label-box,
 .extra-information-label > image,
 .arrowhead,
-.content-blocking-info-image,
 .reload-tabs-button,
-.content-blocking-warning-image,
-.fpi-warning-icon {
+.content-blocking-warning-image {
   -moz-context-properties: fill;
   fill: currentColor;
 }
 
-.fpi-warning-icon {
-  /* The target size for this icon is 14px, but to be consistent with the
-     other icons and alignment in the page we use a 20px size with 3px padding */
-  width: 20px;
-  height: 20px;
-  padding: 3px;
-  margin-inline-end: 10px; /* Aligns text with other sections */
-  margin-block-start: 3px;
-}
-
 .content-blocking-icon[disabled] {
   fill: GrayText;
 }
 
 .geo-icon {
   list-style-image: url(chrome://browser/skin/notification-icons/geo.svg);
 }
 
@@ -94,45 +82,42 @@
   fill-opacity: 0.5;
   width: 64px;
   height: 64px;
   margin-inline-end: 10px;
 }
 
 .content-blocking-category,
 #fpiIncompatibilityWarning {
-  border-radius: 4px;
   margin: 3px 0;
-  padding: 9px;
 }
 
 #fpiIncompatibilityWarning {
   background-color: var(--section-highlight-background-color);
 }
 
 #fpiIncompatibilityWarning,
 #contentBlockingCategories {
   margin-top: 16px;
 }
 
 .content-blocking-category {
-  border: 1px solid var(--in-content-box-border-color);
+  border-color: var(--in-content-box-border-color);
 }
 
 .content-blocking-category.disabled {
   opacity: 0.5;
 }
 
 .content-blocking-category.disabled .radio-check {
   opacity: 1;
 }
 
-.content-blocking-warning > .indent,
 .content-blocking-category > .indent {
-  margin-inline-end: 28px;
+  margin-inline-end: 22px;
 }
 
 .arrowhead {
   appearance: none;
   border: none;
   border-radius: 2px;
   min-height: 20px;
   min-width: 20px;
@@ -158,42 +143,33 @@
 
 .content-blocking-category.expanded:not(.selected) .reload-tabs {
   display: none;
 }
 
 .content-blocking-warning.reload-tabs:not([hidden]) {
   display: flex;
   flex-wrap: wrap;
-  /* Match .indent's horizontal padding: */
-  padding-inline: 28px;
 }
 
 .content-blocking-reload-desc-container {
   /* 345px is enough for (almost) twice the size of the default English
    * string at default font sizes. If this and the button do not fit
    * on one line, the button will get wrapped to the next line and this
    * item will stretch to fill all available space. */
   flex: 1 1 345px;
   display: flex;
+  align-self: center;
 }
 
 .content-blocking-reload-description {
   line-height: 1.8em;
   margin-inline-end: 5px;
 }
 
-.content-blocking-reload-desc-container > .content-blocking-info-image {
-  list-style-image: url(chrome://global/skin/icons/info.svg);
-  margin-inline-end: 12px;
-  margin-top: 0.4em;
-  flex-shrink: 0;
-  align-self: start;
-}
-
 .reload-tabs-button {
   max-height: 30px;
   min-height: 30px;
   padding: 0 20px;
   list-style-image: url("chrome://global/skin/icons/reload.svg");
   align-self: center;
 }
 
@@ -201,26 +177,26 @@
   margin: 0 6px;
   color: inherit;
 }
 
 .reload-tabs-button .button-text {
   color: inherit;
 }
 
-.content-blocking-category.expanded:not(.selected) .content-blocking-warning {
-  background-color: var(--in-content-box-info-background);
+.content-blocking-category.selected .content-blocking-warning {
+  background-color: var(--section-highlight-background-color);
 }
 
 .content-blocking-category.selected .arrowhead {
   display: none;
 }
 
 .content-blocking-category.selected {
-  border: 1px solid var(--in-content-accent-color);
+  border-color: var(--in-content-accent-color);
 }
 
 @media (prefers-contrast) {
   .content-blocking-category.selected {
     outline: 2px solid var(--in-content-accent-color);
   }
 }
 
@@ -266,19 +242,18 @@
   margin-bottom: 18px;
 }
 
 .content-blocking-extra-information > .custom-option {
   margin: 10px 0;
 }
 
 .content-blocking-warning {
-  background-color: var(--section-highlight-background-color);
-  border-radius: 4px;
-  padding: 10px 0;
+  /* Match .indent's horizontal padding, minus the border added via .info-box-container: */
+  padding-inline: calc(22px - 1px);
   margin: 10px 0;
 }
 
 .content-blocking-warning:not([hidden]) + .content-blocking-warning {
   margin-top: 0;
 }
 
 .content-blocking-extra-blocking-desc {
@@ -289,46 +264,38 @@
 
 .content-blocking-label {
   display: list-item;
   line-height: 1.2em;
 }
 
 .content-blocking-warning-image {
   list-style-image: url("chrome://global/skin/icons/warning.svg");
-  margin-inline: 4px 8px;
+  margin-inline-end: 6px;
 }
 
 #blockCookiesMenu {
   width: 450px;
 }
 
 #blockCookiesMenu,
 #trackingProtectionMenu {
   margin: 0;
 }
 
 #changeBlockListLink {
   margin-inline-start: 56px;
 }
 
 #telemetry-container {
-  border-radius: 4px;
-  background-color: rgba(12,12,13,0.2);
-  font-size: 85%;
-  padding: 3px;
-  margin-top: 4px;
-  margin-bottom: 4px;
+  margin-block: 4px;
+  line-height: 1.8em;
   width: 100%;
 }
 
-#dataDescriptionBox {
-  line-height: 1.3;
-}
-
 .content-blocking-category-description {
   font-size: 90%;
   opacity: 0.6;
 }
 
 .warning-description {
   background: url(chrome://global/skin/icons/warning.svg) no-repeat 0 5px;
   opacity: 0.6;
@@ -343,15 +310,15 @@
 }
 
 #contentBlockingChangeCookieSettings {
   padding: 0.25em 0.75em;
   margin: 4px 8px;
 }
 
 #deleteOnCloseNote {
-  margin-bottom: 0 !important; /* Overrides .info-panel margin-bottom. */
+  margin-top: 8px;
   margin-inline-end: 32px;
 }
 
 #submitHealthReportBox {
   display: -moz-inline-box;
 }
--- a/build/valgrind/mach_commands.py
+++ b/build/valgrind/mach_commands.py
@@ -7,238 +7,234 @@ from __future__ import absolute_import, 
 import json
 import logging
 import mozinfo
 import os
 
 from mach.decorators import (
     Command,
     CommandArgument,
-    CommandProvider,
 )
 from mozbuild.base import (
-    MachCommandBase,
     MachCommandConditions as conditions,
     BinaryNotFoundException,
 )
 
 
 def is_valgrind_build(cls):
     """Must be a build with --enable-valgrind and --disable-jemalloc."""
     defines = cls.config_environment.defines
     return "MOZ_VALGRIND" in defines and "MOZ_MEMORY" not in defines
 
 
-@CommandProvider
-class MachCommands(MachCommandBase):
-    @Command(
-        "valgrind-test",
-        category="testing",
-        conditions=[conditions.is_firefox_or_thunderbird, is_valgrind_build],
-        description="Run the Valgrind test job (memory-related errors).",
-    )
-    @CommandArgument(
-        "--suppressions",
-        default=[],
-        action="append",
-        metavar="FILENAME",
-        help="Specify a suppression file for Valgrind to use. Use "
-        "--suppression multiple times to specify multiple suppression "
-        "files.",
-    )
-    def valgrind_test(self, command_context, suppressions):
-        """
-        Run Valgrind tests.
-        """
+@Command(
+    "valgrind-test",
+    category="testing",
+    conditions=[conditions.is_firefox_or_thunderbird, is_valgrind_build],
+    description="Run the Valgrind test job (memory-related errors).",
+)
+@CommandArgument(
+    "--suppressions",
+    default=[],
+    action="append",
+    metavar="FILENAME",
+    help="Specify a suppression file for Valgrind to use. Use "
+    "--suppression multiple times to specify multiple suppression "
+    "files.",
+)
+def valgrind_test(command_context, suppressions):
+    """
+    Run Valgrind tests.
+    """
 
-        from mozfile import TemporaryDirectory
-        from mozhttpd import MozHttpd
-        from mozprofile import FirefoxProfile, Preferences
-        from mozprofile.permissions import ServerLocations
-        from mozrunner import FirefoxRunner
-        from mozrunner.utils import findInPath
-        from six import string_types
-        from valgrind.output_handler import OutputHandler
+    from mozfile import TemporaryDirectory
+    from mozhttpd import MozHttpd
+    from mozprofile import FirefoxProfile, Preferences
+    from mozprofile.permissions import ServerLocations
+    from mozrunner import FirefoxRunner
+    from mozrunner.utils import findInPath
+    from six import string_types
+    from valgrind.output_handler import OutputHandler
 
-        build_dir = os.path.join(command_context.topsrcdir, "build")
+    build_dir = os.path.join(command_context.topsrcdir, "build")
 
-        # XXX: currently we just use the PGO inputs for Valgrind runs.  This may
-        # change in the future.
-        httpd = MozHttpd(docroot=os.path.join(build_dir, "pgo"))
-        httpd.start(block=False)
+    # XXX: currently we just use the PGO inputs for Valgrind runs.  This may
+    # change in the future.
+    httpd = MozHttpd(docroot=os.path.join(build_dir, "pgo"))
+    httpd.start(block=False)
 
-        with TemporaryDirectory() as profilePath:
-            # TODO: refactor this into mozprofile
-            profile_data_dir = os.path.join(
-                command_context.topsrcdir, "testing", "profiles"
-            )
-            with open(os.path.join(profile_data_dir, "profiles.json"), "r") as fh:
-                base_profiles = json.load(fh)["valgrind"]
+    with TemporaryDirectory() as profilePath:
+        # TODO: refactor this into mozprofile
+        profile_data_dir = os.path.join(
+            command_context.topsrcdir, "testing", "profiles"
+        )
+        with open(os.path.join(profile_data_dir, "profiles.json"), "r") as fh:
+            base_profiles = json.load(fh)["valgrind"]
 
-            prefpaths = [
-                os.path.join(profile_data_dir, profile, "user.js")
-                for profile in base_profiles
-            ]
-            prefs = {}
-            for path in prefpaths:
-                prefs.update(Preferences.read_prefs(path))
+        prefpaths = [
+            os.path.join(profile_data_dir, profile, "user.js")
+            for profile in base_profiles
+        ]
+        prefs = {}
+        for path in prefpaths:
+            prefs.update(Preferences.read_prefs(path))
 
-            interpolation = {
-                "server": "%s:%d" % httpd.httpd.server_address,
-            }
-            for k, v in prefs.items():
-                if isinstance(v, string_types):
-                    v = v.format(**interpolation)
-                prefs[k] = Preferences.cast(v)
+        interpolation = {
+            "server": "%s:%d" % httpd.httpd.server_address,
+        }
+        for k, v in prefs.items():
+            if isinstance(v, string_types):
+                v = v.format(**interpolation)
+            prefs[k] = Preferences.cast(v)
 
-            quitter = os.path.join(
-                command_context.topsrcdir, "tools", "quitter", "quitter@mozilla.org.xpi"
-            )
+        quitter = os.path.join(
+            command_context.topsrcdir, "tools", "quitter", "quitter@mozilla.org.xpi"
+        )
 
-            locations = ServerLocations()
-            locations.add_host(
-                host="127.0.0.1", port=httpd.httpd.server_port, options="primary"
-            )
+        locations = ServerLocations()
+        locations.add_host(
+            host="127.0.0.1", port=httpd.httpd.server_port, options="primary"
+        )
 
-            profile = FirefoxProfile(
-                profile=profilePath,
-                preferences=prefs,
-                addons=[quitter],
-                locations=locations,
-            )
+        profile = FirefoxProfile(
+            profile=profilePath,
+            preferences=prefs,
+            addons=[quitter],
+            locations=locations,
+        )
 
-            firefox_args = [httpd.get_url()]
+        firefox_args = [httpd.get_url()]
 
-            env = os.environ.copy()
-            env["G_SLICE"] = "always-malloc"
-            env["MOZ_CC_RUN_DURING_SHUTDOWN"] = "1"
-            env["MOZ_CRASHREPORTER_NO_REPORT"] = "1"
-            env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"] = "1"
-            env["XPCOM_DEBUG_BREAK"] = "warn"
+        env = os.environ.copy()
+        env["G_SLICE"] = "always-malloc"
+        env["MOZ_CC_RUN_DURING_SHUTDOWN"] = "1"
+        env["MOZ_CRASHREPORTER_NO_REPORT"] = "1"
+        env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"] = "1"
+        env["XPCOM_DEBUG_BREAK"] = "warn"
 
-            outputHandler = OutputHandler(command_context.log)
-            kp_kwargs = {
-                "processOutputLine": [outputHandler],
-                "universal_newlines": True,
-            }
+        outputHandler = OutputHandler(command_context.log)
+        kp_kwargs = {
+            "processOutputLine": [outputHandler],
+            "universal_newlines": True,
+        }
 
-            valgrind = "valgrind"
-            if not os.path.exists(valgrind):
-                valgrind = findInPath(valgrind)
+        valgrind = "valgrind"
+        if not os.path.exists(valgrind):
+            valgrind = findInPath(valgrind)
 
-            valgrind_args = [
-                valgrind,
-                "--sym-offsets=yes",
-                "--smc-check=all-non-file",
-                "--vex-iropt-register-updates=allregs-at-mem-access",
-                "--gen-suppressions=all",
-                "--num-callers=36",
-                "--leak-check=full",
-                "--show-possibly-lost=no",
-                "--track-origins=yes",
-                "--trace-children=yes",
-                "-v",  # Enable verbosity to get the list of used suppressions
-                # Avoid excessive delays in the presence of spinlocks.
-                # See bug 1309851.
-                "--fair-sched=yes",
-                # Keep debuginfo after library unmap.  See bug 1382280.
-                "--keep-debuginfo=yes",
-                # Reduce noise level on rustc and/or LLVM compiled code.
-                # See bug 1365915
-                "--expensive-definedness-checks=yes",
-                # Compensate for the compiler inlining `new` but not `delete`
-                # or vice versa.
-                "--show-mismatched-frees=no",
-            ]
+        valgrind_args = [
+            valgrind,
+            "--sym-offsets=yes",
+            "--smc-check=all-non-file",
+            "--vex-iropt-register-updates=allregs-at-mem-access",
+            "--gen-suppressions=all",
+            "--num-callers=36",
+            "--leak-check=full",
+            "--show-possibly-lost=no",
+            "--track-origins=yes",
+            "--trace-children=yes",
+            "-v",  # Enable verbosity to get the list of used suppressions
+            # Avoid excessive delays in the presence of spinlocks.
+            # See bug 1309851.
+            "--fair-sched=yes",
+            # Keep debuginfo after library unmap.  See bug 1382280.
+            "--keep-debuginfo=yes",
+            # Reduce noise level on rustc and/or LLVM compiled code.
+            # See bug 1365915
+            "--expensive-definedness-checks=yes",
+            # Compensate for the compiler inlining `new` but not `delete`
+            # or vice versa.
+            "--show-mismatched-frees=no",
+        ]
+
+        for s in suppressions:
+            valgrind_args.append("--suppressions=" + s)
+
+        supps_dir = os.path.join(build_dir, "valgrind")
+        supps_file1 = os.path.join(supps_dir, "cross-architecture.sup")
+        valgrind_args.append("--suppressions=" + supps_file1)
 
-            for s in suppressions:
-                valgrind_args.append("--suppressions=" + s)
-
-            supps_dir = os.path.join(build_dir, "valgrind")
-            supps_file1 = os.path.join(supps_dir, "cross-architecture.sup")
-            valgrind_args.append("--suppressions=" + supps_file1)
+        if mozinfo.os == "linux":
+            machtype = {
+                "x86_64": "x86_64-pc-linux-gnu",
+                "x86": "i386-pc-linux-gnu",
+            }.get(mozinfo.processor)
+            if machtype:
+                supps_file2 = os.path.join(supps_dir, machtype + ".sup")
+                if os.path.isfile(supps_file2):
+                    valgrind_args.append("--suppressions=" + supps_file2)
 
-            if mozinfo.os == "linux":
-                machtype = {
-                    "x86_64": "x86_64-pc-linux-gnu",
-                    "x86": "i386-pc-linux-gnu",
-                }.get(mozinfo.processor)
-                if machtype:
-                    supps_file2 = os.path.join(supps_dir, machtype + ".sup")
-                    if os.path.isfile(supps_file2):
-                        valgrind_args.append("--suppressions=" + supps_file2)
-
-            exitcode = None
-            timeout = 1800
-            binary_not_found_exception = None
-            try:
-                runner = FirefoxRunner(
-                    profile=profile,
-                    binary=command_context.get_binary_path(),
-                    cmdargs=firefox_args,
-                    env=env,
-                    process_args=kp_kwargs,
+        exitcode = None
+        timeout = 1800
+        binary_not_found_exception = None
+        try:
+            runner = FirefoxRunner(
+                profile=profile,
+                binary=command_context.get_binary_path(),
+                cmdargs=firefox_args,
+                env=env,
+                process_args=kp_kwargs,
+            )
+            runner.start(debug_args=valgrind_args)
+            exitcode = runner.wait(timeout=timeout)
+        except BinaryNotFoundException as e:
+            binary_not_found_exception = e
+        finally:
+            errs = outputHandler.error_count
+            supps = outputHandler.suppression_count
+            if errs != supps:
+                status = 1  # turns the TBPL job orange
+                command_context.log(
+                    logging.ERROR,
+                    "valgrind-fail-parsing",
+                    {"errs": errs, "supps": supps},
+                    "TEST-UNEXPECTED-FAIL | valgrind-test | error parsing: {errs} errors "
+                    "seen, but {supps} generated suppressions seen",
                 )
-                runner.start(debug_args=valgrind_args)
-                exitcode = runner.wait(timeout=timeout)
-            except BinaryNotFoundException as e:
-                binary_not_found_exception = e
-            finally:
-                errs = outputHandler.error_count
-                supps = outputHandler.suppression_count
-                if errs != supps:
-                    status = 1  # turns the TBPL job orange
-                    command_context.log(
-                        logging.ERROR,
-                        "valgrind-fail-parsing",
-                        {"errs": errs, "supps": supps},
-                        "TEST-UNEXPECTED-FAIL | valgrind-test | error parsing: {errs} errors "
-                        "seen, but {supps} generated suppressions seen",
-                    )
 
-                elif errs == 0:
-                    status = 0
-                    command_context.log(
-                        logging.INFO,
-                        "valgrind-pass",
-                        {},
-                        "TEST-PASS | valgrind-test | valgrind found no errors",
-                    )
-                else:
-                    status = 1  # turns the TBPL job orange
-                    # We've already printed details of the errors.
+            elif errs == 0:
+                status = 0
+                command_context.log(
+                    logging.INFO,
+                    "valgrind-pass",
+                    {},
+                    "TEST-PASS | valgrind-test | valgrind found no errors",
+                )
+            else:
+                status = 1  # turns the TBPL job orange
+                # We've already printed details of the errors.
 
-                if binary_not_found_exception:
-                    status = 2  # turns the TBPL job red
-                    command_context.log(
-                        logging.ERROR,
-                        "valgrind-fail-errors",
-                        {"error": str(binary_not_found_exception)},
-                        "TEST-UNEXPECTED-FAIL | valgrind-test | {error}",
-                    )
-                    command_context.log(
-                        logging.INFO,
-                        "valgrind-fail-errors",
-                        {"help": binary_not_found_exception.help()},
-                        "{help}",
-                    )
-                elif exitcode is None:
-                    status = 2  # turns the TBPL job red
-                    command_context.log(
-                        logging.ERROR,
-                        "valgrind-fail-timeout",
-                        {"timeout": timeout},
-                        "TEST-UNEXPECTED-FAIL | valgrind-test | Valgrind timed out "
-                        "(reached {timeout} second limit)",
-                    )
-                elif exitcode != 0:
-                    status = 2  # turns the TBPL job red
-                    command_context.log(
-                        logging.ERROR,
-                        "valgrind-fail-errors",
-                        {"exitcode": exitcode},
-                        "TEST-UNEXPECTED-FAIL | valgrind-test | non-zero exit code "
-                        "from Valgrind: {exitcode}",
-                    )
+            if binary_not_found_exception:
+                status = 2  # turns the TBPL job red
+                command_context.log(
+                    logging.ERROR,
+                    "valgrind-fail-errors",
+                    {"error": str(binary_not_found_exception)},
+                    "TEST-UNEXPECTED-FAIL | valgrind-test | {error}",
+                )
+                command_context.log(
+                    logging.INFO,
+                    "valgrind-fail-errors",
+                    {"help": binary_not_found_exception.help()},
+                    "{help}",
+                )
+            elif exitcode is None:
+                status = 2  # turns the TBPL job red
+                command_context.log(
+                    logging.ERROR,
+                    "valgrind-fail-timeout",
+                    {"timeout": timeout},
+                    "TEST-UNEXPECTED-FAIL | valgrind-test | Valgrind timed out "
+                    "(reached {timeout} second limit)",
+                )
+            elif exitcode != 0:
+                status = 2  # turns the TBPL job red
+                command_context.log(
+                    logging.ERROR,
+                    "valgrind-fail-errors",
+                    {"exitcode": exitcode},
+                    "TEST-UNEXPECTED-FAIL | valgrind-test | non-zero exit code "
+                    "from Valgrind: {exitcode}",
+                )
 
-                httpd.stop()
+            httpd.stop()
 
-            return status
+        return status
--- a/caps/DomainPolicy.cpp
+++ b/caps/DomainPolicy.cpp
@@ -3,16 +3,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "DomainPolicy.h"
 #include "mozilla/dom/ContentParent.h"
 #include "mozilla/ipc/URIUtils.h"
 #include "mozilla/Unused.h"
+#include "nsIURIMutator.h"
 #include "nsScriptSecurityManager.h"
 
 namespace mozilla {
 
 using namespace ipc;
 using namespace dom;
 
 NS_IMPL_ISUPPORTS(DomainPolicy, nsIDomainPolicy)
--- a/caps/ExpandedPrincipal.cpp
+++ b/caps/ExpandedPrincipal.cpp
@@ -4,16 +4,17 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "ExpandedPrincipal.h"
 #include "nsIClassInfoImpl.h"
 #include "nsIObjectInputStream.h"
 #include "nsReadableUtils.h"
 #include "mozilla/Base64.h"
+#include "json/json.h"
 
 using namespace mozilla;
 
 NS_IMPL_CLASSINFO(ExpandedPrincipal, nullptr, nsIClassInfo::MAIN_THREAD_ONLY,
                   NS_EXPANDEDPRINCIPAL_CID)
 NS_IMPL_QUERY_INTERFACE_CI(ExpandedPrincipal, nsIPrincipal,
                            nsIExpandedPrincipal)
 NS_IMPL_CI_INTERFACE_GETTER(ExpandedPrincipal, nsIPrincipal,
--- a/caps/OriginAttributes.cpp
+++ b/caps/OriginAttributes.cpp
@@ -6,16 +6,18 @@
 
 #include "mozilla/OriginAttributes.h"
 #include "mozilla/Assertions.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/dom/BlobURLProtocolHandler.h"
 #include "mozilla/dom/quota/QuotaManager.h"
 #include "nsIEffectiveTLDService.h"
 #include "nsIURI.h"
+#include "nsNetCID.h"
+#include "nsNetUtil.h"
 #include "nsURLHelper.h"
 
 static const char kSourceChar = ':';
 static const char kSanitizedChar = '+';
 
 namespace mozilla {
 
 static void MakeTopLevelInfo(const nsACString& aScheme, const nsACString& aHost,
--- a/caps/moz.build
+++ b/caps/moz.build
@@ -72,10 +72,8 @@ if CONFIG["ENABLE_TESTS"]:
     DIRS += ["tests/gtest"]
 
 include("/ipc/chromium/chromium-config.mozbuild")
 
 FINAL_LIBRARY = "xul"
 
 with Files("**"):
     BUG_COMPONENT = ("Core", "Security: CAPS")
-
-REQUIRES_UNIFIED_BUILD = True
--- a/caps/nsJSPrincipals.cpp
+++ b/caps/nsJSPrincipals.cpp
@@ -7,24 +7,27 @@
 #include "xpcpublic.h"
 #include "nsString.h"
 #include "nsJSPrincipals.h"
 #include "plstr.h"
 #include "nsCOMPtr.h"
 #include "nsMemory.h"
 #include "nsStringBuffer.h"
 #include "mozilla/BasePrincipal.h"
+#include "mozilla/StaticPtr.h"
 #include "mozilla/dom/StructuredCloneTags.h"
 // for mozilla::dom::workerinternals::kJSPrincipalsDebugToken
 #include "mozilla/dom/workerinternals/JSSettings.h"
 // for mozilla::dom::worklet::kJSPrincipalsDebugToken
 #include "mozilla/dom/WorkletPrincipals.h"
 #include "mozilla/ipc/BackgroundUtils.h"
+#include "mozilla/ipc/PBackgroundSharedTypes.h"
 
 using namespace mozilla;
+using namespace mozilla::dom;
 using namespace mozilla::ipc;
 
 NS_IMETHODIMP_(MozExternalRefCountType)
 nsJSPrincipals::AddRef() {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(int32_t(refcount) >= 0, "illegal refcnt");
   nsrefcnt count = ++refcount;
   NS_LOG_ADDREF(this, count, "nsJSPrincipals", sizeof(*this));
--- a/caps/nsScriptSecurityManager.cpp
+++ b/caps/nsScriptSecurityManager.cpp
@@ -43,30 +43,32 @@
 #include "nsIDocShell.h"
 #include "nsIConsoleService.h"
 #include "nsIOService.h"
 #include "nsIContent.h"
 #include "nsDOMJSUtils.h"
 #include "nsAboutProtocolUtils.h"
 #include "nsIClassInfo.h"
 #include "nsIURIFixup.h"
+#include "nsIURIMutator.h"
 #include "nsIChromeRegistry.h"
 #include "nsIResProtocolHandler.h"
 #include "nsIContentSecurityPolicy.h"
 #include "mozilla/Components.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/dom/BindingUtils.h"
 #include "mozilla/NullPrincipal.h"
 #include <stdint.h>
 #include "mozilla/dom/ContentChild.h"
 #include "mozilla/dom/ContentParent.h"
 #include "mozilla/dom/Exceptions.h"
 #include "mozilla/dom/nsCSPContext.h"
 #include "mozilla/dom/ScriptSettings.h"
 #include "mozilla/ClearOnShutdown.h"
+#include "mozilla/ExtensionPolicyService.h"
 #include "mozilla/ResultExtensions.h"
 #include "mozilla/StaticPtr.h"
 #include "mozilla/dom/WorkerCommon.h"
 #include "mozilla/dom/WorkerPrivate.h"
 #include "nsContentUtils.h"
 #include "nsJSUtils.h"
 #include "nsILoadInfo.h"
 
--- a/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-sources.js
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-sources.js
@@ -24,19 +24,23 @@ add_task(async function() {
   info("Expands the main root node");
   await expandAllSourceNodes(dbg, rootNodes[0]);
 
   // We need to assert the actual DOM nodes in the source tree, because the
   // state can contain simple1.js and simple2.js, but only show one of them.
   info("Waiting for simple1.js from example.com (parent page)");
   await waitUntil(() => findSourceNodeWithText(dbg, "simple1.js"));
 
-  // If fission is enabled, the second source is under another root node.
-  if (isFissionEnabled()) {
-    is(rootNodes.length, 2, "Found 2 sourceview root nodes when fission is on");
+  // If fission or EFT is enabled, the second source is under another root node.
+  if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
+    is(
+      rootNodes.length,
+      2,
+      "Found 2 sourceview root nodes when iframe has dedicated target"
+    );
 
     info("Expands the remote frame root node");
     await expandAllSourceNodes(dbg, rootNodes[1]);
   }
 
   info("Waiting for simple2.js from example.org (frame)");
   await waitUntil(() => findSourceNodeWithText(dbg, "simple2.js"));
 
--- a/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay-iframe.js
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay-iframe.js
@@ -31,18 +31,18 @@ add_task(async function() {
     SpecialPowers.spawn(iframe, [], () => {
       return content.wrappedJSObject.foo();
     });
   });
   await waitFor(() => isPaused(dbg), "Wait for the debugger to pause");
   ok(true, "debugger is paused");
 
   let highlighterTestFront;
-  if (isFissionEnabled()) {
-    // We need to retrieve the highlighterTestFront for the remote frame target.
+  if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
+    // We need to retrieve the highlighterTestFront for the frame target.
     const iframeTarget = commands.targetCommand
       .getAllTargets([commands.targetCommand.TYPES.FRAME])
       .find(target => target.url.includes("example.org"));
     highlighterTestFront = await iframeTarget.getFront("highlighterTest");
   } else {
     // When fission is disabled, we don't have a dedicated target for the remote frame.
     // In this case, the overlay is displayed by the top-level target anyway, so we can
     // get the corresponding highlighter test front.
--- a/devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js
@@ -7,141 +7,198 @@
 
 "use strict";
 
 const IFRAME_TEST_COM_URI =
   `http://example.com/document-builder.sjs?html=` +
   encodeURI(`<script>const a=2;\ndebugger;\nconsole.log(a);</script>`);
 
 // Embed the example.com test page in an example.org iframe.
-const IFRAME_TEST_URI = `http://example.org/document-builder.sjs?html=` +
-  encodeURI(`<script>function breakDebugger() {const b=3;\ndebugger;\nconsole.log(b);}</script><iframe src="${IFRAME_TEST_COM_URI}"></iframe><body>`);
+const IFRAME_TEST_URI =
+  `http://example.org/document-builder.sjs?html=` +
+  encodeURI(
+    `<script>function breakDebugger() {const b=3;\ndebugger;\nconsole.log(b);}</script><iframe src="${IFRAME_TEST_COM_URI}"></iframe><body>`
+  );
 
 add_task(async function() {
   info("Test a debugger statement from the top level document");
 
   // Make sure the toolbox opens with the webconsole initially selected.
   const toolbox = await initPane("doc-debugger-statements.html", "webconsole");
-  
+
   info("Execute a debugger statement");
-  const pausedRun = SpecialPowers.spawn(gBrowser.selectedBrowser, [], function() {
-    content.wrappedJSObject.test();
-  });
+  const pausedRun = SpecialPowers.spawn(
+    gBrowser.selectedBrowser,
+    [],
+    function() {
+      content.wrappedJSObject.test();
+    }
+  );
 
   const dbg = await assertDebuggerIsHighlightedAndPaused(toolbox);
   const source = findSource(dbg, "doc-debugger-statements.html");
   assertPausedAtSourceAndLine(dbg, source.id, 16);
 
   await resume(dbg);
   info("Wait for the paused code to complete after resume");
   await pausedRun;
 
-  ok(!toolbox.isHighlighted("jsdebugger"), "Debugger is no longer highlighted after resume");
+  ok(
+    !toolbox.isHighlighted("jsdebugger"),
+    "Debugger is no longer highlighted after resume"
+  );
 });
 
 add_task(async function() {
   info("Test a debugger statement from an iframe");
 
   // Make sure the toolbox opens with the webconsole initially selected.
   const toolbox = await openNewTabAndToolbox(IFRAME_TEST_URI, "webconsole");
-  
-  info("Reload the test page, which will trigger the debugger statement in the iframe");
+
+  info(
+    "Reload the test page, which will trigger the debugger statement in the iframe"
+  );
   const pausedReload = reloadBrowser();
 
   const dbg = await assertDebuggerIsHighlightedAndPaused(toolbox);
   const source = findSource(dbg, IFRAME_TEST_COM_URI);
   assertPausedAtSourceAndLine(dbg, source.id, 2);
 
   await resume(dbg);
   info("Wait for the paused code to complete after resume");
   await pausedReload;
 
-  ok(!toolbox.isHighlighted("jsdebugger"), "Debugger is no longer highlighted after resume");
+  ok(
+    !toolbox.isHighlighted("jsdebugger"),
+    "Debugger is no longer highlighted after resume"
+  );
 });
 
 add_task(async function() {
   info("Test pausing from two distinct targets");
 
   // Make sure the toolbox opens with the webconsole initially selected.
   const toolbox = await openNewTabAndToolbox(IFRAME_TEST_URI, "webconsole");
-  
-  info("Reload the test page, which will trigger the debugger statement in the iframe");
+
+  info(
+    "Reload the test page, which will trigger the debugger statement in the iframe"
+  );
   const pausedReload = reloadBrowser();
 
   const dbg = await assertDebuggerIsHighlightedAndPaused(toolbox);
-  const topLevelThread= toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+  const topLevelThread =
+    toolbox.commands.targetCommand.targetFront.threadFront.actorID;
   const iframeThread = dbg.selectors.getCurrentThread();
-  if (isFissionEnabled()) {
-    isnot(topLevelThread, iframeThread, "With fission, we get two distinct threads and could pause two times");
-    ok(!dbg.selectors.getIsPaused(topLevelThread), "The top level document thread is not paused");
-    ok(dbg.selectors.getIsPaused(iframeThread), "Only the iframe thread is paused");
+  if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
+    isnot(
+      topLevelThread,
+      iframeThread,
+      "With fission/EFT, we get two distinct threads and could pause two times"
+    );
+    ok(
+      !dbg.selectors.getIsPaused(topLevelThread),
+      "The top level document thread is not paused"
+    );
+    ok(
+      dbg.selectors.getIsPaused(iframeThread),
+      "Only the iframe thread is paused"
+    );
   } else {
-    is(topLevelThread, iframeThread, "Without fission, we get a unique thread and we won't pause when calling top document code");
+    is(
+      topLevelThread,
+      iframeThread,
+      "Without fission/EFT, we get a unique thread and we won't pause when calling top document code"
+    );
   }
   const source = findSource(dbg, IFRAME_TEST_COM_URI);
   assertPausedAtSourceAndLine(dbg, source.id, 2);
 
-  info("Step over to the next line")
+  info("Step over to the next line");
   await stepOver(dbg);
   assertPausedAtSourceAndLine(dbg, source.id, 3);
 
   info("Now execute a debugger statement in the top level target");
   const onPaused = waitForPausedThread(dbg, topLevelThread);
-  const pausedTopTarget = SpecialPowers.spawn(gBrowser.selectedBrowser, [], function() {
-    content.wrappedJSObject.breakDebugger();
-  });
+  const pausedTopTarget = SpecialPowers.spawn(
+    gBrowser.selectedBrowser,
+    [],
+    function() {
+      content.wrappedJSObject.breakDebugger();
+    }
+  );
 
-  if (isFissionEnabled()) {
+  if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
     info("Wait for the top level target to be paused");
     await onPaused;
     // also use waitForPause to wait for UI updates
     await waitForPaused(dbg);
 
-    ok(dbg.selectors.getIsPaused(topLevelThread), "The top level document thread is paused");
+    ok(
+      dbg.selectors.getIsPaused(topLevelThread),
+      "The top level document thread is paused"
+    );
     ok(dbg.selectors.getIsPaused(iframeThread), "The iframe thread is paused");
 
-    ok(toolbox.isHighlighted("jsdebugger"), "Debugger stays highlighted when pausing on another thread");
+    ok(
+      toolbox.isHighlighted("jsdebugger"),
+      "Debugger stays highlighted when pausing on another thread"
+    );
 
-    info("The new paused state refers to the latest breakpoint being hit, on the top level target");
+    info(
+      "The new paused state refers to the latest breakpoint being hit, on the top level target"
+    );
     const source2 = findSource(dbg, IFRAME_TEST_URI);
     assertPausedAtSourceAndLine(dbg, source2.id, 2);
 
     info("Resume the top level target");
     await resume(dbg);
 
     info("Wait for top level target paused code to complete after resume");
     await pausedTopTarget;
 
-    info("By default we stay on the last selected thread on resume and so the current thread is no longer paused");
+    info(
+      "By default we stay on the last selected thread on resume and so the current thread is no longer paused"
+    );
     assertNotPaused(dbg);
-    ok(toolbox.isHighlighted("jsdebugger"), "Debugger stays highlighted when resuming only the top level target");
+    ok(
+      toolbox.isHighlighted("jsdebugger"),
+      "Debugger stays highlighted when resuming only the top level target"
+    );
 
-    info("Re-select the iframe thread, which is still paused on the original breakpoint");
+    info(
+      "Re-select the iframe thread, which is still paused on the original breakpoint"
+    );
     dbg.actions.selectThread(getContext(dbg), iframeThread);
     await waitForPausedThread(dbg, iframeThread);
     assertPausedAtSourceAndLine(dbg, source.id, 3);
 
     info("Resume the iframe target");
     await resume(dbg);
     assertNotPaused(dbg);
 
     info("Wait for the paused code in the iframe to complete after resume");
     await pausedReload;
 
-    await waitUntil(() => !toolbox.isHighlighted("jsdebugger"))
-    ok(true, "Debugger is no longer highlighted after resuming all the paused targets");
+    await waitUntil(() => !toolbox.isHighlighted("jsdebugger"));
+    ok(
+      true,
+      "Debugger is no longer highlighted after resuming all the paused targets"
+    );
   } else {
-    info("Without fission, the iframe thread is the same as top document and doesn't pause. So wait for its resolution.");
+    info(
+      "Without fission/EFT, the iframe thread is the same as top document and doesn't pause. So wait for its resolution."
+    );
     await pausedTopTarget;
   }
 
   info("Resume the last paused thread");
   await resume(dbg);
   assertNotPaused(dbg);
 
   info("Wait for the paused code in the iframe to complete after resume");
   await pausedReload;
 
-  await waitUntil(() => !toolbox.isHighlighted("jsdebugger"))
-  ok(true, "Debugger is no longer highlighted after resuming all the paused targets");
-
-
+  await waitUntil(() => !toolbox.isHighlighted("jsdebugger"));
+  ok(
+    true,
+    "Debugger is no longer highlighted after resuming all the paused targets"
+  );
 });
--- a/devtools/client/inspector/node-picker.js
+++ b/devtools/client/inspector/node-picker.js
@@ -96,17 +96,17 @@ class NodePicker extends EventEmitter {
    * picking mode and remove all event listeners associated with node picking.
    *
    * @param {InspectorFront} inspectorFront
    * @param {Boolean} isDestroyCodePath
    *        Optional. If true, we assume that's when the toolbox closes
    *        and we should avoid doing any RDP request.
    * @return {Promise}
    */
-  async _onInspectorFrontDestroyed(inspectorFront, { isDestroyCodepath }) {
+  async _onInspectorFrontDestroyed(inspectorFront, { isDestroyCodepath } = {}) {
     this._currentInspectorFronts.delete(inspectorFront);
 
     const { walker } = inspectorFront;
     if (!walker) {
       return;
     }
 
     walker.off("picker-node-hovered", this._onHovered);
--- a/devtools/client/shared/test/shared-head.js
+++ b/devtools/client/shared/test/shared-head.js
@@ -780,16 +780,23 @@ async function createAndAttachTargetForT
 function isFissionEnabled() {
   return SpecialPowers.useRemoteSubframes;
 }
 
 function isServerTargetSwitchingEnabled() {
   return Services.prefs.getBoolPref(TARGET_SWITCHING_PREF);
 }
 
+function isEveryFrameTargetEnabled() {
+  return Services.prefs.getBoolPref(
+    "devtools.every-frame-target.enabled",
+    false
+  );
+}
+
 /**
  * Open the inspector in a tab with given URL.
  * @param {string} url  The URL to open.
  * @param {String} hostType Optional hostType, as defined in Toolbox.HostType
  * @return A promise that is resolved once the tab and inspector have loaded
  *         with an object: { tab, toolbox, inspector, highlighterTestFront }.
  */
 var openInspectorForURL = async function(url, hostType) {
--- a/devtools/client/webconsole/test/node/mocha-test-setup.js
+++ b/devtools/client/webconsole/test/node/mocha-test-setup.js
@@ -9,17 +9,18 @@ require("@babel/register")({
   // by default everything is ignored
   ignore: [/node_modules/],
 });
 
 const mcRoot = `${__dirname}/../../../../../`;
 const getModule = mcPath =>
   `module.exports = require("${(mcRoot + mcPath).replace(/\\/gi, "/")}");`;
 
-const { pref } = require("devtools-services");
+const { pref } = require(mcRoot +
+  "devtools/client/shared/test-helpers/jest-fixtures/Services");
 pref("devtools.debugger.remote-timeout", 10000);
 pref("devtools.hud.loglimit", 10000);
 pref("devtools.webconsole.filter.error", true);
 pref("devtools.webconsole.filter.warn", true);
 pref("devtools.webconsole.filter.info", true);
 pref("devtools.webconsole.filter.log", true);
 pref("devtools.webconsole.filter.debug", true);
 pref("devtools.webconsole.filter.css", false);
@@ -124,31 +125,32 @@ requireHacker.global_hook("default", (pa
       ),
 
     chrome: () =>
       `module.exports = { Cc: {}, Ci: {}, Cu: { now: () => {}}, components: {stack: {caller: ""}} }`,
     ChromeUtils: () =>
       `module.exports = { addProfilerMarker: () => {}, import: () => ({}) }`,
     // Some modules depend on Chrome APIs which don't work in mocha. When such a module
     // is required, replace it with a mock version.
-    Services: () => `module.exports = require("devtools-services")`,
+    Services: () =>
+      getModule("devtools/client/shared/test-helpers/jest-fixtures/Services"),
     "devtools/server/devtools-server": () =>
       `module.exports = {DevToolsServer: {}}`,
     "devtools/client/shared/components/SmartTrace": () =>
       "module.exports = () => null;",
     "devtools/client/netmonitor/src/components/TabboxPanel": () => "{}",
     "devtools/client/webconsole/utils/context-menu": () => "{}",
     "devtools/client/shared/telemetry": () => `module.exports = function() {
       this.recordEvent = () => {};
       this.getKeyedHistogramById = () => ({add: () => {}});
     }`,
-    "devtools/shared/event-emitter": () =>
-      `module.exports = require("devtools-modules/src/utils/event-emitter")`,
     "devtools/client/shared/unicode-url": () =>
-      `module.exports = require("devtools-modules/src/unicode-url")`,
+      getModule(
+        "devtools/client/shared/test-helpers/jest-fixtures/unicode-url"
+      ),
     "devtools/shared/DevToolsUtils": () =>
       getModule("devtools/client/webconsole/test/node/fixtures/DevToolsUtils"),
     "devtools/server/actors/reflow": () => "{}",
     "devtools/shared/layout/utils": () => "{getCurrentZoom = () => {}}",
     "resource://gre/modules/AppConstants.jsm": () => "module.exports = {};",
     "devtools/client/framework/devtools": () => `module.exports = {
       gDevTools: {}
     };`,
--- a/devtools/client/webconsole/test/node/package.json
+++ b/devtools/client/webconsole/test/node/package.json
@@ -16,18 +16,16 @@
   },
   "dependencies": {
     "@babel/core": "^7.8.7",
     "@babel/plugin-proposal-class-properties": "7.10.4",
     "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
     "@babel/plugin-proposal-optional-chaining": "^7.8.3",
     "@babel/register": "^7.8.6",
     "babel-plugin-transform-amd-to-commonjs": "1.4.0",
-    "devtools-modules": "0.0.37",
-    "devtools-services": "^0.0.3",
     "enzyme": "^3.3.0",
     "enzyme-adapter-react-16": "^1.1.1",
     "expect": "^1.16.0",
     "jsdom": "^9.4.1",
     "jsdom-global": "^2.0.0",
     "mocha": "^5.0.1",
     "mock-local-storage": "^1.0.5",
     "require-hacker": "^2.1.4",
--- a/devtools/client/webconsole/test/node/yarn.lock
+++ b/devtools/client/webconsole/test/node/yarn.lock
@@ -348,308 +348,89 @@ ajv@^6.5.5:
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7"
   integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
   dependencies:
     fast-deep-equal "^3.1.1"
     fast-json-stable-stringify "^2.0.0"
     json-schema-traverse "^0.4.1"
     uri-js "^4.2.2"
 
-ansi-escapes@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
-  integrity sha1-06ioOzGapneTZisT52HHkRQiMG4=
-
-ansi-regex@^2.0.0, ansi-regex@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
-  integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
-
-ansi-styles@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
-  integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
-
-ansi-styles@^3.0.0, ansi-styles@^3.2.1:
+ansi-styles@^3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
   integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
   dependencies:
     color-convert "^1.9.0"
 
-anymatch@^1.3.0:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
-  integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==
-  dependencies:
-    micromatch "^2.1.5"
-    normalize-path "^2.0.0"
-
-append-transform@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
-  integrity sha1-126/jKlNJ24keja61EpLdKthGZE=
-  dependencies:
-    default-require-extensions "^1.0.0"
-
-argparse@^1.0.7:
-  version "1.0.10"
-  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
-  integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
-  dependencies:
-    sprintf-js "~1.0.2"
-
-arr-diff@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
-  integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=
-  dependencies:
-    arr-flatten "^1.0.1"
-
-arr-flatten@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
-  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
-
 array-equal@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
   integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
 
 array-filter@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83"
   integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=
 
-array-unique@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
-  integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=
-
 array.prototype.find@^2.1.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c"
   integrity sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.4"
 
 array.prototype.flat@^1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
   integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.0-next.1"
 
-arrify@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
-  integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
-
 asn1@~0.2.3:
   version "0.2.4"
   resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
   integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
   dependencies:
     safer-buffer "~2.1.0"
 
 assert-plus@1.0.0, assert-plus@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
   integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
 
-async@^2.1.4:
-  version "2.6.3"
-  resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
-  integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
-  dependencies:
-    lodash "^4.17.14"
-
 asynckit@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
   integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
 
 aws-sign2@~0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
   integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
 
 aws4@^1.8.0:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e"
   integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
 
-babel-code-frame@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
-  integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
-  dependencies:
-    chalk "^1.1.3"
-    esutils "^2.0.2"
-    js-tokens "^3.0.2"
-
-babel-core@^6.0.0, babel-core@^6.26.0:
-  version "6.26.3"
-  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
-  integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
-  dependencies:
-    babel-code-frame "^6.26.0"
-    babel-generator "^6.26.0"
-    babel-helpers "^6.24.1"
-    babel-messages "^6.23.0"
-    babel-register "^6.26.0"
-    babel-runtime "^6.26.0"
-    babel-template "^6.26.0"
-    babel-traverse "^6.26.0"
-    babel-types "^6.26.0"
-    babylon "^6.18.0"
-    convert-source-map "^1.5.1"
-    debug "^2.6.9"
-    json5 "^0.5.1"
-    lodash "^4.17.4"
-    minimatch "^3.0.4"
-    path-is-absolute "^1.0.1"
-    private "^0.1.8"
-    slash "^1.0.0"
-    source-map "^0.5.7"
-
-babel-generator@^6.18.0, babel-generator@^6.26.0:
-  version "6.26.1"
-  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
-  integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
-  dependencies:
-    babel-messages "^6.23.0"
-    babel-runtime "^6.26.0"
-    babel-types "^6.26.0"
-    detect-indent "^4.0.0"
-    jsesc "^1.3.0"
-    lodash "^4.17.4"
-    source-map "^0.5.7"
-    trim-right "^1.0.1"
-
-babel-helpers@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
-  integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-template "^6.24.1"
-
-babel-jest@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671"
-  integrity sha1-5KA7E9wQOJ4UD8ZF0J/8TO0wFnE=
-  dependencies:
-    babel-core "^6.0.0"
-    babel-plugin-istanbul "^4.0.0"
-    babel-preset-jest "^20.0.3"
-
-babel-messages@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
-  integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
-  dependencies:
-    babel-runtime "^6.22.0"
-
-babel-plugin-istanbul@^4.0.0:
-  version "4.1.6"
-  resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45"
-  integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==
-  dependencies:
-    babel-plugin-syntax-object-rest-spread "^6.13.0"
-    find-up "^2.1.0"
-    istanbul-lib-instrument "^1.10.1"
-    test-exclude "^4.2.1"
-
-babel-plugin-jest-hoist@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767"
-  integrity sha1-r+3IU70/jcNUjqZx++adA8wsF2c=
-
-babel-plugin-syntax-object-rest-spread@^6.13.0:
-  version "6.13.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
-  integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
-
 babel-plugin-transform-amd-to-commonjs@1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-amd-to-commonjs/-/babel-plugin-transform-amd-to-commonjs-1.4.0.tgz#d9bc5003eaa26dbdd4e854e453f84903852af2ca"
   integrity sha512-Xx0kYPn0LPyms+8n2KLn9yd2R5XMb2P1sNe4qn64/UQY5F2KFYlhhhyYUNm/BThfODAzl7rbaOsEfpU2M8iDKQ==
 
-babel-preset-jest@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a"
-  integrity sha1-y6yq3stdaJyh4d4TYOv8ZoYsF4o=
-  dependencies:
-    babel-plugin-jest-hoist "^20.0.3"
-
-babel-register@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
-  integrity sha1-btAhFz4vy0htestFxgCahW9kcHE=
-  dependencies:
-    babel-core "^6.26.0"
-    babel-runtime "^6.26.0"
-    core-js "^2.5.0"
-    home-or-tmp "^2.0.0"
-    lodash "^4.17.4"
-    mkdirp "^0.5.1"
-    source-map-support "^0.4.15"
-
-babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.6.1:
+babel-runtime@^6.6.1:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
   integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
   dependencies:
     core-js "^2.4.0"
     regenerator-runtime "^0.11.0"
 
-babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
-  integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
-  dependencies:
-    babel-runtime "^6.26.0"
-    babel-traverse "^6.26.0"
-    babel-types "^6.26.0"
-    babylon "^6.18.0"
-    lodash "^4.17.4"
-
-babel-traverse@^6.18.0, babel-traverse@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
-  integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
-  dependencies:
-    babel-code-frame "^6.26.0"
-    babel-messages "^6.23.0"
-    babel-runtime "^6.26.0"
-    babel-types "^6.26.0"
-    babylon "^6.18.0"
-    debug "^2.6.8"
-    globals "^9.18.0"
-    invariant "^2.2.2"
-    lodash "^4.17.4"
-
-babel-types@^6.18.0, babel-types@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
-  integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
-  dependencies:
-    babel-runtime "^6.26.0"
-    esutils "^2.0.2"
-    lodash "^4.17.4"
-    to-fast-properties "^1.0.3"
-
-babylon@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
-  integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
-
 balanced-match@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
   integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
 
 bcrypt-pbkdf@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -665,87 +446,31 @@ boolbase@~1.0.0:
 brace-expansion@^1.1.7:
   version "1.1.11"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
   integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
   dependencies:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
 
-braces@^1.8.2:
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
-  integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=
-  dependencies:
-    expand-range "^1.8.1"
-    preserve "^0.2.0"
-    repeat-element "^1.1.2"
-
-browser-resolve@^1.11.2:
-  version "1.11.3"
-  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
-  integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
-  dependencies:
-    resolve "1.1.7"
-
 browser-stdout@1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
   integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
 
-bser@1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169"
-  integrity sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=
-  dependencies:
-    node-int64 "^0.4.0"
-
-bser@2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
-  integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
-  dependencies:
-    node-int64 "^0.4.0"
-
 buffer-from@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
   integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
 
-builtin-modules@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
-  integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=
-
-callsites@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
-  integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
-
-camelcase@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
-  integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
-
 caseless@~0.12.0:
   version "0.12.0"
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
   integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
 
-chalk@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
-  integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
-  dependencies:
-    ansi-styles "^2.2.1"
-    escape-string-regexp "^1.0.2"
-    has-ansi "^2.0.0"
-    strip-ansi "^3.0.0"
-    supports-color "^2.0.0"
-
 chalk@^2.0.0:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
   dependencies:
     ansi-styles "^3.2.1"
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
@@ -757,35 +482,16 @@ cheerio@^1.0.0-rc.3:
   dependencies:
     css-select "~1.2.0"
     dom-serializer "~0.1.1"
     entities "~1.1.1"
     htmlparser2 "^3.9.1"
     lodash "^4.15.0"
     parse5 "^3.0.1"
 
-ci-info@^1.5.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
-  integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
-
-cliui@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
-  integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
-  dependencies:
-    string-width "^1.0.1"
-    strip-ansi "^3.0.1"
-    wrap-ansi "^2.0.0"
-
-code-point-at@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
-  integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
-
 color-convert@^1.9.0:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
   integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
   dependencies:
     color-name "1.1.3"
 
 color-name@1.1.3:
@@ -805,17 +511,17 @@ combined-stream@^1.0.6, combined-stream@
   dependencies:
     delayed-stream "~1.0.0"
 
 commander@2.15.1:
   version "2.15.1"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
   integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
 
-commander@^2.19.0, commander@~2.20.3:
+commander@^2.19.0:
   version "2.20.3"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
   integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
 
 commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
   integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
@@ -825,29 +531,29 @@ concat-map@0.0.1:
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
   integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 
 content-type-parser@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7"
   integrity sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==
 
-convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0:
+convert-source-map@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
   integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
   dependencies:
     safe-buffer "~5.1.1"
 
 core-js@^0.8.3:
   version "0.8.4"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-0.8.4.tgz#c22665f1e0d1b9c3c5e1b08dabd1f108695e4fcf"
   integrity sha1-wiZl8eDRucPF4bCNq9HxCGleT88=
 
-core-js@^2.4.0, core-js@^2.5.0:
+core-js@^2.4.0:
   version "2.6.11"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
   integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
 
 core-util-is@1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
@@ -888,87 +594,41 @@ dashdash@^1.12.0:
 
 debug@3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
   integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
   dependencies:
     ms "2.0.0"
 
-debug@^2.6.8, debug@^2.6.9:
-  version "2.6.9"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
-  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
-  dependencies:
-    ms "2.0.0"
-
-debug@^3.1.0:
-  version "3.2.6"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
-  integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
-  dependencies:
-    ms "^2.1.1"
-
 debug@^4.1.0:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
   integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
   dependencies:
     ms "^2.1.1"
 
-decamelize@^1.1.1:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
-  integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
-
 deep-is@~0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
   integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 
-default-require-extensions@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
-  integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=
-  dependencies:
-    strip-bom "^2.0.0"
-
 define-properties@^1.1.2, define-properties@^1.1.3, define-properties@~1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
   integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
   dependencies:
     object-keys "^1.0.12"
 
 delayed-stream@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
   integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
 
-detect-indent@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
-  integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
-  dependencies:
-    repeating "^2.0.0"
-
-devtools-modules@0.0.37:
-  version "0.0.37"
-  resolved "https://registry.yarnpkg.com/devtools-modules/-/devtools-modules-0.0.37.tgz#29b0041e444fe8b08aae3833b5433ab004d012b3"
-  integrity sha512-60yjoRsmBSwaHc2vbwxgo+NKgzAZYRppLI1Q5x3sQ8VArGD2nUDVNRBCtR2SihjodNSQuMB4S9owIiE6fSJ2ow==
-  dependencies:
-    jest "^20.0.4"
-    punycode "^2.1.0"
-
-devtools-services@^0.0.3:
-  version "0.0.3"
-  resolved "https://registry.yarnpkg.com/devtools-services/-/devtools-services-0.0.3.tgz#69f1c5653f26b45b4cb0eed41b182a7bb74b98ad"
-  integrity sha512-O3GGocQwd1q7yUzEFMpHc/aPS2IVOltjlWFlmJXedi1VoX0mbDpjkJHU0svQfiJzEqL7ySMS4qMn+MlIUXySNA==
-
-diff@3.5.0, diff@^3.2.0:
+diff@3.5.0:
   version "3.5.0"
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
   integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
 
 discontinuous-range@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a"
   integrity sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=
@@ -1103,30 +763,16 @@ enzyme@^3.3.0:
     object-is "^1.0.2"
     object.assign "^4.1.0"
     object.entries "^1.1.1"
     object.values "^1.1.1"
     raf "^3.4.1"
     rst-selector-parser "^2.2.3"
     string.prototype.trim "^1.2.1"
 
-errno@~0.1.7:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
-  integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
-  dependencies:
-    prr "~1.0.1"
-
-error-ex@^1.2.0:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
-  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
-  dependencies:
-    is-arrayish "^0.2.1"
-
 es-abstract@^1.17.0-next.1, es-abstract@^1.17.4:
   version "1.17.4"
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184"
   integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==
   dependencies:
     es-to-primitive "^1.2.1"
     function-bind "^1.1.1"
     has "^1.0.3"
@@ -1156,69 +802,48 @@ es-to-primitive@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
   integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
   dependencies:
     is-callable "^1.1.4"
     is-date-object "^1.0.1"
     is-symbol "^1.0.2"
 
-escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
 escodegen@^1.6.1:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457"
   integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==
   dependencies:
     esprima "^4.0.1"
     estraverse "^4.2.0"
     esutils "^2.0.2"
     optionator "^0.8.1"
   optionalDependencies:
     source-map "~0.6.1"
 
-esprima@^4.0.0, esprima@^4.0.1:
+esprima@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
 estraverse@^4.2.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
   integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
 
 esutils@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
   integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
 
-exec-sh@^0.2.0:
-  version "0.2.2"
-  resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36"
-  integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==
-  dependencies:
-    merge "^1.2.0"
-
-expand-brackets@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
-  integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=
-  dependencies:
-    is-posix-bracket "^0.1.0"
-
-expand-range@^1.8.1:
-  version "1.8.2"
-  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
-  integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=
-  dependencies:
-    fill-range "^2.1.0"
-
 expect@^1.16.0:
   version "1.20.2"
   resolved "https://registry.yarnpkg.com/expect/-/expect-1.20.2.tgz#d458fe4c56004036bae3232416a3f6361f04f965"
   integrity sha1-1Fj+TFYAQDa64yMkFqP2Nh8E+WU=
   dependencies:
     define-properties "~1.1.2"
     has "^1.0.1"
     is-equal "^1.5.1"
@@ -1227,23 +852,16 @@ expect@^1.16.0:
     object-keys "^1.0.9"
     tmatch "^2.0.1"
 
 extend@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
   integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
 
-extglob@^0.3.1:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
-  integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=
-  dependencies:
-    is-extglob "^1.0.0"
-
 extsprintf@1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
   integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
 
 extsprintf@^1.2.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
@@ -1259,97 +877,32 @@ fast-json-stable-stringify@^2.0.0:
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
   integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
 
 fast-levenshtein@~2.0.6:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
   integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
 
-fb-watchman@^1.8.0:
-  version "1.9.2"
-  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383"
-  integrity sha1-okz0eCf4LTj7Waaa1wt247auc4M=
-  dependencies:
-    bser "1.0.2"
-
-fb-watchman@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
-  integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
-  dependencies:
-    bser "2.1.1"
-
-filename-regex@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
-  integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=
-
-fileset@^2.0.2:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
-  integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=
-  dependencies:
-    glob "^7.0.3"
-    minimatch "^3.0.3"
-
-fill-range@^2.1.0:
-  version "2.2.4"
-  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
-  integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==
-  dependencies:
-    is-number "^2.1.0"
-    isobject "^2.0.0"
-    randomatic "^3.0.0"
-    repeat-element "^1.1.2"
-    repeat-string "^1.5.2"
-
 find-cache-dir@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
   integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
   dependencies:
     commondir "^1.0.1"
     make-dir "^2.0.0"
     pkg-dir "^3.0.0"
 
-find-up@^1.0.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
-  integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
-  dependencies:
-    path-exists "^2.0.0"
-    pinkie-promise "^2.0.0"
-
-find-up@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
-  integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
-  dependencies:
-    locate-path "^2.0.0"
-
 find-up@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
   integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
   dependencies:
     locate-path "^3.0.0"
 
-for-in@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
-  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
-
-for-own@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
-  integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=
-  dependencies:
-    for-in "^1.0.1"
-
 forever-agent@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
   integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
 
 form-data@~2.3.2:
   version "2.3.3"
   resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
@@ -1390,136 +943,66 @@ functions-have-names@^1.2.0:
   resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.1.tgz#a981ac397fa0c9964551402cdc5533d7a4d52f91"
   integrity sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA==
 
 gensync@^1.0.0-beta.1:
   version "1.0.0-beta.1"
   resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
   integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
 
-get-caller-file@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
-  integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
-
 getpass@^0.1.1:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
   integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
   dependencies:
     assert-plus "^1.0.0"
 
-glob-base@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
-  integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=
-  dependencies:
-    glob-parent "^2.0.0"
-    is-glob "^2.0.0"
-
-glob-parent@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
-  integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=
-  dependencies:
-    is-glob "^2.0.0"
-
 glob@7.1.2:
   version "7.1.2"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
   integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==
   dependencies:
     fs.realpath "^1.0.0"
     inflight "^1.0.4"
     inherits "2"
     minimatch "^3.0.4"
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@^7.0.3, glob@^7.1.1, glob@^7.1.3:
-  version "7.1.6"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
-  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.4"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
 global@^4.3.2:
   version "4.4.0"
   resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
   integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
   dependencies:
     min-document "^2.19.0"
     process "^0.11.10"
 
 globals@^11.1.0:
   version "11.12.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
   integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
-globals@^9.18.0:
-  version "9.18.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
-  integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
-
-graceful-fs@^4.1.11, graceful-fs@^4.1.2:
-  version "4.2.3"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
-  integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
-
 growl@1.10.5:
   version "1.10.5"
   resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
   integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
 
-growly@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
-  integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
-
-handlebars@^4.0.3:
-  version "4.7.3"
-  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.3.tgz#8ece2797826886cf8082d1726ff21d2a022550ee"
-  integrity sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==
-  dependencies:
-    neo-async "^2.6.0"
-    optimist "^0.6.1"
-    source-map "^0.6.1"
-  optionalDependencies:
-    uglify-js "^3.1.4"
-
 har-schema@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
   integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
 
 har-validator@~5.1.3:
   version "5.1.3"
   resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
   integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
   dependencies:
     ajv "^6.5.5"
     har-schema "^2.0.0"
 
-has-ansi@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
-  integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
-  dependencies:
-    ansi-regex "^2.0.0"
-
-has-flag@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
-  integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
-
 has-flag@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
   integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
 
 has-symbols@^1.0.0, has-symbols@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
@@ -1532,29 +1015,16 @@ has@^1.0.1, has@^1.0.3:
   dependencies:
     function-bind "^1.1.1"
 
 he@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
   integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
 
-home-or-tmp@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
-  integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg=
-  dependencies:
-    os-homedir "^1.0.0"
-    os-tmpdir "^1.0.1"
-
-hosted-git-info@^2.1.4:
-  version "2.8.8"
-  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
-  integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
-
 html-element-map@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.2.0.tgz#dfbb09efe882806af63d990cf6db37993f099f22"
   integrity sha512-0uXq8HsuG1v2TmQ8QkIhzbrqeskE4kn52Q18QJ9iAA/SnHoEKXWiUxHQtclRsCFWEUD2So34X+0+pZZu862nnw==
   dependencies:
     array-filter "^1.0.0"
 
 html-encoding-sniffer@^1.0.1:
@@ -1600,38 +1070,21 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
 inherits@2, inherits@^2.0.1, inherits@^2.0.3:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
-invariant@^2.2.2:
-  version "2.2.4"
-  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
-  integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
-  dependencies:
-    loose-envify "^1.0.0"
-
-invert-kv@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
-  integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
-
 is-arguments@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
   integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==
 
-is-arrayish@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
-  integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
-
 is-arrow-function@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/is-arrow-function/-/is-arrow-function-2.0.3.tgz#29be2c2d8d9450852b8bbafb635ba7b8d8e87ec2"
   integrity sha1-Kb4sLY2UUIUri7r7Y1unuNjofsI=
   dependencies:
     is-callable "^1.0.4"
 
 is-bigint@^1.0.0:
@@ -1639,57 +1092,26 @@ is-bigint@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.0.tgz#73da8c33208d00f130e9b5e15d23eac9215601c4"
   integrity sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==
 
 is-boolean-object@^1.0.0, is-boolean-object@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e"
   integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==
 
-is-buffer@^1.1.5:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
-  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-
-is-builtin-module@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
-  integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74=
-  dependencies:
-    builtin-modules "^1.0.0"
-
 is-callable@^1.0.4, is-callable@^1.1.4, is-callable@^1.1.5:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
   integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
 
-is-ci@^1.0.10:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
-  integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
-  dependencies:
-    ci-info "^1.5.0"
-
 is-date-object@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
   integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
 
-is-dotfile@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
-  integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=
-
-is-equal-shallow@^0.1.3:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
-  integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=
-  dependencies:
-    is-primitive "^2.0.0"
-
 is-equal@^1.5.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/is-equal/-/is-equal-1.6.1.tgz#74fafde5060fcaf187041c05f11f0b9f020bb9b3"
   integrity sha512-3/79QTolnfNFrxQAvqH8M+O01uGWsVq54BUPG2mXQH7zi4BE/0TY+fmA444t8xSBvIwyNMvsTmCZ5ViVDlqPJg==
   dependencies:
     es-get-iterator "^1.0.1"
     functions-have-names "^1.2.0"
     has "^1.0.3"
@@ -1704,82 +1126,31 @@ is-equal@^1.5.1:
     is-string "^1.0.4"
     is-symbol "^1.0.3"
     isarray "^2.0.5"
     object-inspect "^1.7.0"
     object.entries "^1.1.0"
     which-boxed-primitive "^1.0.1"
     which-collection "^1.0.0"
 
-is-extendable@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
-  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
-
-is-extglob@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
-  integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=
-
-is-finite@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
-  integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
-
-is-fullwidth-code-point@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
-  integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
-  dependencies:
-    number-is-nan "^1.0.0"
-
 is-generator-function@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522"
   integrity sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==
 
-is-glob@^2.0.0, is-glob@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
-  integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=
-  dependencies:
-    is-extglob "^1.0.0"
-
 is-map@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1"
   integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==
 
 is-number-object@^1.0.3, is-number-object@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197"
   integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==
 
-is-number@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
-  integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=
-  dependencies:
-    kind-of "^3.0.2"
-
-is-number@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
-  integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
-
-is-posix-bracket@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
-  integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=
-
-is-primitive@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
-  integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU=
-
 is-regex@^1.0.3, is-regex@^1.0.4, is-regex@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
   integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
   dependencies:
     has "^1.0.3"
 
 is-set@^2.0.1:
@@ -1804,394 +1175,52 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
   dependencies:
     has-symbols "^1.0.1"
 
 is-typedarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
   integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
 
-is-utf8@^0.2.0:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
-  integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
-
 is-weakmap@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
   integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
 
 is-weakset@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83"
   integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==
 
-is-wsl@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
-  integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
-
-isarray@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
-  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
-
 isarray@^2.0.5:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
   integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
 
-isexe@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
-  integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-
-isobject@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
-  integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
-  dependencies:
-    isarray "1.0.0"
-
 isstream@~0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
   integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
 
-istanbul-api@^1.1.1:
-  version "1.3.7"
-  resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa"
-  integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==
-  dependencies:
-    async "^2.1.4"
-    fileset "^2.0.2"
-    istanbul-lib-coverage "^1.2.1"
-    istanbul-lib-hook "^1.2.2"
-    istanbul-lib-instrument "^1.10.2"
-    istanbul-lib-report "^1.1.5"
-    istanbul-lib-source-maps "^1.2.6"
-    istanbul-reports "^1.5.1"
-    js-yaml "^3.7.0"
-    mkdirp "^0.5.1"
-    once "^1.4.0"
-
-istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
-  integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==
-
-istanbul-lib-hook@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86"
-  integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==
-  dependencies:
-    append-transform "^0.4.0"
-
-istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2, istanbul-lib-instrument@^1.4.2:
-  version "1.10.2"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca"
-  integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==
-  dependencies:
-    babel-generator "^6.18.0"
-    babel-template "^6.16.0"
-    babel-traverse "^6.18.0"
-    babel-types "^6.18.0"
-    babylon "^6.18.0"
-    istanbul-lib-coverage "^1.2.1"
-    semver "^5.3.0"
-
-istanbul-lib-report@^1.1.5:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c"
-  integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==
-  dependencies:
-    istanbul-lib-coverage "^1.2.1"
-    mkdirp "^0.5.1"
-    path-parse "^1.0.5"
-    supports-color "^3.1.2"
-
-istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.6:
-  version "1.2.6"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f"
-  integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==
-  dependencies:
-    debug "^3.1.0"
-    istanbul-lib-coverage "^1.2.1"
-    mkdirp "^0.5.1"
-    rimraf "^2.6.1"
-    source-map "^0.5.3"
-
-istanbul-reports@^1.5.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a"
-  integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==
-  dependencies:
-    handlebars "^4.0.3"
-
-jest-changed-files@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8"
-  integrity sha1-k5TVzGXEOEBhSb7xv01Sto4D4/g=
-
-jest-cli@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93"
-  integrity sha1-5TKxnYiuW8bEF+iwWTpv6VSx3JM=
-  dependencies:
-    ansi-escapes "^1.4.0"
-    callsites "^2.0.0"
-    chalk "^1.1.3"
-    graceful-fs "^4.1.11"
-    is-ci "^1.0.10"
-    istanbul-api "^1.1.1"
-    istanbul-lib-coverage "^1.0.1"
-    istanbul-lib-instrument "^1.4.2"
-    istanbul-lib-source-maps "^1.1.0"
-    jest-changed-files "^20.0.3"
-    jest-config "^20.0.4"
-    jest-docblock "^20.0.3"
-    jest-environment-jsdom "^20.0.3"
-    jest-haste-map "^20.0.4"
-    jest-jasmine2 "^20.0.4"
-    jest-message-util "^20.0.3"
-    jest-regex-util "^20.0.3"
-    jest-resolve-dependencies "^20.0.3"
-    jest-runtime "^20.0.4"
-    jest-snapshot "^20.0.3"
-    jest-util "^20.0.3"
-    micromatch "^2.3.11"
-    node-notifier "^5.0.2"
-    pify "^2.3.0"
-    slash "^1.0.0"
-    string-length "^1.0.1"
-    throat "^3.0.0"
-    which "^1.2.12"
-    worker-farm "^1.3.1"
-    yargs "^7.0.2"
-
-jest-config@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea"
-  integrity sha1-43kwqyIXyRNgXv8T5712PsSPruo=
-  dependencies:
-    chalk "^1.1.3"
-    glob "^7.1.1"
-    jest-environment-jsdom "^20.0.3"
-    jest-environment-node "^20.0.3"
-    jest-jasmine2 "^20.0.4"
-    jest-matcher-utils "^20.0.3"
-    jest-regex-util "^20.0.3"
-    jest-resolve "^20.0.4"
-    jest-validate "^20.0.3"
-    pretty-format "^20.0.3"
-
-jest-diff@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617"
-  integrity sha1-gfKI/Z5nXw+yPHXxwrGURf5YZhc=
-  dependencies:
-    chalk "^1.1.3"
-    diff "^3.2.0"
-    jest-matcher-utils "^20.0.3"
-    pretty-format "^20.0.3"
-
-jest-docblock@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712"
-  integrity sha1-F76phDQswz2DxQ++FUXqDvqkRxI=
-
-jest-environment-jsdom@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99"
-  integrity sha1-BIqKwS7iJfcZBBdxODS7mZeH3pk=
-  dependencies:
-    jest-mock "^20.0.3"
-    jest-util "^20.0.3"
-    jsdom "^9.12.0"
-
-jest-environment-node@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403"
-  integrity sha1-1Ii8RhKvLCRumG6K52caCZFj1AM=
-  dependencies:
-    jest-mock "^20.0.3"
-    jest-util "^20.0.3"
-
-jest-haste-map@^20.0.4:
-  version "20.0.5"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.5.tgz#abad74efb1a005974a7b6517e11010709cab9112"
-  integrity sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==
-  dependencies:
-    fb-watchman "^2.0.0"
-    graceful-fs "^4.1.11"
-    jest-docblock "^20.0.3"
-    micromatch "^2.3.11"
-    sane "~1.6.0"
-    worker-farm "^1.3.1"
-
-jest-jasmine2@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1"
-  integrity sha1-/MWxQReA2RHQQpAu8YWehS5g1eE=
-  dependencies:
-    chalk "^1.1.3"
-    graceful-fs "^4.1.11"
-    jest-diff "^20.0.3"
-    jest-matcher-utils "^20.0.3"
-    jest-matchers "^20.0.3"
-    jest-message-util "^20.0.3"
-    jest-snapshot "^20.0.3"
-    once "^1.4.0"
-    p-map "^1.1.1"
-
-jest-matcher-utils@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612"
-  integrity sha1-s6a443yld4A7CDKpixZPRLeBVhI=
-  dependencies:
-    chalk "^1.1.3"
-    pretty-format "^20.0.3"
-
-jest-matchers@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60"
-  integrity sha1-ymnbHDLbWm9wf6XgQBq7VXAN/WA=
-  dependencies:
-    jest-diff "^20.0.3"
-    jest-matcher-utils "^20.0.3"
-    jest-message-util "^20.0.3"
-    jest-regex-util "^20.0.3"
-
-jest-message-util@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c"
-  integrity sha1-auwoRDBvyw5udNV5bBAG2W/dgxw=
-  dependencies:
-    chalk "^1.1.3"
-    micromatch "^2.3.11"
-    slash "^1.0.0"
-
-jest-mock@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59"
-  integrity sha1-i8Bw6QQUqhVcEajWTIaaDVxx2lk=
-
-jest-regex-util@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762"
-  integrity sha1-hburXRM+RGJbGfr4xqpRItCF12I=
-
-jest-resolve-dependencies@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a"
-  integrity sha1-bhSntxevDyyzZnxUneQK8Bexcjo=
-  dependencies:
-    jest-regex-util "^20.0.3"
-
-jest-resolve@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5"
-  integrity sha1-lEiz6La6/BVHlETGSZBFt//ll6U=
-  dependencies:
-    browser-resolve "^1.11.2"
-    is-builtin-module "^1.0.0"
-    resolve "^1.3.2"
-
-jest-runtime@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8"
-  integrity sha1-osgCIZxCA/dU3xQE5JAYYWnRJNg=
-  dependencies:
-    babel-core "^6.0.0"
-    babel-jest "^20.0.3"
-    babel-plugin-istanbul "^4.0.0"
-    chalk "^1.1.3"
-    convert-source-map "^1.4.0"
-    graceful-fs "^4.1.11"
-    jest-config "^20.0.4"
-    jest-haste-map "^20.0.4"
-    jest-regex-util "^20.0.3"
-    jest-resolve "^20.0.4"
-    jest-util "^20.0.3"
-    json-stable-stringify "^1.0.1"
-    micromatch "^2.3.11"
-    strip-bom "3.0.0"
-    yargs "^7.0.2"
-
-jest-snapshot@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566"
-  integrity sha1-W4R+GtsaTZCFKn+fElCG4YfHZWY=
-  dependencies:
-    chalk "^1.1.3"
-    jest-diff "^20.0.3"
-    jest-matcher-utils "^20.0.3"
-    jest-util "^20.0.3"
-    natural-compare "^1.4.0"
-    pretty-format "^20.0.3"
-
-jest-util@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad"
-  integrity sha1-DAf32A2C9OWmfG+LnD/n9lz9Mq0=
-  dependencies:
-    chalk "^1.1.3"
-    graceful-fs "^4.1.11"
-    jest-message-util "^20.0.3"
-    jest-mock "^20.0.3"
-    jest-validate "^20.0.3"
-    leven "^2.1.0"
-    mkdirp "^0.5.1"
-
-jest-validate@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab"
-  integrity sha1-0M/R3k9XnymEhJJcKA+PHZTsPKs=
-  dependencies:
-    chalk "^1.1.3"
-    jest-matcher-utils "^20.0.3"
-    leven "^2.1.0"
-    pretty-format "^20.0.3"
-
-jest@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac"
-  integrity sha1-PdJgwpidba1nix6cxNkZRPbWAqw=
-  dependencies:
-    jest-cli "^20.0.4"
-
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
   integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
-js-tokens@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
-  integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
-
-js-yaml@^3.7.0:
-  version "3.13.1"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
-  integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
-  dependencies:
-    argparse "^1.0.7"
-    esprima "^4.0.0"
-
 jsbn@~0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
   integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
 
 jsdom-global@^2.0.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/jsdom-global/-/jsdom-global-2.1.1.tgz#47d46fe77f6167baf5d34431d3bb59fc41b0915a"
   integrity sha1-R9Rv539hZ7r100Qx07tZ/EGwkVo=
 
-jsdom@^9.12.0, jsdom@^9.4.1:
+jsdom@^9.4.1:
   version "9.12.0"
   resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
   integrity sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=
   dependencies:
     abab "^1.0.3"
     acorn "^4.0.4"
     acorn-globals "^3.1.0"
     array-equal "^1.0.0"
@@ -2206,126 +1235,61 @@ jsdom@^9.12.0, jsdom@^9.4.1:
     sax "^1.2.1"
     symbol-tree "^3.2.1"
     tough-cookie "^2.3.2"
     webidl-conversions "^4.0.0"
     whatwg-encoding "^1.0.1"
     whatwg-url "^4.3.0"
     xml-name-validator "^2.0.1"
 
-jsesc@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
-  integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
-
 jsesc@^2.5.1:
   version "2.5.2"
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
   integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
 
 json-schema-traverse@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
   integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
 
 json-schema@0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
   integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
 
-json-stable-stringify@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
-  integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
-  dependencies:
-    jsonify "~0.0.0"
-
 json-stringify-safe@~5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
   integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
 
-json5@^0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
-  integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
-
 json5@^2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e"
   integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==
   dependencies:
     minimist "^1.2.5"
 
-jsonify@~0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
-  integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=
-
 jsprim@^1.2.2:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
   integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
   dependencies:
     assert-plus "1.0.0"
     extsprintf "1.3.0"
     json-schema "0.2.3"
     verror "1.10.0"
 
-kind-of@^3.0.2:
-  version "3.2.2"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
-  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
-  dependencies:
-    is-buffer "^1.1.5"
-
-kind-of@^6.0.0:
-  version "6.0.3"
-  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
-  integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
-
-lcid@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
-  integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
-  dependencies:
-    invert-kv "^1.0.0"
-
-leven@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
-  integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA=
-
 levn@~0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
   integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
   dependencies:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
-load-json-file@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
-  integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
-  dependencies:
-    graceful-fs "^4.1.2"
-    parse-json "^2.2.0"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-    strip-bom "^2.0.0"
-
-locate-path@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
-  integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
-  dependencies:
-    p-locate "^2.0.0"
-    path-exists "^3.0.0"
-
 locate-path@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
   integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
   dependencies:
     p-locate "^3.0.0"
     path-exists "^3.0.0"
 
@@ -2339,82 +1303,46 @@ lodash.flattendeep@^4.4.0:
   resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2"
   integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=
 
 lodash.isequal@^4.5.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
   integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
 
-lodash@^4.15.0, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4:
+lodash@^4.15.0, lodash@^4.17.13:
   version "4.17.15"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
   integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
 
 lodash@^4.17.19:
   version "4.17.20"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
   integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
 
 lolex@1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31"
   integrity sha1-fD2mL/yzDw9agKJWbKJORdigHzE=
 
-loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
+loose-envify@^1.1.0, loose-envify@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
   integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
   dependencies:
     js-tokens "^3.0.0 || ^4.0.0"
 
 make-dir@^2.0.0, make-dir@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
   integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
   dependencies:
     pify "^4.0.1"
     semver "^5.6.0"
 
-makeerror@1.0.x:
-  version "1.0.11"
-  resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
-  integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=
-  dependencies:
-    tmpl "1.0.x"
-
-math-random@^1.0.1:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c"
-  integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==
-
-merge@^1.2.0:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
-  integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
-
-micromatch@^2.1.5, micromatch@^2.3.11:
-  version "2.3.11"
-  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
-  integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=
-  dependencies:
-    arr-diff "^2.0.0"
-    array-unique "^0.2.1"
-    braces "^1.8.2"
-    expand-brackets "^0.1.4"
-    extglob "^0.3.1"
-    filename-regex "^2.0.0"
-    is-extglob "^1.0.0"
-    is-glob "^2.0.1"
-    kind-of "^3.0.2"
-    normalize-path "^2.0.1"
-    object.omit "^2.0.0"
-    parse-glob "^3.0.4"
-    regex-cache "^0.4.2"
-
 mime-db@1.43.0:
   version "1.43.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
   integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==
 
 mime-types@^2.1.12, mime-types@~2.1.19:
   version "2.1.26"
   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
@@ -2424,52 +1352,40 @@ mime-types@^2.1.12, mime-types@~2.1.19:
 
 min-document@^2.19.0:
   version "2.19.0"
   resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
   integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
   dependencies:
     dom-walk "^0.1.0"
 
-minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
+minimatch@3.0.4, minimatch@^3.0.4:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
   integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
   dependencies:
     brace-expansion "^1.1.7"
 
 minimist@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
   integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
 
-minimist@^1.1.1, minimist@^1.2.5:
+minimist@^1.2.5:
   version "1.2.5"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
   integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
 
-minimist@~0.0.1:
-  version "0.0.10"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
-  integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=
-
 mkdirp@0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
   integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
   dependencies:
     minimist "0.0.8"
 
-mkdirp@^0.5.1:
-  version "0.5.3"
-  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.3.tgz#5a514b7179259287952881e94410ec5465659f8c"
-  integrity sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==
-  dependencies:
-    minimist "^1.2.5"
-
 mocha@^5.0.1:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
   integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==
   dependencies:
     browser-stdout "1.3.1"
     commander "2.15.1"
     debug "3.1.0"
@@ -2500,98 +1416,50 @@ ms@2.0.0:
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
   integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
 
 ms@^2.1.1:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
 
-natural-compare@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
-  integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
-
 nearley@^2.7.10:
   version "2.19.1"
   resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.1.tgz#4af4006e16645ff800e9f993c3af039857d9dbdc"
   integrity sha512-xq47GIUGXxU9vQg7g/y1o1xuKnkO7ev4nRWqftmQrLkfnE/FjRqDaGOUakM8XHPn/6pW3bGjU2wgoJyId90rqg==
   dependencies:
     commander "^2.19.0"
     moo "^0.5.0"
     railroad-diagrams "^1.0.0"
     randexp "0.4.6"
     semver "^5.4.1"
 
-neo-async@^2.6.0:
-  version "2.6.1"
-  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
-  integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
-
-node-int64@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
-  integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
-
 node-modules-regexp@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
   integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
 
-node-notifier@^5.0.2:
-  version "5.4.3"
-  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50"
-  integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==
-  dependencies:
-    growly "^1.3.0"
-    is-wsl "^1.1.0"
-    semver "^5.5.0"
-    shellwords "^0.1.1"
-    which "^1.3.0"
-
-normalize-package-data@^2.3.2:
-  version "2.5.0"
-  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
-  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
-  dependencies:
-    hosted-git-info "^2.1.4"
-    resolve "^1.10.0"
-    semver "2 || 3 || 4 || 5"
-    validate-npm-package-license "^3.0.1"
-
-normalize-path@^2.0.0, normalize-path@^2.0.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
-  integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
-  dependencies:
-    remove-trailing-separator "^1.0.1"
-
 nth-check@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
   integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
   dependencies:
     boolbase "~1.0.0"
 
-number-is-nan@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
-  integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
-
 "nwmatcher@>= 1.3.9 < 2.0.0":
   version "1.4.4"
   resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e"
   integrity sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==
 
 oauth-sign@~0.9.0:
   version "0.9.0"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
   integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
 
-object-assign@^4.1.0, object-assign@^4.1.1:
+object-assign@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
   integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
 
 object-inspect@^1.1.0, object-inspect@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
   integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
@@ -2631,208 +1499,101 @@ object.fromentries@^2.0.2:
   resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9"
   integrity sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.0-next.1"
     function-bind "^1.1.1"
     has "^1.0.3"
 
-object.omit@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
-  integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=
-  dependencies:
-    for-own "^0.1.4"
-    is-extendable "^0.1.1"
-
 object.values@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
   integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.0-next.1"
     function-bind "^1.1.1"
     has "^1.0.3"
 
-once@^1.3.0, once@^1.4.0:
+once@^1.3.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
   dependencies:
     wrappy "1"
 
-optimist@^0.6.1:
-  version "0.6.1"
-  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
-  integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY=
-  dependencies:
-    minimist "~0.0.1"
-    wordwrap "~0.0.2"
-
 optionator@^0.8.1:
   version "0.8.3"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
   integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
   dependencies:
     deep-is "~0.1.3"
     fast-levenshtein "~2.0.6"
     levn "~0.3.0"
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
     word-wrap "~1.2.3"
 
-os-homedir@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
-  integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
-
-os-locale@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
-  integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
-  dependencies:
-    lcid "^1.0.0"
-
-os-tmpdir@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
-  integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
-
-p-limit@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
-  integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
-  dependencies:
-    p-try "^1.0.0"
-
 p-limit@^2.0.0:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e"
   integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==
   dependencies:
     p-try "^2.0.0"
 
-p-locate@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
-  integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
-  dependencies:
-    p-limit "^1.1.0"
-
 p-locate@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
   integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
   dependencies:
     p-limit "^2.0.0"
 
-p-map@^1.1.1:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
-  integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==
-
-p-try@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
-  integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
-
 p-try@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
   integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
 
-parse-glob@^3.0.4:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
-  integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw=
-  dependencies:
-    glob-base "^0.3.0"
-    is-dotfile "^1.0.0"
-    is-extglob "^1.0.0"
-    is-glob "^2.0.0"
-
-parse-json@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
-  integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
-  dependencies:
-    error-ex "^1.2.0"
-
 parse5@^1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
   integrity sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=
 
 parse5@^3.0.1:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
   integrity sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==
   dependencies:
     "@types/node" "*"
 
-path-exists@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
-  integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
-  dependencies:
-    pinkie-promise "^2.0.0"
-
 path-exists@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
   integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
 
-path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+path-is-absolute@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
   integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 
-path-parse@^1.0.5, path-parse@^1.0.6:
+path-parse@^1.0.6:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
   integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
 
-path-type@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
-  integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
-  dependencies:
-    graceful-fs "^4.1.2"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-
 performance-now@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
   integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
 
-pify@^2.0.0, pify@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
-  integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
-
 pify@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
   integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
 
-pinkie-promise@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
-  integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
-  dependencies:
-    pinkie "^2.0.0"
-
-pinkie@^2.0.0:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
-  integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
-
 pirates@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
   integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
   dependencies:
     node-modules-regexp "^1.0.0"
 
 pkg-dir@^3.0.0:
@@ -2842,34 +1603,16 @@ pkg-dir@^3.0.0:
   dependencies:
     find-up "^3.0.0"
 
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
   integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
 
-preserve@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
-  integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=
-
-pretty-format@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14"
-  integrity sha1-Ag41ClYKH+GpjcO+tsz/s4beixQ=
-  dependencies:
-    ansi-regex "^2.1.1"
-    ansi-styles "^3.0.0"
-
-private@^0.1.8:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
-  integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
-
 process@^0.11.10:
   version "0.11.10"
   resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
   integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
 
 prop-types-exact@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869"
@@ -2883,21 +1626,16 @@ prop-types@^15.6.2, prop-types@^15.7.2:
   version "15.7.2"
   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
   integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
   dependencies:
     loose-envify "^1.4.0"
     object-assign "^4.1.1"
     react-is "^16.8.1"
 
-prr@~1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
-  integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
-
 psl@^1.1.28:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c"
   integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==
 
 punycode@^2.1.0, punycode@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
@@ -2923,57 +1661,31 @@ railroad-diagrams@^1.0.0:
 randexp@0.4.6:
   version "0.4.6"
   resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3"
   integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==
   dependencies:
     discontinuous-range "1.0.0"
     ret "~0.1.10"
 
-randomatic@^3.0.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
-  integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==
-  dependencies:
-    is-number "^4.0.0"
-    kind-of "^6.0.0"
-    math-random "^1.0.1"
-
 react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.6, react-is@^16.9.0:
   version "16.13.0"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.0.tgz#0f37c3613c34fe6b37cd7f763a0d6293ab15c527"
   integrity sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==
 
 react-test-renderer@^16.0.0-0:
   version "16.13.0"
   resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.13.0.tgz#39ba3bf72cedc8210c3f81983f0bb061b14a3014"
   integrity sha512-NQ2S9gdMUa7rgPGpKGyMcwl1d6D9MCF0lftdI3kts6kkiX+qvpC955jNjAZXlIDTjnN9jwFI8A8XhRh/9v0spA==
   dependencies:
     object-assign "^4.1.1"
     prop-types "^15.6.2"
     react-is "^16.8.6"
     scheduler "^0.19.0"
 
-read-pkg-up@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
-  integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
-  dependencies:
-    find-up "^1.0.0"
-    read-pkg "^1.0.0"
-
-read-pkg@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
-  integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
-  dependencies:
-    load-json-file "^1.0.0"
-    normalize-package-data "^2.3.2"
-    path-type "^1.0.0"
-
 readable-stream@^3.1.1:
   version "3.6.0"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
   integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
   dependencies:
     inherits "^2.0.3"
     string_decoder "^1.1.1"
     util-deprecate "^1.0.1"
@@ -2983,45 +1695,16 @@ reflect.ownkeys@^0.2.0:
   resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460"
   integrity sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=
 
 regenerator-runtime@^0.11.0:
   version "0.11.1"
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
   integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
 
-regex-cache@^0.4.2:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
-  integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==
-  dependencies:
-    is-equal-shallow "^0.1.3"
-
-remove-trailing-separator@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
-  integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
-
-repeat-element@^1.1.2:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
-  integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
-
-repeat-string@^1.5.2:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
-  integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
-
-repeating@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
-  integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
-  dependencies:
-    is-finite "^1.0.0"
-
 request@^2.79.0:
   version "2.88.2"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
   integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
   dependencies:
     aws-sign2 "~0.7.0"
     aws4 "^1.8.0"
     caseless "~0.12.0"
@@ -3038,58 +1721,36 @@ request@^2.79.0:
     oauth-sign "~0.9.0"
     performance-now "^2.1.0"
     qs "~6.5.2"
     safe-buffer "^5.1.2"
     tough-cookie "~2.5.0"
     tunnel-agent "^0.6.0"
     uuid "^3.3.2"
 
-require-directory@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
-  integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-
 require-hacker@^2.1.4:
   version "2.1.4"
   resolved "https://registry.yarnpkg.com/require-hacker/-/require-hacker-2.1.4.tgz#1683da866119495e0ffcda8ebed9bbcf556849f2"
   integrity sha1-FoPahmEZSV4P/NqOvtm7z1VoSfI=
   dependencies:
     babel-runtime "^6.6.1"
     colors "^1.1.2"
 
-require-main-filename@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
-  integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
-
-resolve@1.1.7:
-  version "1.1.7"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
-  integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
-
-resolve@^1.10.0, resolve@^1.3.2:
+resolve@^1.3.2:
   version "1.15.1"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8"
   integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==
   dependencies:
     path-parse "^1.0.6"
 
 ret@~0.1.10:
   version "0.1.15"
   resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
   integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
 
-rimraf@^2.6.1:
-  version "2.7.1"
-  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
-  integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
-  dependencies:
-    glob "^7.1.3"
-
 rst-selector-parser@^2.2.3:
   version "2.2.3"
   resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91"
   integrity sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=
   dependencies:
     lodash.flattendeep "^4.4.0"
     nearley "^2.7.10"
 
@@ -3113,159 +1774,77 @@ samsam@1.1.2:
   resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567"
   integrity sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=
 
 samsam@~1.1:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621"
   integrity sha1-n1CHQZtNCR8jJXHn+lLpCw9VJiE=
 
-sane@~1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775"
-  integrity sha1-lhDEUjB6E10pwf3+JUcDQYDEZ3U=
-  dependencies:
-    anymatch "^1.3.0"
-    exec-sh "^0.2.0"
-    fb-watchman "^1.8.0"
-    minimatch "^3.0.2"
-    minimist "^1.1.1"
-    walker "~1.0.5"
-    watch "~0.10.0"
-
 sax@^1.2.1:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
 scheduler@^0.19.0:
   version "0.19.0"
   resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.0.tgz#a715d56302de403df742f4a9be11975b32f5698d"
   integrity sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
 
-"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
+semver@^5.4.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
   integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
 
-set-blocking@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
-  integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
-
-shellwords@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
-  integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
-
 sinon@^1.17.5:
   version "1.17.7"
   resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf"
   integrity sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=
   dependencies:
     formatio "1.1.1"
     lolex "1.3.2"
     samsam "1.1.2"
     util ">=0.10.3 <1"
 
-slash@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
-  integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
-
-source-map-support@^0.4.15:
-  version "0.4.18"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
-  integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
-  dependencies:
-    source-map "^0.5.6"
-
 source-map-support@^0.5.16:
   version "0.5.16"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
   integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==
   dependencies:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
 
-source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
+source-map@^0.5.0:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
   integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
 
-source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+source-map@^0.6.0, source-map@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 
-spdx-correct@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
-  integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==
-  dependencies:
-    spdx-expression-parse "^3.0.0"
-    spdx-license-ids "^3.0.0"
-
-spdx-exceptions@^2.1.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
-  integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==
-
-spdx-expression-parse@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
-  integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==
-  dependencies:
-    spdx-exceptions "^2.1.0"
-    spdx-license-ids "^3.0.0"
-
-spdx-license-ids@^3.0.0:
-  version "3.0.5"
-  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
-  integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
-
-sprintf-js@~1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
-  integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-
 sshpk@^1.7.0:
   version "1.16.1"
   resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
   integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
   dependencies:
     asn1 "~0.2.3"
     assert-plus "^1.0.0"
     bcrypt-pbkdf "^1.0.0"
     dashdash "^1.12.0"
     ecc-jsbn "~0.1.1"
     getpass "^0.1.1"
     jsbn "~0.1.0"
     safer-buffer "^2.0.2"
     tweetnacl "~0.14.0"
 
-string-length@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac"
-  integrity sha1-VpcPscOFWOnnC3KL894mmsRa36w=
-  dependencies:
-    strip-ansi "^3.0.0"
-
-string-width@^1.0.1, string-width@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
-  integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
-  dependencies:
-    code-point-at "^1.0.0"
-    is-fullwidth-code-point "^1.0.0"
-    strip-ansi "^3.0.0"
-
 string.prototype.trim@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782"
   integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.0-next.1"
     function-bind "^1.1.1"
@@ -3288,97 +1867,40 @@ string.prototype.trimright@^2.1.1:
 
 string_decoder@^1.1.1:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
   integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
   dependencies:
     safe-buffer "~5.2.0"
 
-strip-ansi@^3.0.0, strip-ansi@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
-  integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
-  dependencies:
-    ansi-regex "^2.0.0"
-
-strip-bom@3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
-  integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
-
-strip-bom@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
-  integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
-  dependencies:
-    is-utf8 "^0.2.0"
-
 supports-color@5.4.0:
   version "5.4.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
   integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==
   dependencies:
     has-flag "^3.0.0"
 
-supports-color@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
-  integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
-
-supports-color@^3.1.2:
-  version "3.2.3"
-  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
-  integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
-  dependencies:
-    has-flag "^1.0.0"
-
 supports-color@^5.3.0:
   version "5.5.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
   integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
   dependencies:
     has-flag "^3.0.0"
 
 symbol-tree@^3.2.1:
   version "3.2.4"
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
   integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
 
-test-exclude@^4.2.1:
-  version "4.2.3"
-  resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20"
-  integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==
-  dependencies:
-    arrify "^1.0.1"
-    micromatch "^2.3.11"
-    object-assign "^4.1.0"
-    read-pkg-up "^1.0.1"
-    require-main-filename "^1.0.1"
-
-throat@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836"
-  integrity sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==
-
 tmatch@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/tmatch/-/tmatch-2.0.1.tgz#0c56246f33f30da1b8d3d72895abaf16660f38cf"
   integrity sha1-DFYkbzPzDaG409colauvFmYPOM8=
 
-tmpl@1.0.x:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
-  integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
-
-to-fast-properties@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
-  integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
-
 to-fast-properties@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
   integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
 
 tough-cookie@^2.3.2, tough-cookie@~2.5.0:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
@@ -3387,21 +1909,16 @@ tough-cookie@^2.3.2, tough-cookie@~2.5.0
     psl "^1.1.28"
     punycode "^2.1.1"
 
 tr46@~0.0.3:
   version "0.0.3"
   resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
   integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
 
-trim-right@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
-  integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
-
 tunnel-agent@^0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
   integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
   dependencies:
     safe-buffer "^5.0.1"
 
 tweetnacl@^0.14.3, tweetnacl@~0.14.0:
@@ -3411,24 +1928,16 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
 
 type-check@~0.3.2:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
   integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
   dependencies:
     prelude-ls "~1.1.2"
 
-uglify-js@^3.1.4:
-  version "3.8.0"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.8.0.tgz#f3541ae97b2f048d7e7e3aa4f39fd8a1f5d7a805"
-  integrity sha512-ugNSTT8ierCsDHso2jkBHXYrU8Y5/fY2ZUprfrJUiD7YpuFvV4jODLFmb3h4btQjqr5Nh4TX4XtgDfCU1WdioQ==
-  dependencies:
-    commander "~2.20.3"
-    source-map "~0.6.1"
-
 uri-js@^4.2.2:
   version "4.2.2"
   resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
   integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
   dependencies:
     punycode "^2.1.0"
 
 util-deprecate@^1.0.1:
@@ -3446,45 +1955,25 @@ util-deprecate@^1.0.1:
     is-generator-function "^1.0.7"
     safe-buffer "^5.1.2"
 
 uuid@^3.3.2:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
   integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
 
-validate-npm-package-license@^3.0.1:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
-  integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
-  dependencies:
-    spdx-correct "^3.0.0"
-    spdx-expression-parse "^3.0.0"
-
 verror@1.10.0:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
   integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
   dependencies:
     assert-plus "^1.0.0"
     core-util-is "1.0.2"
     extsprintf "^1.2.0"
 
-walker@~1.0.5:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
-  integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=
-  dependencies:
-    makeerror "1.0.x"
-
-watch@~0.10.0:
-  version "0.10.0"
-  resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc"
-  integrity sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=
-
 webidl-conversions@^3.0.0:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
   integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
 
 webidl-conversions@^4.0.0:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
@@ -3521,85 +2010,22 @@ which-collection@^1.0.0:
   resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
   integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
   dependencies:
     is-map "^2.0.1"
     is-set "^2.0.1"
     is-weakmap "^2.0.1"
     is-weakset "^2.0.1"
 
-which-module@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
-  integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
-
-which@^1.2.12, which@^1.3.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
-  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
-  dependencies:
-    isexe "^2.0.0"
-
 word-wrap@~1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
   integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
 
-wordwrap@~0.0.2:
-  version "0.0.3"
-  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
-  integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
-
-worker-farm@^1.3.1:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
-  integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
-  dependencies:
-    errno "~0.1.7"
-
-wrap-ansi@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
-  integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
-  dependencies:
-    string-width "^1.0.1"
-    strip-ansi "^3.0.1"
-
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
 xml-name-validator@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
   integrity sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=
-
-y18n@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
-  integrity sha1-bRX7qITAhnnA136I53WegR4H+kE=
-
-yargs-parser@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
-  integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=
-  dependencies:
-    camelcase "^3.0.0"
-
-yargs@^7.0.2:
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
-  integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=
-  dependencies:
-    camelcase "^3.0.0"
-    cliui "^3.2.0"
-    decamelize "^1.1.1"
-    get-caller-file "^1.0.1"
-    os-locale "^1.4.0"
-    read-pkg-up "^1.0.1"
-    require-directory "^2.1.1"
-    require-main-filename "^1.0.1"
-    set-blocking "^2.0.0"
-    string-width "^1.0.2"
-    which-module "^1.0.0"
-    y18n "^3.2.1"
-    yargs-parser "^5.0.0"
--- a/devtools/server/actors/resources/console-messages.js
+++ b/devtools/server/actors/resources/console-messages.js
@@ -68,16 +68,17 @@ class ConsoleMessageWatcher {
     const window =
       targetActor.targetType === Targets.TYPES.FRAME &&
       targetActor.typeName != "parentProcessTarget"
         ? targetActor.window
         : null;
 
     const listener = new ConsoleAPIListener(window, onConsoleAPICall, {
       excludeMessagesBoundToWindow: isTargetActorContentProcess,
+      matchExactWindow: targetActor.ignoreSubFrames,
       ...(targetActor.consoleAPIListenerOptions || {}),
     });
     this.listener = listener;
     listener.init();
 
     // It can happen that the targetActor does not have a window reference (e.g. in worker
     // thread, targetActor exposes a workerGlobal property)
     const winStartTime =
--- a/devtools/server/actors/resources/css-messages.js
+++ b/devtools/server/actors/resources/css-messages.js
@@ -62,16 +62,23 @@ class CSSMessageWatcher extends nsIConso
     if (this.isProcessTarget(targetActor)) {
       return !message.isFromPrivateWindow;
     }
 
     if (!message.innerWindowID) {
       return false;
     }
 
+    if (targetActor.ignoreSubFrames) {
+      return (
+        WebConsoleUtils.getInnerWindowId(targetActor.window) ===
+        message.innerWindowID
+      );
+    }
+
     const ids = WebConsoleUtils.getInnerWindowIDsForFrames(targetActor.window);
     return ids.includes(message.innerWindowID);
   }
 
   /**
    * Prepare an nsIScriptError to be sent to the client.
    *
    * @param nsIScriptError error
--- a/devtools/server/actors/resources/error-messages.js
+++ b/devtools/server/actors/resources/error-messages.js
@@ -73,16 +73,23 @@ class ErrorMessageWatcher extends nsICon
 
       return true;
     }
 
     if (!message.innerWindowID) {
       return false;
     }
 
+    if (targetActor.ignoreSubFrames) {
+      return (
+        WebConsoleUtils.getInnerWindowId(targetActor.window) ===
+        message.innerWindowID
+      );
+    }
+
     const ids = WebConsoleUtils.getInnerWindowIDsForFrames(targetActor.window);
     return ids.includes(message.innerWindowID);
   }
 
   /**
    * Check if the given message category is allowed to be tracked or not.
    * We ignore chrome-originating errors as we only care about content.
    *
--- a/devtools/server/actors/webconsole.js
+++ b/devtools/server/actors/webconsole.js
@@ -621,30 +621,36 @@ const WebConsoleActor = ActorClassWithSp
         case "PageError":
           // Workers don't support this message type yet
           if (isWorker) {
             break;
           }
           if (!this.consoleServiceListener) {
             this.consoleServiceListener = new ConsoleServiceListener(
               global,
-              this.onConsoleServiceMessage
+              this.onConsoleServiceMessage,
+              {
+                matchExactWindow: this.parentActor.ignoreSubFrames,
+              }
             );
             this.consoleServiceListener.init();
           }
           startedListeners.push(event);
           break;
         case "ConsoleAPI":
           if (!this.consoleAPIListener) {
             // Create the consoleAPIListener
             // (and apply the filtering options defined in the parent actor).
             this.consoleAPIListener = new ConsoleAPIListener(
               global,
               this.onConsoleAPICall,
-              this.parentActor.consoleAPIListenerOptions
+              {
+                matchExactWindow: this.parentActor.ignoreSubFrames,
+                ...(this.parentActor.consoleAPIListenerOptions || {}),
+              }
             );
             this.consoleAPIListener.init();
           }
           startedListeners.push(event);
           break;
         case "NetworkActivity":
           // Workers don't support this message type
           if (isWorker) {
@@ -1504,16 +1510,18 @@ const WebConsoleActor = ActorClassWithSp
     CONSOLE_WORKER_IDS.forEach(id => {
       ConsoleAPIStorage.clearEvents(id);
     });
 
     if (this.parentActor.isRootActor || !this.global) {
       // If were dealing with the root actor (e.g. the browser console), we want
       // to remove all cached messages, not only the ones specific to a window.
       Services.console.reset();
+    } else if (this.parentActor.ignoreSubFrames) {
+      Services.console.resetWindow(windowId);
     } else {
       WebConsoleUtils.getInnerWindowIDsForFrames(this.global).forEach(id =>
         Services.console.resetWindow(id)
       );
     }
   },
 
   /**
--- a/devtools/server/actors/webconsole/listeners/console-api.js
+++ b/devtools/server/actors/webconsole/listeners/console-api.js
@@ -25,23 +25,30 @@ const {
  * @param Function handler
  *        This function is invoked with one argument, the Console API message that comes
  *        from the observer service, whenever a relevant console API call is received.
  * @param object filteringOptions
  *        Optional - The filteringOptions that this listener should listen to:
  *        - addonId: filter console messages based on the addonId.
  *        - excludeMessagesBoundToWindow: Set to true to filter out messages that
  *          are bound to a specific window.
+ *        - matchExactWindow: Set to true to match the messages on a specific window (when
+ *          `window` is defined) and not on the whole window tree.
  */
 class ConsoleAPIListener {
-  constructor(window, handler, { addonId, excludeMessagesBoundToWindow } = {}) {
+  constructor(
+    window,
+    handler,
+    { addonId, excludeMessagesBoundToWindow, matchExactWindow } = {}
+  ) {
     this.window = window;
     this.handler = handler;
     this.addonId = addonId;
     this.excludeMessagesBoundToWindow = excludeMessagesBoundToWindow;
+    this.matchExactWindow = matchExactWindow;
   }
 
   QueryInterface = ChromeUtils.generateQI([Ci.nsIObserver]);
 
   /**
    * The content window for which we listen to window.console API calls.
    * @type nsIDOMWindow
    */
@@ -134,24 +141,27 @@ class ConsoleAPIListener {
       if (
         this.excludeMessagesBoundToWindow &&
         // If innerID is 0, the message isn't actually bound to a window.
         message.innerID
       ) {
         return false;
       }
 
-      if (
-        this.window &&
-        !WebConsoleUtils.getInnerWindowIDsForFrames(this.window).includes(
-          message.innerID
-        )
-      ) {
-        // Not the same window!
-        return false;
+      if (this.window) {
+        const matchesWindow = this.matchExactWindow
+          ? WebConsoleUtils.getInnerWindowId(this.window) === message.innerID
+          : WebConsoleUtils.getInnerWindowIDsForFrames(this.window).includes(
+              message.innerID
+            );
+
+        if (!matchesWindow) {
+          // Not the same window!
+          return false;
+        }
       }
     }
 
     if (this.addonId) {
       // ConsoleAPI.jsm messages contains a consoleID, (and it is currently
       // used in Addon SDK add-ons), the standard 'console' object
       // (which is used in regular webpages and in WebExtensions pages)
       // contains the originAttributes of the source document principal.
@@ -189,17 +199,20 @@ class ConsoleAPIListener {
       "@mozilla.org/consoleAPI-storage;1"
     ].getService(Ci.nsIConsoleAPIStorage);
 
     // if !this.window, we're in a browser console. Retrieve all events
     // for filtering based on privacy.
     if (!this.window) {
       messages = ConsoleAPIStorage.getEvents();
     } else {
-      const ids = WebConsoleUtils.getInnerWindowIDsForFrames(this.window);
+      const ids = this.matchExactWindow
+        ? [WebConsoleUtils.getInnerWindowId(this.window)]
+        : WebConsoleUtils.getInnerWindowIDsForFrames(this.window);
+
       ids.forEach(id => {
         messages = messages.concat(ConsoleAPIStorage.getEvents(id));
       });
     }
 
     CONSOLE_WORKER_IDS.forEach(id => {
       messages = messages.concat(ConsoleAPIStorage.getEvents(id));
     });
--- a/devtools/server/actors/webconsole/listeners/console-service.js
+++ b/devtools/server/actors/webconsole/listeners/console-service.js
@@ -18,21 +18,26 @@ const { WebConsoleUtils } = require("dev
  *
  * @constructor
  * @param nsIDOMWindow [window]
  *        Optional - the window object for which we are created. This is used
  *        for filtering out messages that belong to other windows.
  * @param Function handler
  *        This function is invoked with one argument, the nsIConsoleMessage, whenever a
  *        relevant message is received.
+ * @param object filteringOptions
+ *        Optional - The filteringOptions that this listener should listen to:
+ *        - matchExactWindow: Set to true to match the messages on a specific window (when
+ *          `window` is defined) and not on the whole window tree.
  */
 class ConsoleServiceListener {
-  constructor(window, handler) {
+  constructor(window, handler, { matchExactWindow } = {}) {
     this.window = window;
     this.handler = handler;
+    this.matchExactWindow = matchExactWindow;
   }
 
   QueryInterface = ChromeUtils.generateQI([Ci.nsIConsoleListener]);
 
   /**
    * The content window for which we listen to page errors.
    * @type nsIDOMWindow
    */
@@ -71,17 +76,26 @@ class ConsoleServiceListener {
         !this.isCategoryAllowed(message.category)
       ) {
         return;
       }
 
       const errorWindow = Services.wm.getOuterWindowWithId(
         message.outerWindowID
       );
-      if (!errorWindow || !isWindowIncluded(this.window, errorWindow)) {
+
+      if (!errorWindow) {
+        return;
+      }
+
+      if (this.matchExactWindow && this.window !== errorWindow) {
+        return;
+      }
+
+      if (!isWindowIncluded(this.window, errorWindow)) {
         return;
       }
     }
 
     // Don't display messages triggered by eager evaluation.
     if (message.sourceName === "debugger eager eval code") {
       return;
     }
@@ -135,17 +149,19 @@ class ConsoleServiceListener {
             return false;
           }
         }
 
         return true;
       });
     }
 
-    const ids = WebConsoleUtils.getInnerWindowIDsForFrames(this.window);
+    const ids = this.matchExactWindow
+      ? [WebConsoleUtils.getInnerWindowId(this.window)]
+      : WebConsoleUtils.getInnerWindowIDsForFrames(this.window);
 
     return errors.filter(error => {
       if (error instanceof Ci.nsIScriptError) {
         if (!includePrivate && error.isFromPrivateWindow) {
           return false;
         }
         if (
           ids &&
--- a/devtools/server/tests/chrome/memory-helpers.js
+++ b/devtools/server/tests/chrome/memory-helpers.js
@@ -23,17 +23,30 @@ SimpleTest.registerCleanupFunction(funct
 });
 
 async function getTargetForSelectedTab() {
   const browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
   const commands = await CommandsFactory.forTab(
     browserWindow.gBrowser.selectedTab
   );
   await commands.targetCommand.startListening();
-  return commands.targetCommand.targetFront;
+  const isEveryFrameTargetEnabled = Services.prefs.getBoolPref(
+    "devtools.every-frame-target.enabled",
+    false
+  );
+  if (!isEveryFrameTargetEnabled) {
+    return commands.targetCommand.targetFront;
+  }
+
+  // If EFT is enabled, we need to retrieve the target of the test document
+  const targets = await commands.targetCommand.getAllTargets([
+    commands.targetCommand.TYPES.FRAME,
+  ]);
+
+  return targets.find(t => t.url !== "chrome://mochikit/content/harness.xhtml");
 }
 
 async function startServerAndGetSelectedTabMemory() {
   const target = await getTargetForSelectedTab();
   const memory = await target.getFront("memory");
   return { memory, target };
 }
 
--- a/devtools/shared/commands/resource/tests/browser_resources_console_messages.js
+++ b/devtools/shared/commands/resource/tests/browser_resources_console_messages.js
@@ -137,17 +137,17 @@ async function testTabConsoleMessagesRes
   const targetDocumentUrl = executeInIframe ? IFRAME_URL : FISSION_TEST_URL;
   const expectedRuntimeConsoleCalls = getExpectedRuntimeConsoleCalls(
     targetDocumentUrl
   );
   await waitUntil(
     () => availableResources.length === expectedRuntimeConsoleCalls.length
   );
   const expectedTargetFront =
-    executeInIframe && isFissionEnabled()
+    executeInIframe && (isFissionEnabled() || isEveryFrameTargetEnabled())
       ? targetCommand
           .getAllTargets([targetCommand.TYPES.FRAME])
           .find(target => target.url == IFRAME_URL)
       : targetCommand.targetFront;
   for (let i = 0; i < expectedRuntimeConsoleCalls.length; i++) {
     const resource = availableResources[i];
     const { message, targetFront } = resource;
     is(
--- a/devtools/shared/commands/resource/tests/browser_resources_thread_states.js
+++ b/devtools/shared/commands/resource/tests/browser_resources_thread_states.js
@@ -480,27 +480,27 @@ async function checkDebuggerStatementInI
       where: {
         line: 1,
         column: 0,
       },
     },
   });
 
   const iframeTarget = threadState.targetFront;
-  if (isFissionEnabled()) {
+  if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
     is(
       iframeTarget.url,
       REMOTE_IFRAME_URL,
-      "With fission, the pause is from the iframe's target"
+      "With fission/EFT, the pause is from the iframe's target"
     );
   } else {
     is(
       iframeTarget,
       targetCommand.targetFront,
-      "Without fission, the pause is from the top level target"
+      "Without fission/EFT, the pause is from the top level target"
     );
   }
   const { threadFront } = iframeTarget;
 
   await threadFront.resume();
 
   await waitFor(
     () => availableResources.length == 1,
--- a/devtools/shared/commands/target/tests/browser_target_command_bfcache.js
+++ b/devtools/shared/commands/target/tests/browser_target_command_bfcache.js
@@ -302,23 +302,23 @@ async function testIframeNavigations() {
       targetFront.targetType,
       TYPES.FRAME,
       "We are only notified about frame targets"
     );
     targets.push(targetFront);
   };
   await targetCommand.watchTargets([TYPES.FRAME], onAvailable);
 
-  // When fission is off, there isn't much to test for iframes as they are debugged
+  // When fission/EFT is off, there isn't much to test for iframes as they are debugged
   // when the unique top level target
-  if (!isFissionEnabled()) {
+  if (!isFissionEnabled() && !isEveryFrameTargetEnabled()) {
     is(
       targets.length,
       1,
-      "when fission is off, there is only the top level target"
+      "Without fission/EFT, there is only the top level target"
     );
     return;
   }
   is(targets.length, 2, "retrieved the top level and the iframe targets");
   is(
     targets[0],
     targetCommand.targetFront,
     "the first target is the top level one"
--- a/devtools/shared/commands/target/tests/browser_target_command_frames.js
+++ b/devtools/shared/commands/target/tests/browser_target_command_frames.js
@@ -363,21 +363,22 @@ async function testTabFrames(mainRoot) {
   const targetCommand = commands.targetCommand;
   const { TYPES } = targetCommand;
 
   await targetCommand.startListening();
 
   // Check that calling getAllTargets([frame]) return the same target instances
   const frames = await targetCommand.getAllTargets([TYPES.FRAME]);
   // When fission is enabled, we also get the remote example.org iframe.
-  const expectedFramesCount = isFissionEnabled() ? 2 : 1;
+  const expectedFramesCount =
+    isFissionEnabled() || isEveryFrameTargetEnabled() ? 2 : 1;
   is(
     frames.length,
     expectedFramesCount,
-    "retrieved only the top level document"
+    "retrieved the expected number of targets"
   );
 
   // Assert that watchTargets will call the create callback for all existing frames
   const targets = [];
   const destroyedTargets = [];
   const topLevelTarget = targetCommand.targetFront;
   const onAvailable = ({ targetFront, isTargetSwitching }) => {
     is(
@@ -425,17 +426,17 @@ async function testTabFrames(mainRoot) {
     true,
     "First target is a top level one"
   );
   is(
     !targets[0].isTargetSwitching,
     true,
     "First target is not considered as a target switching"
   );
-  if (isFissionEnabled()) {
+  if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
     is(
       targets[1].targetFront.url,
       IFRAME_URL,
       "Second target should be the iframe one"
     );
     is(
       !targets[1].targetFront.isTopLevel,
       true,
@@ -464,17 +465,17 @@ async function testTabFrames(mainRoot) {
       ? targetCommand.once("processed-available-target")
       : null;
 
   const browser = tab.linkedBrowser;
   const onLoaded = BrowserTestUtils.browserLoaded(browser);
   await BrowserTestUtils.loadURI(browser, SECOND_PAGE_URL);
   await onLoaded;
 
-  if (isFissionEnabled()) {
+  if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
     const afterNavigationFramesCount = 3;
     await waitFor(
       () => targets.length == afterNavigationFramesCount,
       "Wait for all expected targets after navigation"
     );
     is(
       targets.length,
       afterNavigationFramesCount,
--- a/devtools/shared/css/generated/mach_commands.py
+++ b/devtools/shared/css/generated/mach_commands.py
@@ -14,111 +14,109 @@ import logging
 import os
 import runpy
 import sys
 import string
 import subprocess
 from mozbuild import shellutil
 from mozbuild.base import (
     MozbuildObject,
-    MachCommandBase,
     BinaryNotFoundException,
 )
 from mach.decorators import (
-    CommandProvider,
     Command,
 )
 
 
 def resolve_path(start, relativePath):
     """Helper to resolve a path from a start, and a relative path"""
     return os.path.normpath(os.path.join(start, relativePath))
 
 
 def stringify(obj):
     """Helper to stringify to JSON"""
     return json.dumps(obj, sort_keys=True, indent=2, separators=(",", ": "))
 
 
-@CommandProvider
-class MachCommands(MachCommandBase):
-    @Command(
-        "devtools-css-db",
-        category="post-build",
-        description="Rebuild the devtool's static css properties database.",
-    )
-    def generate_css_db(self, command_context):
-        """Generate the static css properties database for devtools and write it to file."""
+@Command(
+    "devtools-css-db",
+    category="post-build",
+    description="Rebuild the devtool's static css properties database.",
+)
+def generate_css_db(command_context):
+    """Generate the static css properties database for devtools and write it to file."""
 
-        print("Re-generating the css properties database...")
-        db = self.get_properties_db_from_xpcshell(command_context)
-        if not db:
-            return 1
+    print("Re-generating the css properties database...")
+    db = get_properties_db_from_xpcshell(command_context)
+    if not db:
+        return 1
 
-        self.output_template(
-            command_context,
-            {
-                "preferences": stringify(db["preferences"]),
-                "cssProperties": stringify(db["cssProperties"]),
-                "pseudoElements": stringify(db["pseudoElements"]),
-            },
-        )
+    output_template(
+        command_context,
+        {
+            "preferences": stringify(db["preferences"]),
+            "cssProperties": stringify(db["cssProperties"]),
+            "pseudoElements": stringify(db["pseudoElements"]),
+        },
+    )
+
 
-    def get_properties_db_from_xpcshell(self, command_context):
-        """Generate the static css properties db for devtools from an xpcshell script."""
-        build = MozbuildObject.from_environment()
+def get_properties_db_from_xpcshell(command_context):
+    """Generate the static css properties db for devtools from an xpcshell script."""
+    build = MozbuildObject.from_environment()
 
-        # Get the paths
-        script_path = resolve_path(
-            command_context.topsrcdir,
-            "devtools/shared/css/generated/generate-properties-db.js",
+    # Get the paths
+    script_path = resolve_path(
+        command_context.topsrcdir,
+        "devtools/shared/css/generated/generate-properties-db.js",
+    )
+    gre_path = resolve_path(command_context.topobjdir, "dist/bin")
+    browser_path = resolve_path(command_context.topobjdir, "dist/bin/browser")
+    try:
+        xpcshell_path = build.get_binary_path(what="xpcshell")
+    except BinaryNotFoundException as e:
+        command_context.log(
+            logging.ERROR, "devtools-css-db", {"error": str(e)}, "ERROR: {error}"
         )
-        gre_path = resolve_path(command_context.topobjdir, "dist/bin")
-        browser_path = resolve_path(command_context.topobjdir, "dist/bin/browser")
-        try:
-            xpcshell_path = build.get_binary_path(what="xpcshell")
-        except BinaryNotFoundException as e:
-            command_context.log(
-                logging.ERROR, "devtools-css-db", {"error": str(e)}, "ERROR: {error}"
-            )
-            command_context.log(
-                logging.INFO, "devtools-css-db", {"help": e.help()}, "{help}"
-            )
-            return None
-
-        print(browser_path)
-
-        sub_env = dict(os.environ)
-        if sys.platform.startswith("linux"):
-            sub_env["LD_LIBRARY_PATH"] = gre_path
-
-        # Run the xcpshell script, and set the appdir flag to the browser path so that
-        # we have the proper dependencies for requiring the loader.
-        contents = subprocess.check_output(
-            [xpcshell_path, "-g", gre_path, "-a", browser_path, script_path],
-            env=sub_env,
+        command_context.log(
+            logging.INFO, "devtools-css-db", {"help": e.help()}, "{help}"
         )
-        # Extract just the output between the delimiters as the xpcshell output can
-        # have extra output that we don't want.
-        contents = contents.decode().split("DEVTOOLS_CSS_DB_DELIMITER")[1]
+        return None
+
+    print(browser_path)
+
+    sub_env = dict(os.environ)
+    if sys.platform.startswith("linux"):
+        sub_env["LD_LIBRARY_PATH"] = gre_path
 
-        return json.loads(contents)
+    # Run the xcpshell script, and set the appdir flag to the browser path so that
+    # we have the proper dependencies for requiring the loader.
+    contents = subprocess.check_output(
+        [xpcshell_path, "-g", gre_path, "-a", browser_path, script_path],
+        env=sub_env,
+    )
+    # Extract just the output between the delimiters as the xpcshell output can
+    # have extra output that we don't want.
+    contents = contents.decode().split("DEVTOOLS_CSS_DB_DELIMITER")[1]
+
+    return json.loads(contents)
+
 
-    def output_template(self, command_context, substitutions):
-        """Output a the properties-db.js from a template."""
-        js_template_path = resolve_path(
-            command_context.topsrcdir,
-            "devtools/shared/css/generated/properties-db.js.in",
-        )
-        destination_path = resolve_path(
-            command_context.topsrcdir, "devtools/shared/css/generated/properties-db.js"
-        )
+def output_template(command_context, substitutions):
+    """Output a the properties-db.js from a template."""
+    js_template_path = resolve_path(
+        command_context.topsrcdir,
+        "devtools/shared/css/generated/properties-db.js.in",
+    )
+    destination_path = resolve_path(
+        command_context.topsrcdir, "devtools/shared/css/generated/properties-db.js"
+    )
 
-        with open(js_template_path, "rb") as handle:
-            js_template = handle.read().decode()
+    with open(js_template_path, "rb") as handle:
+        js_template = handle.read().decode()
 
-        preamble = "/* THIS IS AN AUTOGENERATED FILE.  DO NOT EDIT */\n\n"
-        contents = string.Template(js_template).substitute(substitutions)
+    preamble = "/* THIS IS AN AUTOGENERATED FILE.  DO NOT EDIT */\n\n"
+    contents = string.Template(js_template).substitute(substitutions)
 
-        with open(destination_path, "wb") as destination:
-            destination.write(preamble.encode() + contents.encode())
+    with open(destination_path, "wb") as destination:
+        destination.write(preamble.encode() + contents.encode())
 
-        print("The database was successfully generated at " + destination_path)
+    print("The database was successfully generated at " + destination_path)
--- a/devtools/shared/webconsole/test/chrome/test_consoleapi_innerID.html
+++ b/devtools/shared/webconsole/test/chrome/test_consoleapi_innerID.html
@@ -17,17 +17,17 @@
 SimpleTest.waitForExplicitFinish();
 
 let expectedConsoleCalls = [];
 
 function doConsoleCalls(aState)
 {
   const { ConsoleAPI } = ChromeUtils.import("resource://gre/modules/Console.jsm");
   const console = new ConsoleAPI({
-    innerID: window.windowGlobalChild.innerWindowId
+    innerID: window.top.windowGlobalChild.innerWindowId
   });
 
   const longString = (new Array(DevToolsServer.LONG_STRING_LENGTH + 2)).join("a");
 
   console.log("foobarBaz-log", undefined);
   console.info("foobarBaz-info", null);
   console.warn("foobarBaz-warn", top.document.documentElement);
   console.debug(null);
--- a/dom/base/nsFrameLoader.cpp
+++ b/dom/base/nsFrameLoader.cpp
@@ -3350,23 +3350,31 @@ already_AddRefed<Promise> nsFrameLoader:
     return nullptr;
   }
 
 #ifndef NS_PRINTING
   promise->MaybeRejectWithNotSupportedError("Build does not support printing");
   return promise.forget();
 #else
   auto resolve = [promise](PrintPreviewResultInfo aInfo) {
+    using Orientation = dom::PrintPreviewOrientation;
     if (aInfo.sheetCount() > 0) {
       PrintPreviewSuccessInfo info;
       info.mSheetCount = aInfo.sheetCount();
       info.mTotalPageCount = aInfo.totalPageCount();
       info.mHasSelection = aInfo.hasSelection();
       info.mHasSelfSelection = aInfo.hasSelfSelection();
       info.mIsEmpty = aInfo.isEmpty();
+      if (aInfo.printLandscape()) {
+        info.mOrientation = aInfo.printLandscape().value()
+                                ? Orientation::Landscape
+                                : Orientation::Portrait;
+      } else {
+        MOZ_ASSERT(info.mOrientation == Orientation::Unspecified);
+      }
       promise->MaybeResolve(info);
     } else {
       promise->MaybeRejectWithUnknownError("Print preview failed");
     }
   };
 
   if (auto* browserParent = GetBrowserParent()) {
     nsCOMPtr<nsIPrintSettingsService> printSettingsSvc =
--- a/dom/bindings/mach_commands.py
+++ b/dom/bindings/mach_commands.py
@@ -4,70 +4,65 @@
 
 from __future__ import absolute_import, unicode_literals
 
 import os
 import sys
 
 from mach.decorators import (
     CommandArgument,
-    CommandProvider,
     Command,
 )
 
-from mozbuild.base import MachCommandBase
 from mozbuild.util import mkdir
 
 
 def get_test_parser():
     import runtests
 
     return runtests.get_parser
 
 
-@CommandProvider
-class WebIDLProvider(MachCommandBase):
-    @Command(
-        "webidl-example",
-        category="misc",
-        description="Generate example files for a WebIDL interface.",
-    )
-    @CommandArgument(
-        "interface", nargs="+", help="Interface(s) whose examples to generate."
-    )
-    def webidl_example(self, command_context, interface):
-        from mozwebidlcodegen import BuildSystemWebIDL
+@Command(
+    "webidl-example",
+    category="misc",
+    description="Generate example files for a WebIDL interface.",
+)
+@CommandArgument(
+    "interface", nargs="+", help="Interface(s) whose examples to generate."
+)
+def webidl_example(command_context, interface):
+    from mozwebidlcodegen import BuildSystemWebIDL
 
-        manager = command_context._spawn(BuildSystemWebIDL).manager
-        for i in interface:
-            manager.generate_example_files(i)
+    manager = command_context._spawn(BuildSystemWebIDL).manager
+    for i in interface:
+        manager.generate_example_files(i)
+
 
-    @Command(
-        "webidl-parser-test",
-        category="testing",
-        parser=get_test_parser,
-        description="Run WebIDL tests (Interface Browser parser).",
-    )
-    def webidl_test(self, command_context, **kwargs):
-        sys.path.insert(
-            0, os.path.join(command_context.topsrcdir, "other-licenses", "ply")
-        )
+@Command(
+    "webidl-parser-test",
+    category="testing",
+    parser=get_test_parser,
+    description="Run WebIDL tests (Interface Browser parser).",
+)
+def webidl_test(command_context, **kwargs):
+    sys.path.insert(0, os.path.join(command_context.topsrcdir, "other-licenses", "ply"))
 
-        # Ensure the topobjdir exists. On a Taskcluster test run there won't be
-        # an objdir yet.
-        mkdir(command_context.topobjdir)
+    # Ensure the topobjdir exists. On a Taskcluster test run there won't be
+    # an objdir yet.
+    mkdir(command_context.topobjdir)
 
-        # Make sure we drop our cached grammar bits in the objdir, not
-        # wherever we happen to be running from.
-        os.chdir(command_context.topobjdir)
+    # Make sure we drop our cached grammar bits in the objdir, not
+    # wherever we happen to be running from.
+    os.chdir(command_context.topobjdir)
 
-        if kwargs["verbose"] is None:
-            kwargs["verbose"] = False
+    if kwargs["verbose"] is None:
+        kwargs["verbose"] = False
 
-        # Now we're going to create the cached grammar file in the
-        # objdir.  But we're going to try loading it as a python
-        # module, so we need to make sure the objdir is in our search
-        # path.
-        sys.path.insert(0, command_context.topobjdir)
+    # Now we're going to create the cached grammar file in the
+    # objdir.  But we're going to try loading it as a python
+    # module, so we need to make sure the objdir is in our search
+    # path.
+    sys.path.insert(0, command_context.topobjdir)
 
-        import runtests
+    import runtests
 
-        return runtests.run_tests(kwargs["tests"], verbose=kwargs["verbose"])
+    return runtests.run_tests(kwargs["tests"], verbose=kwargs["verbose"])
--- a/dom/chrome-webidl/FrameLoader.webidl
+++ b/dom/chrome-webidl/FrameLoader.webidl
@@ -198,16 +198,22 @@ interface FrameLoader {
  */
 interface mixin WebBrowserPersistable
 {
   [Throws]
   void startPersistence(BrowsingContext? aContext,
                         nsIWebBrowserPersistDocumentReceiver aRecv);
 };
 
+enum PrintPreviewOrientation {
+    "landscape",
+    "portrait",
+    "unspecified"
+};
+
 /**
  * Interface for the object that's used to resolve the Promise returned from
  * FrameLoader.printPreview() if that method successfully creates the print
  * preview document/successfully updates it with new settings.
  */
 [GenerateConversionToJS]
 dictionary PrintPreviewSuccessInfo {
   /**
@@ -233,11 +239,16 @@ dictionary PrintPreviewSuccessInfo {
    * printed.
    */
   boolean hasSelection = false;
 
   /**
    * Whether the previewed document has a selection itself.
    */
   boolean hasSelfSelection = false;
+
+  /**
+   * Specified orientation of the document, or "unspecified".
+   */
+  PrintPreviewOrientation orientation = "unspecified";
 };
 
 FrameLoader includes WebBrowserPersistable;
--- a/dom/ipc/BrowserChild.cpp
+++ b/dom/ipc/BrowserChild.cpp
@@ -2473,18 +2473,18 @@ mozilla::ipc::IPCResult BrowserChild::Re
 mozilla::ipc::IPCResult BrowserChild::RecvPrintPreview(
     const PrintData& aPrintData, const MaybeDiscardedBrowsingContext& aSourceBC,
     PrintPreviewResolver&& aCallback) {
 #ifdef NS_PRINTING
   // If we didn't succeed in passing off ownership of aCallback, then something
   // went wrong.
   auto sendCallbackError = MakeScopeExit([&] {
     if (aCallback) {
-      aCallback(
-          PrintPreviewResultInfo(0, 0, false, false, false));  // signal error
+      // signal error
+      aCallback(PrintPreviewResultInfo(0, 0, false, false, false, {}));
     }
   });
 
   if (NS_WARN_IF(aSourceBC.IsDiscarded())) {
     return IPC_OK();
   }
 
   RefPtr<nsGlobalWindowOuter> sourceWindow;
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -163,16 +163,19 @@ struct PrintPreviewResultInfo
 {
   uint32_t sheetCount;
   uint32_t totalPageCount;
   bool isEmpty;
   // Whether there's a selection in the previewed page, including its subframes.
   bool hasSelection;
   // Whether there's a selection in the previewed page, excluding its subframes.
   bool hasSelfSelection;
+  // If present, indicates if the page should be printed landscape when true or
+  // portrait when false;
+  bool? printLandscape;
 };
 
 /**
  * A PBrowser manages a maximal locally connected subtree of BrowsingContexts
  * in a content process.
  *
  * See `dom/docs/Fission-IPC-Diagram.svg` for an overview of the DOM IPC
  * actors.
--- a/dom/payments/PaymentRequest.cpp
+++ b/dom/payments/PaymentRequest.cpp
@@ -870,28 +870,31 @@ void PaymentRequest::RespondAbortPayment
   if (mUpdateError.Failed()) {
     // Respond show with mUpdateError, set mUpdating to false.
     mUpdating = false;
     RespondShowPayment(u""_ns, ResponseData(), u""_ns, u""_ns, u""_ns,
                        std::move(mUpdateError));
     return;
   }
 
-  MOZ_ASSERT(mAbortPromise);
-  MOZ_ASSERT(mState == eInteractive);
+  if (mState != eInteractive) {
+    return;
+  }
 
-  if (aSuccess) {
-    mAbortPromise->MaybeResolve(JS::UndefinedHandleValue);
-    mAbortPromise = nullptr;
-    ErrorResult abortResult;
-    abortResult.ThrowAbortError("The PaymentRequest is aborted");
-    RejectShowPayment(std::move(abortResult));
-  } else {
-    mAbortPromise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR);
-    mAbortPromise = nullptr;
+  if (mAbortPromise) {
+    if (aSuccess) {
+      mAbortPromise->MaybeResolve(JS::UndefinedHandleValue);
+      mAbortPromise = nullptr;
+      ErrorResult abortResult;
+      abortResult.ThrowAbortError("The PaymentRequest is aborted");
+      RejectShowPayment(std::move(abortResult));
+    } else {
+      mAbortPromise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR);
+      mAbortPromise = nullptr;
+    }
   }
 }
 
 void PaymentRequest::UpdatePayment(JSContext* aCx,
                                    const PaymentDetailsUpdate& aDetails,
                                    ErrorResult& aRv) {
   MOZ_ASSERT(aCx);
   if (mState != eInteractive) {
--- a/gfx/layers/wr/WebRenderCommandBuilder.cpp
+++ b/gfx/layers/wr/WebRenderCommandBuilder.cpp
@@ -2404,49 +2404,26 @@ WebRenderCommandBuilder::GenerateFallbac
   fallbackData->mBounds = paintBounds;
   fallbackData->mBuildingRect = buildingRect;
 
   MOZ_ASSERT(fallbackData->GetImageKey());
 
   return fallbackData.forget();
 }
 
-class WebRenderMaskData : public WebRenderUserData {
- public:
-  explicit WebRenderMaskData(RenderRootStateManager* aManager,
-                             nsDisplayItem* aItem)
-      : WebRenderUserData(aManager, aItem),
-        mMaskStyle(nsStyleImageLayers::LayerType::Mask),
-        mShouldHandleOpacity(false) {
-    MOZ_COUNT_CTOR(WebRenderMaskData);
+void WebRenderMaskData::ClearImageKey() {
+  if (mBlobKey) {
+    mManager->AddBlobImageKeyForDiscard(mBlobKey.value());
   }
-  virtual ~WebRenderMaskData() {
-    MOZ_COUNT_DTOR(WebRenderMaskData);
-    ClearImageKey();
-  }
+  mBlobKey.reset();
+}
 
-  void ClearImageKey() {
-    if (mBlobKey) {
-      mManager->AddBlobImageKeyForDiscard(mBlobKey.value());
-    }
-    mBlobKey.reset();
-  }
-
-  UserDataType GetType() override { return UserDataType::eMask; }
-  static UserDataType Type() { return UserDataType::eMask; }
-
-  Maybe<wr::BlobImageKey> mBlobKey;
-  std::vector<RefPtr<gfx::ScaledFont>> mFonts;
-  std::vector<RefPtr<gfx::SourceSurface>> mExternalSurfaces;
-  LayerIntRect mItemRect;
-  nsPoint mMaskOffset;
-  nsStyleImageLayers mMaskStyle;
-  gfx::Size mScale;
-  bool mShouldHandleOpacity;
-};
+void WebRenderMaskData::Invalidate() {
+  mMaskStyle = nsStyleImageLayers(nsStyleImageLayers::LayerType::Mask);
+}
 
 Maybe<wr::ImageMask> WebRenderCommandBuilder::BuildWrMaskImage(
     nsDisplayMasksAndClipPaths* aMaskItem, wr::DisplayListBuilder& aBuilder,
     wr::IpcResourceUpdateQueue& aResources, const StackingContextHelper& aSc,
     nsDisplayListBuilder* aDisplayListBuilder,
     const LayoutDeviceRect& aBounds) {
   RefPtr<WebRenderMaskData> maskData =
       CreateOrRecycleWebRenderUserData<WebRenderMaskData>(aMaskItem);
--- a/gfx/layers/wr/WebRenderUserData.h
+++ b/gfx/layers/wr/WebRenderUserData.h
@@ -340,16 +340,46 @@ class WebRenderRemoteData : public WebRe
   void SetRemoteBrowser(dom::RemoteBrowser* aBrowser) {
     mRemoteBrowser = aBrowser;
   }
 
  protected:
   RefPtr<dom::RemoteBrowser> mRemoteBrowser;
 };
 
+class WebRenderMaskData : public WebRenderUserData {
+ public:
+  explicit WebRenderMaskData(RenderRootStateManager* aManager,
+                             nsDisplayItem* aItem)
+      : WebRenderUserData(aManager, aItem),
+        mMaskStyle(nsStyleImageLayers::LayerType::Mask),
+        mShouldHandleOpacity(false) {
+    MOZ_COUNT_CTOR(WebRenderMaskData);
+  }
+  virtual ~WebRenderMaskData() {
+    MOZ_COUNT_DTOR(WebRenderMaskData);
+    ClearImageKey();
+  }
+
+  void ClearImageKey();
+  void Invalidate();
+
+  UserDataType GetType() override { return UserDataType::eMask; }
+  static UserDataType Type() { return UserDataType::eMask; }
+
+  Maybe<wr::BlobImageKey> mBlobKey;
+  std::vector<RefPtr<gfx::ScaledFont>> mFonts;
+  std::vector<RefPtr<gfx::SourceSurface>> mExternalSurfaces;
+  LayerIntRect mItemRect;
+  nsPoint mMaskOffset;
+  nsStyleImageLayers mMaskStyle;
+  gfx::Size mScale;
+  bool mShouldHandleOpacity;
+};
+
 extern void DestroyWebRenderUserDataTable(WebRenderUserDataTable* aTable);
 
 struct WebRenderUserDataProperty {
   NS_DECLARE_FRAME_PROPERTY_WITH_DTOR(Key, WebRenderUserDataTable,
                                       DestroyWebRenderUserDataTable)