Merge m-c to oak
authorRobert Strong <robert.bugzilla@gmail.com>
Sun, 09 Jul 2017 18:20:48 -0700
changeset 1476318 ce471a4b26b7800986f79b57cbb8d9def69c4682
parent 1476317 9d3ad87f013ccf0da488de279557b70964950e4e (current diff)
parent 1179838 a418121d46250f91728b86d9eea331029c264c30 (diff)
child 1476319 4460ab10a645a030ad99cf4e9a4aca798046734c
push id263306
push usercatlee@mozilla.com
push dateFri, 06 Apr 2018 15:43:50 +0000
treeherdertry@a0bfb6549eeb [default view] [failures only]
milestone56.0a1
Merge m-c to oak
browser/app/profile/firefox.js
browser/base/content/browser.js
browser/base/content/test/general/browser.ini
browser/installer/package-manifest.in
dom/presentation/PresentationDeviceInfoManager.js
dom/presentation/PresentationDeviceInfoManager.jsm
dom/presentation/PresentationDeviceInfoManager.manifest
dom/presentation/tests/mochitest/test_presentation_device_info.html
dom/presentation/tests/mochitest/test_presentation_device_info_permission.html
dom/webidl/PresentationDeviceInfoManager.webidl
mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/RectUtils.java
old-configure.in
toolkit/components/telemetry/Histograms.json
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -1,23 +1,36 @@
 {
     // See https://go.microsoft.com/fwlink/?LinkId=733558
     // for the documentation about the tasks.json format
     "version": "2.0.0",
-    "command": "${workspaceRoot}/mach",
+    "windows": {
+      "command": "\"\\mozilla-build\\start-shell.bat mach\""
+    },
+    "osx": {
+      "command": "${workspaceRoot}/mach"
+    },
+    "linux": {
+      "command": "${workspaceRoot}/mach"
+    },
     "isShellCommand": true,
     "args": ["--log-no-times"],
     "showOutput": "silent",
     "echoCommand": true,
     "suppressTaskName": false,
     "tasks": [
       {
         "taskName": "clobber"
       },
       {
+        "taskName": "clobber-python",
+        "suppressTaskName": true,
+        "args": ["clobber", "python"]
+      },
+      {
         "taskName": "configure"
       },
       {
         "taskName": "build",
         "isBuildCommand": true,
         "problemMatcher": {
           "owner": "cpp",
           "fileLocation": "absolute",
@@ -27,32 +40,36 @@
             "line": 2,
             "column": 3,
             "severity": 4,
             "message": 5
           }
         }
       },
       {
-        "taskName": "build binaries",
+        "taskName": "build-binaries",
+        "suppressTaskName": true,
+        "args": ["build", "binaries"],
         "problemMatcher": {
           "owner": "cpp",
           "fileLocation": "absolute",
           "pattern": {
             "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
             "file": 1,
             "line": 2,
             "column": 3,
             "severity": 4,
             "message": 5
           }
         }
       },
       {
-        "taskName": "build faster",
+        "taskName": "build-faster",
+        "suppressTaskName": true,
+        "args": ["build", "faster"],
         "problemMatcher": {
           "owner": "cpp",
           "fileLocation": "absolute",
           "pattern": {
             "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
             "file": 1,
             "line": 2,
             "column": 3,
@@ -62,21 +79,27 @@
         }
       },
       {
         "taskName": "run",
         "args": ["-purgecaches"],
         "showOutput": "always"
       },
       {
+        "taskName": "lint-wo",
+        "suppressTaskName": true,
+        "args": ["lint", "-wo"],
+        "problemMatcher": ["$eslint-stylish"]
+      },
+      {
         "taskName": "eslint",
         "problemMatcher": ["$eslint-stylish"]
       },
       {
-        "taskName": "eslint fix",
+        "taskName": "eslint-fix",
         "suppressTaskName": true,
         "args": ["eslint", "--fix", "${file}"],
         "problemMatcher": ["$eslint-stylish"]
       },
       {
         "taskName": "test",
         "args": ["${relativeFile}"],
         "isTestCommand": true,
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -232,16 +232,18 @@ pref("general.skins.selectedSkin", "clas
 
 pref("general.smoothScroll", true);
 #ifdef UNIX_BUT_NOT_MAC
 pref("general.autoScroll", false);
 #else
 pref("general.autoScroll", true);
 #endif
 
+pref("browser.stopReloadAnimation.enabled", true);
+
 // UI density of the browser chrome. This mostly affects toolbarbutton
 // and urlbar spacing. The possible values are 0=normal, 1=compact, 2=touch.
 pref("browser.uidensity", 0);
 // Whether Firefox will automatically override the uidensity to "touch"
 // while the user is in a touch environment (such as Windows tablet mode).
 #ifdef MOZ_PHOTON_THEME
 pref("browser.touchmode.auto", true);
 #else
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -4556,17 +4556,17 @@ var XULBrowserWindow = {
 
       this.isBusy = true;
 
       if (!(aStateFlags & nsIWebProgressListener.STATE_RESTORING)) {
         this._busyUI = true;
 
         // XXX: This needs to be based on window activity...
         this.stopCommand.removeAttribute("disabled");
-        CombinedStopReload.switchToStop();
+        CombinedStopReload.switchToStop(aRequest, aWebProgress);
       }
     } else if (aStateFlags & nsIWebProgressListener.STATE_STOP) {
       // This (thanks to the filter) is a network stop or the last
       // request stop outside of loading the document, stop throbbers
       // and progress bars and such
       if (aRequest) {
         let msg = "";
         let location;
@@ -4610,17 +4610,17 @@ var XULBrowserWindow = {
       }
 
       this.isBusy = false;
 
       if (this._busyUI) {
         this._busyUI = false;
 
         this.stopCommand.setAttribute("disabled", "true");
-        CombinedStopReload.switchToReload(aRequest instanceof Ci.nsIRequest);
+        CombinedStopReload.switchToReload(aRequest, aWebProgress);
       }
     }
   },
 
   onLocationChange(aWebProgress, aRequest, aLocationURI, aFlags) {
     var location = aLocationURI ? aLocationURI.spec : "";
 
     // If displayed, hide the form validation popup.
@@ -4916,51 +4916,120 @@ var CombinedStopReload = {
       return;
 
     this._initialized = true;
     if (XULBrowserWindow.stopCommand.getAttribute("disabled") != "true")
       reload.setAttribute("displaystop", "true");
     stop.addEventListener("click", this);
     this.reload = reload;
     this.stop = stop;
+    this.stopReloadContainer = this.reload.parentNode;
+
+    // Disable animations until the browser has fully loaded.
+    this.animate = false;
+    let startupInfo = Cc["@mozilla.org/toolkit/app-startup;1"]
+                        .getService(Ci.nsIAppStartup)
+                        .getStartupInfo();
+    if (startupInfo.sessionRestored) {
+      this.startAnimationPrefMonitoring();
+    } else {
+      Services.obs.addObserver(this, "sessionstore-windows-restored");
+    }
   },
 
   uninit() {
     if (!this._initialized)
       return;
 
+    Services.prefs.removeObserver("toolkit.cosmeticAnimations.enabled", this);
     this._cancelTransition();
     this._initialized = false;
     this.stop.removeEventListener("click", this);
+    this.stopReloadContainer.removeEventListener("animationend", this);
+    this.stopReloadContainer = null;
     this.reload = null;
     this.stop = null;
   },
 
   handleEvent(event) {
-    // the only event we listen to is "click" on the stop button
-    if (event.button == 0 &&
-        !this.stop.disabled)
-      this._stopClicked = true;
-  },
-
-  switchToStop() {
+    switch (event.type) {
+      case "click":
+        if (event.button == 0 &&
+            !this.stop.disabled) {
+          this._stopClicked = true;
+        }
+      case "animationend": {
+        if (event.target.classList.contains("toolbarbutton-animatable-image") &&
+            (event.animationName == "reload-to-stop" ||
+             event.animationName == "stop-to-reload" ||
+             event.animationName == "reload-to-stop-rtl" ||
+             event.animationName == "stop-to-reload-rtl")) {
+          this.stopReloadContainer.removeAttribute("animate");
+        }
+      }
+    }
+  },
+
+  observe(subject, topic, data) {
+    if (topic == "sessionstore-windows-restored") {
+      Services.obs.removeObserver(this, "sessionstore-windows-restored");
+      this.startAnimationPrefMonitoring();
+    } else if (topic == "nsPref:changed") {
+      this.animate = Services.prefs.getBoolPref("toolkit.cosmeticAnimations.enabled");
+    }
+  },
+
+  startAnimationPrefMonitoring() {
+    requestIdleCallback(() => {
+      // CombinedStopReload may have been uninitialized before the idleCallback is executed.
+      if (!this._initialized)
+        return;
+      this.animate = Services.prefs.getBoolPref("toolkit.cosmeticAnimations.enabled") &&
+                     Services.prefs.getBoolPref("browser.stopReloadAnimation.enabled");
+      Services.prefs.addObserver("toolkit.cosmeticAnimations.enabled", this);
+      this.stopReloadContainer.addEventListener("animationend", this);
+    });
+  },
+
+  switchToStop(aRequest, aWebProgress) {
     if (!this._initialized)
       return;
 
+    let shouldAnimate = AppConstants.MOZ_PHOTON_ANIMATIONS &&
+                        aRequest instanceof Ci.nsIRequest &&
+                        aWebProgress.isTopLevel &&
+                        aWebProgress.isLoadingDocument &&
+                        this.animate;
+
     this._cancelTransition();
+    if (shouldAnimate)
+      this.stopReloadContainer.setAttribute("animate", "true");
+    else
+      this.stopReloadContainer.removeAttribute("animate");
     this.reload.setAttribute("displaystop", "true");
   },
 
-  switchToReload(aDelay) {
+  switchToReload(aRequest, aWebProgress) {
     if (!this._initialized)
       return;
 
+    let shouldAnimate = AppConstants.MOZ_PHOTON_ANIMATIONS &&
+                        aRequest instanceof Ci.nsIRequest &&
+                        aWebProgress.isTopLevel &&
+                        !aWebProgress.isLoadingDocument &&
+                        this.animate;
+
+    if (shouldAnimate)
+      this.stopReloadContainer.setAttribute("animate", "true");
+    else
+      this.stopReloadContainer.removeAttribute("animate");
+
     this.reload.removeAttribute("displaystop");
 
-    if (!aDelay || this._stopClicked) {
+    if (!shouldAnimate || this._stopClicked) {
       this._stopClicked = false;
       this._cancelTransition();
       this.reload.disabled = XULBrowserWindow.reloadCommand
                                              .getAttribute("disabled") == "true";
       return;
     }
 
     if (this._timer)
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -781,21 +781,29 @@
                          context="backForwardMenu"/>
           <toolbaritem id="stop-reload-button"
                        removable="false" overflows="false"
                        class="chromeclass-toolbar-additional">
             <toolbarbutton id="reload-button"
                            class="toolbarbutton-1"
                            command="Browser:ReloadOrDuplicate"
                            onclick="checkForMiddleClick(this, event);"
-                           tooltip="dynamic-shortcut-tooltip"/>
+                           tooltip="dynamic-shortcut-tooltip">
+              <box class="toolbarbutton-animatable-box">
+                <image class="toolbarbutton-animatable-image"/>
+              </box>
+            </toolbarbutton>
             <toolbarbutton id="stop-button"
                            class="toolbarbutton-1"
                            command="Browser:Stop"
-                           tooltip="dynamic-shortcut-tooltip"/>
+                           tooltip="dynamic-shortcut-tooltip">
+              <box class="toolbarbutton-animatable-box">
+                <image class="toolbarbutton-animatable-image"/>
+              </box>
+            </toolbarbutton>
           </toolbaritem>
 #endif
           <hbox id="urlbar-wrapper" flex="1">
 #ifndef MOZ_PHOTON_THEME
             <toolbarbutton id="forward-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
                            label="&forwardCmd.label;"
                            command="Browser:ForwardOrForwardDuplicate"
                            onclick="checkForMiddleClick(this, event);"
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -1147,22 +1147,20 @@
                 (!oldBrowser.blockedPopups && newBrowser.blockedPopups))
               updateBlockedPopups = true;
 
             this.mCurrentBrowser = newBrowser;
             this.mCurrentTab = this.tabContainer.selectedItem;
             this.showTab(this.mCurrentTab);
 
             var forwardButtonContainer = document.getElementById("urlbar-wrapper");
-            if (forwardButtonContainer) {
-              forwardButtonContainer.setAttribute("switchingtabs", "true");
-              window.addEventListener("MozAfterPaint", function() {
-                forwardButtonContainer.removeAttribute("switchingtabs");
-              }, {once: true});
-            }
+            forwardButtonContainer.setAttribute("switchingtabs", "true");
+            window.addEventListener("MozAfterPaint", function() {
+              forwardButtonContainer.removeAttribute("switchingtabs");
+            }, {once: true});
 
             this._appendStatusPanel();
 
             if (updateBlockedPopups)
               this.mCurrentBrowser.updateBlockedPopups();
 
             // Update the URL bar.
             var loc = this.mCurrentBrowser.currentURI;
--- a/browser/base/content/test/general/browser.ini
+++ b/browser/base/content/test/general/browser.ini
@@ -99,16 +99,17 @@ support-files =
 [browser_aboutSupport.js]
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_aboutSupport_newtab_security_state.js]
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_aboutHealthReport.js]
 skip-if = os == "linux" # Bug 924307
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_aboutHome.js]
+skip-if = true # Bug 1374537
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_aboutHome_wrapsCorrectly.js]
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_addKeywordSearch.js]
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_alltabslistener.js]
 # DO NOT ADD MORE TESTS HERE. USE A TOPICAL DIRECTORY INSTEAD.
 [browser_audioTabIcon.js]
--- a/browser/base/content/test/static/browser_all_files_referenced.js
+++ b/browser/base/content/test/static/browser_all_files_referenced.js
@@ -161,18 +161,16 @@ var whitelist = [
   // Bug 1351078
   {file: "resource://gre/modules/Battery.jsm"},
   // Bug 1351070
   {file: "resource://gre/modules/ContentPrefInstance.jsm"},
   // Bug 1351079
   {file: "resource://gre/modules/ISO8601DateUtils.jsm"},
   // Bug 1337345
   {file: "resource://gre/modules/Manifest.jsm"},
-  // Bug 1351089
-  {file: "resource://gre/modules/PresentationDeviceInfoManager.jsm"},
   // Bug 1351097
   {file: "resource://gre/modules/accessibility/AccessFu.jsm"},
   // Bug 1351637
   {file: "resource://gre/modules/sdk/bootstrap.js"},
 
 ];
 
 if (!AppConstants.MOZ_PHOTON_THEME) {
--- a/browser/components/sessionstore/test/browser.ini
+++ b/browser/components/sessionstore/test/browser.ini
@@ -234,17 +234,17 @@ skip-if = os == "mac" || (os == "linux" 
 run-if = e10s
 [browser_async_window_flushing.js]
 [browser_forget_async_closings.js]
 [browser_newtab_userTypedValue.js]
 [browser_parentProcessRestoreHash.js]
 run-if = e10s
 [browser_sessionStoreContainer.js]
 [browser_windowStateContainer.js]
-skip-if = os == "linux" && !debug
+skip-if = true # bug 1364764
 [browser_1234021.js]
 [browser_remoteness_flip_on_restore.js]
 run-if = e10s
 [browser_background_tab_crash.js]
 run-if = e10s && crashreporter
 
 # Disabled on debug for frequent intermittent failures:
 [browser_undoCloseById.js]
--- a/browser/experiments/Experiments.jsm
+++ b/browser/experiments/Experiments.jsm
@@ -159,24 +159,40 @@ function loadJSONAsync(file, options) {
 // Returns a promise that is resolved with the AddonInstall for that URL.
 function addonInstallForURL(url, hash) {
   return AddonManager.getInstallForURL(url, null, "application/x-xpinstall", hash);
 }
 
 // Returns a promise that is resolved with an Array<Addon> of the installed
 // experiment addons.
 function installedExperimentAddons() {
-  return AddonManager.getAddonsByTypes(["experiment"]).then(addons => {
+  return AddonManager.getActiveAddons(["experiment"]).then(addons => {
     return addons.filter(a => !a.appDisabled);
   });
 }
 
 // Takes an Array<Addon> and returns a promise that is resolved when the
 // addons are uninstalled.
-function uninstallAddons(addons) {
+async function uninstallAddons(addons) {
+  if (!AddonManagerPrivate.isDBLoaded()) {
+    await new Promise(resolve => {
+      Services.obs.addObserver({
+        observe(subject, topic, data) {
+          Services.obs.removeObserver(this, "xpi-database-loaded");
+          resolve();
+        },
+      }, "xpi-database-loaded");
+    });
+
+    // This function was called during startup so the addons that were
+    // passed in were partial addon objects.  Now that the full addons
+    // database is loaded, get proper Addon objects.
+    addons = await AddonManager.getAddonsByIDs(addons.map(a => a.id));
+  }
+
   let ids = new Set(addons.map(addon => addon.id));
   return new Promise(resolve => {
 
     let listener = {};
     listener.onUninstalled = addon => {
       if (!ids.has(addon.id)) {
         return;
       }
@@ -186,20 +202,16 @@ function uninstallAddons(addons) {
         AddonManager.removeAddonListener(listener);
         resolve();
       }
     };
 
     AddonManager.addAddonListener(listener);
 
     for (let addon of addons) {
-      // Disabling the add-on before uninstalling is necessary to cause tests to
-      // pass. This might be indicative of a bug in XPIProvider.
-      // TODO follow up in bug 992396.
-      addon.userDisabled = true;
       addon.uninstall();
     }
 
   });
 }
 
 /**
  * The experiments module.
--- a/browser/experiments/test/xpcshell/head.js
+++ b/browser/experiments/test/xpcshell/head.js
@@ -150,16 +150,17 @@ const {
 
 // Starts the addon manager without creating app info. We can't directly use
 // |loadAddonManager| defined above in test_conditions.js as it would make the test fail.
 function startAddonManagerOnly() {
   let addonManager = Cc["@mozilla.org/addons/integration;1"]
                        .getService(Ci.nsIObserver)
                        .QueryInterface(Ci.nsITimerCallback);
   addonManager.observe(null, "addons-startup", null);
+  Services.obs.notifyObservers(null, "sessionstore-windows-restored");
 }
 
 function getExperimentAddons(previous = false) {
   return new Promise(resolve => {
 
     AddonManager.getAddonsByTypes(["experiment"], (addons) => {
       if (previous) {
         resolve(addons);
--- a/browser/extensions/onboarding/content/onboarding.css
+++ b/browser/extensions/onboarding/content/onboarding.css
@@ -130,18 +130,19 @@
 
 #onboarding-tour-list > li:dir(rtl) {
   background-position-x: right 17px;
 }
 
 #onboarding-tour-list > li.onboarding-complete::before {
   content: url("img/icons_tour-complete.svg");
   position: relative;
-  left: 6px;
+  offset-inline-start: 3px;
   top: -10px;
+  float: inline-start;
 }
 
 #onboarding-tour-list > li.onboarding-complete {
   padding-inline-start: 29px;
 }
 
 #onboarding-tour-list > li.onboarding-active,
 #onboarding-tour-list > li:hover {
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -541,18 +541,16 @@
 
 #ifdef MOZ_WEBSPEECH
 @RESPATH@/components/dom_webspeechsynth.xpt
 #endif
 
 @RESPATH@/components/nsAsyncShutdown.manifest
 @RESPATH@/components/nsAsyncShutdown.js
 
-@RESPATH@/components/PresentationDeviceInfoManager.manifest
-@RESPATH@/components/PresentationDeviceInfoManager.js
 @RESPATH@/components/BuiltinProviders.manifest
 @RESPATH@/components/PresentationControlService.js
 @RESPATH@/components/PresentationDataChannelSessionTransport.js
 @RESPATH@/components/PresentationDataChannelSessionTransport.manifest
 
 #ifdef ENABLE_INTL_API
 @RESPATH@/components/mozIntl.manifest
 @RESPATH@/components/mozIntl.js
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/icons/reload-to-stop.svg
@@ -0,0 +1,1550 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="756" height="20" fill="context-fill">
+  <svg width="18" height="20" x="0" y="0">
+    <defs>
+      <clipPath id="b">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="e" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.27 18.622) scale(7.36622)"/>
+      </mask>
+      <mask id="d" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="a" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="c" mask-type="alpha">
+        <g filter="url(#a)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#b)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#c)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#d)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#e)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="18" y="0">
+    <defs>
+      <clipPath id="g">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="j" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.26 18.622) scale(7.3132)"/>
+      </mask>
+      <mask id="i" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="f" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="h" mask-type="alpha">
+        <g filter="url(#f)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#g)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#h)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#i)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#j)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="36" y="0">
+    <defs>
+      <clipPath id="l">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="o" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.25 18.622) scale(7.2471)"/>
+      </mask>
+      <mask id="n" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="k" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="m" mask-type="alpha">
+        <g filter="url(#k)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#l)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#m)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#n)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#o)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="54" y="0">
+    <defs>
+      <clipPath id="q">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="t" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.238 18.622) scale(7.16624)"/>
+      </mask>
+      <mask id="s" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="p" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="r" mask-type="alpha">
+        <g filter="url(#p)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#q)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#r)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#s)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#t)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="72" y="0">
+    <defs>
+      <clipPath id="v">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="y" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.223 18.622) scale(7.06864)"/>
+      </mask>
+      <mask id="x" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="u" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="w" mask-type="alpha">
+        <g filter="url(#u)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#v)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#w)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#x)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#y)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="90" y="0">
+    <defs>
+      <clipPath id="A">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="D" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.204 18.622) scale(6.95179)"/>
+      </mask>
+      <mask id="C" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.15 1.705) scale(7.47174)"/>
+      </mask>
+      <filter id="z" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="B" mask-type="alpha">
+        <g filter="url(#z)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#A)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#B)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#C)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#D)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="108" y="0">
+    <defs>
+      <clipPath id="F">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="I" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.183 18.622) scale(6.81253)"/>
+      </mask>
+      <mask id="H" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.149 1.705) scale(7.45936)"/>
+      </mask>
+      <filter id="E" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="G" mask-type="alpha">
+        <g filter="url(#E)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#F)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#G)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#H)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#I)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="126" y="0">
+    <defs>
+      <clipPath id="K">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="N" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.157 18.622) scale(6.6468)"/>
+      </mask>
+      <mask id="M" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.145 1.705) scale(7.43823)"/>
+      </mask>
+      <filter id="J" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="L" mask-type="alpha">
+        <g filter="url(#J)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#K)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#L)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#M)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#N)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="144" y="0">
+    <defs>
+      <clipPath id="P">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="S" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.126 18.622) scale(6.44921)"/>
+      </mask>
+      <mask id="R" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.14 1.705) scale(7.40751)"/>
+      </mask>
+      <filter id="O" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="Q" mask-type="alpha">
+        <g filter="url(#O)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#P)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#Q)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#R)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#S)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="162" y="0">
+    <defs>
+      <clipPath id="U">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="X" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.09 18.622) scale(6.21239)"/>
+      </mask>
+      <mask id="W" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.134 1.705) scale(7.36622)"/>
+      </mask>
+      <filter id="T" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="V" mask-type="alpha">
+        <g filter="url(#T)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#U)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#V)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#W)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#X)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="180" y="0">
+    <defs>
+      <clipPath id="Z">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="ac" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.044 18.622) scale(5.92587)"/>
+      </mask>
+      <mask id="ab" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.126 1.705) scale(7.3132)"/>
+      </mask>
+      <filter id="Y" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aa" mask-type="alpha">
+        <g filter="url(#Y)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#Z)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aa)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#ab)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#ac)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="198" y="0">
+    <defs>
+      <clipPath id="ae">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="ah" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.99 18.622) scale(5.57409)"/>
+      </mask>
+      <mask id="ag" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.116 1.705) scale(7.2471)"/>
+      </mask>
+      <filter id="ad" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="af" mask-type="alpha">
+        <g filter="url(#ad)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#ae)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#af)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#ag)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#ah)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="216" y="0">
+    <defs>
+      <clipPath id="aj">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="am" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.92 18.622) scale(5.13258)"/>
+      </mask>
+      <mask id="al" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.103 1.705) scale(7.16624)"/>
+      </mask>
+      <filter id="ai" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="ak" mask-type="alpha">
+        <g filter="url(#ai)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aj)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#ak)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#al)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#am)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="234" y="0">
+    <defs>
+      <clipPath id="ao">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="ar" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.831 18.622) scale(4.56057)"/>
+      </mask>
+      <mask id="aq" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.088 1.705) scale(7.06864)"/>
+      </mask>
+      <filter id="an" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="ap" mask-type="alpha">
+        <g filter="url(#an)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#ao)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#ap)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aq)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#ar)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="252" y="0">
+    <defs>
+      <clipPath id="at">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aw" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.711 18.622) scale(3.7901)"/>
+      </mask>
+      <mask id="av" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.07 1.705) scale(6.95179)"/>
+      </mask>
+      <filter id="as" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="au" mask-type="alpha">
+        <g filter="url(#as)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#at)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#au)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#av)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aw)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="270" y="0">
+    <defs>
+      <clipPath id="ay">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aB" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.55 18.622) scale(2.75815)"/>
+      </mask>
+      <mask id="aA" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.048 1.705) scale(6.81253)"/>
+      </mask>
+      <filter id="ax" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="az" mask-type="alpha">
+        <g filter="url(#ax)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#ay)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#az)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aA)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aB)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="288" y="0">
+    <defs>
+      <clipPath id="aD">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aG" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.386 18.622) scale(1.70603)"/>
+      </mask>
+      <mask id="aF" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.022 1.705) scale(6.6468)"/>
+      </mask>
+      <filter id="aC" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aE" mask-type="alpha">
+        <g filter="url(#aC)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aD)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aE)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aF)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aG)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="306" y="0">
+    <defs>
+      <clipPath id="aI">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aL" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.284 18.622) scale(1.05114)"/>
+      </mask>
+      <mask id="aK" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.991 1.705) scale(6.44921)"/>
+      </mask>
+      <filter id="aH" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aJ" mask-type="alpha">
+        <g filter="url(#aH)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aI)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aJ)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aK)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aL)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="324" y="0">
+    <defs>
+      <clipPath id="aN">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aQ" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.233 18.622) scale(.72448)"/>
+      </mask>
+      <mask id="aP" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.954 1.705) scale(6.21239)"/>
+      </mask>
+      <filter id="aM" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aO" mask-type="alpha">
+        <g filter="url(#aM)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aN)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aO)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aP)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aQ)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="342" y="0">
+    <defs>
+      <clipPath id="aS">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aV" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.21 18.622) scale(.57983)"/>
+      </mask>
+      <mask id="aU" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.91 1.705) scale(5.92587)"/>
+      </mask>
+      <filter id="aR" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aT" mask-type="alpha">
+        <g filter="url(#aR)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aS)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aT)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aU)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aV)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="360" y="0">
+    <defs>
+      <clipPath id="aX">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="ba" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="aZ" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.855 1.705) scale(5.57409)"/>
+      </mask>
+      <filter id="aW" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aY" mask-type="alpha">
+        <g filter="url(#aW)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aX)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aY)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aZ)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#ba)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="378" y="0">
+    <defs>
+      <clipPath id="bc">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bf" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="be" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.786 1.705) scale(5.13258)"/>
+      </mask>
+      <filter id="bb" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bd" mask-type="alpha">
+        <g filter="url(#bb)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bc)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bd)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#be)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bf)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="396" y="0">
+    <defs>
+      <clipPath id="bh">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bk" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="bj" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.696 1.705) scale(4.56057)"/>
+      </mask>
+      <filter id="bg" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bi" mask-type="alpha">
+        <g filter="url(#bg)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bh)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bi)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bj)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bk)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="414" y="0">
+    <defs>
+      <clipPath id="bm">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bp" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="bo" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.576 1.705) scale(3.7901)"/>
+      </mask>
+      <filter id="bl" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bn" mask-type="alpha">
+        <g filter="url(#bl)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bm)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bn)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bo)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bp)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="432" y="0">
+    <defs>
+      <clipPath id="br">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bu" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="bt" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.415 1.705) scale(2.75815)"/>
+      </mask>
+      <filter id="bq" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bs" mask-type="alpha">
+        <g filter="url(#bq)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#br)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bs)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bt)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bu)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="450" y="0">
+    <defs>
+      <clipPath id="bw">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bz" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="by" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.251 1.705) scale(1.70603)"/>
+      </mask>
+      <filter id="bv" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bx" mask-type="alpha">
+        <g filter="url(#bv)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bw)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bx)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#by)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bz)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="468" y="0">
+    <defs>
+      <clipPath id="bB">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bE" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="bD" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.149 1.705) scale(1.05114)"/>
+      </mask>
+      <filter id="bA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bC" mask-type="alpha">
+        <g filter="url(#bA)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bB)">
+      <path d="M8.078 15.533l.175-.088a.077.077 0 0 0-.069-.137l-.343.173a.077.077 0 0 0-.034.103l.173.344a.077.077 0 0 0 .137-.07l-.083-.166" opacity=".077"/>
+      <g opacity=".037" mask="url(#bC)">
+        <path d="M7.1 16.725a6.994 6.994 0 0 0 8.632-4.832 6.994 6.994 0 0 0-11.54-6.98 6.954 6.954 0 0 0-2.19 4.89 1 1 0 0 0 2 .056 5.02 5.02 0 1 1 3.066 4.72"/>
+      </g>
+      <g mask="url(#bD)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bE)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="486" y="0">
+    <defs>
+      <clipPath id="bG">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bJ" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="bI" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.098 1.705) scale(.72448)"/>
+      </mask>
+      <filter id="bF" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bH" mask-type="alpha">
+        <g filter="url(#bF)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bG)">
+      <path d="M6.335 14.837l.386-.065a.154.154 0 0 0-.05-.303l-.76.127a.154.154 0 0 0-.125.177l.127.759a.154.154 0 0 0 .304-.051l-.062-.367" opacity=".154"/>
+      <g opacity=".106" mask="url(#bH)">
+        <path d="M5.053 15.766a6.994 6.994 0 0 0 9.722-1.823A6.994 6.994 0 0 0 6.067 3.644a6.954 6.954 0 0 0-3.635 3.935 1 1 0 0 0 1.876.692 5.02 5.02 0 1 1 1.4 5.451"/>
+      </g>
+      <g mask="url(#bI)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bJ)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="504" y="0">
+    <defs>
+      <clipPath id="bL">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bO" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="bN" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.075 1.705) scale(.57983)"/>
+      </mask>
+      <filter id="bK" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bM" mask-type="alpha">
+        <g filter="url(#bK)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bL)">
+      <path d="M4.936 13.618l.583.078a.23.23 0 0 0 .062-.457l-1.143-.154a.23.23 0 0 0-.26.197l-.155 1.144a.23.23 0 0 0 .458.062l.075-.553" opacity=".231"/>
+      <g opacity=".186" mask="url(#bM)">
+        <path d="M3.419 14.205a6.994 6.994 0 0 0 9.795 1.375A6.994 6.994 0 0 0 8.25 3.04a6.954 6.954 0 0 0-4.702 2.57 1 1 0 0 0 1.557 1.253 5.02 5.02 0 1 1-.414 5.613"/>
+      </g>
+      <g mask="url(#bN)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bO)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="522" y="0">
+    <defs>
+      <clipPath id="bQ">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bT" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="bS" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="bP" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bR" mask-type="alpha">
+        <g filter="url(#bP)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bQ)">
+      <path d="M4.032 12.022l.71.33a.308.308 0 0 0 .26-.558l-1.395-.648a.308.308 0 0 0-.409.15L2.55 12.69a.308.308 0 0 0 .558.26l.314-.675" opacity=".308"/>
+      <g opacity=".272" mask="url(#bR)">
+        <path d="M2.368 12.203a6.994 6.994 0 0 0 8.845 4.43 6.994 6.994 0 0 0-.703-13.468 6.954 6.954 0 0 0-5.275.933A1 1 0 0 0 6.31 5.784a5.02 5.02 0 1 1-2.184 5.187"/>
+      </g>
+      <g mask="url(#bS)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bT)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="540" y="0">
+    <defs>
+      <clipPath id="bV">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bY" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="bX" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="bU" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bW" mask-type="alpha">
+        <g filter="url(#bU)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bV)">
+      <path d="M3.712 10.234l.727.658a.385.385 0 0 0 .516-.57L3.53 9.032a.385.385 0 0 0-.543.027l-1.291 1.425a.385.385 0 0 0 .57.516l.624-.689" opacity=".385"/>
+      <g opacity=".362" mask="url(#bW)">
+        <path d="M2.012 9.97a6.994 6.994 0 0 0 6.967 7.023 6.994 6.994 0 0 0 3.634-12.988 6.954 6.954 0 0 0-5.297-.8 1 1 0 0 0 .48 1.941 5.02 5.02 0 1 1-3.725 4.219"/>
+      </g>
+      <g mask="url(#bX)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bY)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="558" y="0">
+    <defs>
+      <clipPath id="ca">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cd" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="cc" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="bZ" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cb" mask-type="alpha">
+        <g filter="url(#bZ)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#ca)">
+      <path d="M4.004 8.46l.6 1.013a.462.462 0 0 0 .794-.47L4.223 7.017a.462.462 0 0 0-.633-.162L1.604 8.03a.462.462 0 0 0 .47.794l.96-.568" opacity=".462"/>
+      <g opacity=".454" mask="url(#cb)">
+        <path d="M2.387 7.742a6.994 6.994 0 0 0 4.361 8.879 6.994 6.994 0 0 0 7.59-11.15 6.954 6.954 0 0 0-4.765-2.448 1 1 0 0 0-.164 1.993 5.02 5.02 0 1 1-4.877 2.809"/>
+      </g>
+      <g mask="url(#cc)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cd)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="576" y="0">
+    <defs>
+      <clipPath id="cf">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="ci" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="ch" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="ce" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cg" mask-type="alpha">
+        <g filter="url(#ce)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cf)">
+      <path d="M4.864 6.9l.318 1.335a.539.539 0 0 0 1.048-.25l-.624-2.618a.539.539 0 0 0-.648-.4l-2.62.624a.539.539 0 0 0 .25 1.047l1.267-.301" opacity=".538"/>
+      <g opacity=".546" mask="url(#cg)">
+        <path d="M3.454 5.749a6.994 6.994 0 0 0 1.299 9.806 6.994 6.994 0 0 0 10.751-8.142A6.954 6.954 0 0 0 11.77 3.57a1 1 0 0 0-.791 1.836A5.02 5.02 0 1 1 5.46 6.512"/>
+      </g>
+      <g mask="url(#ch)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#ci)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="594" y="0">
+    <defs>
+      <clipPath id="ck">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cn" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="cm" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="cj" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cl" mask-type="alpha">
+        <g filter="url(#cj)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#ck)">
+      <path d="M6.187 5.726L6.08 7.291a.616.616 0 0 0 1.228.083l.207-3.07a.616.616 0 0 0-.573-.655l-3.07-.207A.616.616 0 0 0 3.79 4.67l1.485.1" opacity=".615"/>
+      <g opacity=".638" mask="url(#cl)">
+        <path d="M5.101 4.2a6.994 6.994 0 0 0-1.9 9.709A6.994 6.994 0 0 0 15.99 9.624a6.954 6.954 0 0 0-2.313-4.833 1 1 0 0 0-1.336 1.488 5.02 5.02 0 1 1-5.582-.714"/>
+      </g>
+      <g mask="url(#cm)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cn)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="612" y="0">
+    <defs>
+      <clipPath id="cp">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cs" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="cr" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="co" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cq" mask-type="alpha">
+        <g filter="url(#co)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cp)">
+      <path d="M7.815 5.069L7.18 6.715a.693.693 0 0 0 1.292.498l1.245-3.23a.693.693 0 0 0-.397-.895L6.09 1.843a.693.693 0 0 0-.498 1.292l1.562.602" opacity=".692"/>
+      <g opacity=".728" mask="url(#cq)">
+        <path d="M7.156 3.26a6.994 6.994 0 0 0-4.899 8.593 6.994 6.994 0 0 0 13.487.022 6.954 6.954 0 0 0-.649-5.318 1 1 0 0 0-1.741.983 5.02 5.02 0 1 1-5.062-2.459"/>
+      </g>
+      <g mask="url(#cr)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cs)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="630" y="0">
+    <defs>
+      <clipPath id="cu">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cx" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="cw" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="ct" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cv" mask-type="alpha">
+        <g filter="url(#ct)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cu)">
+      <path d="M9.559 4.997L8.343 6.535a.77.77 0 0 0 1.208.954l2.384-3.018a.77.77 0 0 0-.127-1.08L8.79 1.006a.77.77 0 0 0-.954 1.208l1.46 1.153" opacity=".769"/>
+      <g opacity=".814" mask="url(#cv)">
+        <path d="M9.404 3.024a6.994 6.994 0 0 0-7.386 6.58 6.994 6.994 0 0 0 12.775 4.326 6.954 6.954 0 0 0 1.082-5.247 1 1 0 0 0-1.964.376 5.02 5.02 0 1 1-4.013-3.946"/>
+      </g>
+      <g mask="url(#cw)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cx)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="648" y="0">
+    <defs>
+      <clipPath id="cz">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cC" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="cB" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="cy" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cA" mask-type="alpha">
+        <g filter="url(#cy)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cz)">
+      <path d="M11.218 5.514l-1.779 1.22a.846.846 0 0 0 .958 1.395l3.488-2.394a.846.846 0 0 0 .22-1.176L11.71 1.071a.846.846 0 0 0-1.395.957l1.158 1.687" opacity=".846"/>
+      <g opacity=".894" mask="url(#cA)">
+        <path d="M11.61 3.518a6.994 6.994 0 0 0-9.1 3.878 6.994 6.994 0 0 0 10.725 8.177 6.954 6.954 0 0 0 2.701-4.627 1 1 0 0 0-1.981-.27 5.02 5.02 0 1 1-2.543-5.02"/>
+      </g>
+      <g mask="url(#cB)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cC)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="666" y="0">
+    <defs>
+      <clipPath id="cE">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cH" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="cG" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="cD" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cF" mask-type="alpha">
+        <g filter="url(#cD)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cE)">
+      <path d="M12.6 6.556l-2.247.697a.923.923 0 0 0 .547 1.763l4.408-1.367a.923.923 0 0 0 .609-1.155L14.55 2.086a.923.923 0 0 0-1.764.546l.661 2.132" opacity=".923"/>
+      <g opacity=".963" mask="url(#cF)">
+        <path d="M13.543 4.69a6.994 6.994 0 0 0-9.862.77 6.994 6.994 0 0 0 7.553 11.174 6.954 6.954 0 0 0 4.037-3.523 1 1 0 0 0-1.791-.889 5.02 5.02 0 1 1-.807-5.57"/>
+      </g>
+      <g mask="url(#cG)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cH)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="684" y="0">
+    <defs>
+      <clipPath id="cJ">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cM" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="cL" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="cI" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cK" mask-type="alpha">
+        <g filter="url(#cI)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cJ)">
+      <path d="M13.549 8H11a1 1 0 0 0 0 2h5a1 1 0 0 0 1-1V4a1 1 0 0 0-2 0v2.418"/>
+      <g mask="url(#cK)">
+        <path d="M15 6.418A6.994 6.994 0 0 0 5.408 4 6.994 6.994 0 0 0 9 17a6.954 6.954 0 0 0 4.95-2.05 1 1 0 0 0-1.414-1.414A5.02 5.02 0 1 1 13.549 8"/>
+      </g>
+      <g mask="url(#cL)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cM)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="702" y="0">
+    <defs>
+      <clipPath id="cO">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cR" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="cQ" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="cN" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cP" mask-type="alpha">
+        <g filter="url(#cN)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cO)">
+      <path d="M13.549 8H11a1 1 0 0 0 0 2h5a1 1 0 0 0 1-1V4a1 1 0 0 0-2 0v2.418"/>
+      <g mask="url(#cP)">
+        <path d="M15 6.418A6.994 6.994 0 0 0 5.408 4 6.994 6.994 0 0 0 9 17a6.954 6.954 0 0 0 4.95-2.05 1 1 0 0 0-1.414-1.414A5.02 5.02 0 1 1 13.549 8"/>
+      </g>
+      <g mask="url(#cQ)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cR)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="720" y="0">
+    <defs>
+      <clipPath id="cT">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cW" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="cV" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="cS" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cU" mask-type="alpha">
+        <g filter="url(#cS)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cT)">
+      <path d="M13.549 8H11a1 1 0 0 0 0 2h5a1 1 0 0 0 1-1V4a1 1 0 0 0-2 0v2.418"/>
+      <g mask="url(#cU)">
+        <path d="M15 6.418A6.994 6.994 0 0 0 5.408 4 6.994 6.994 0 0 0 9 17a6.954 6.954 0 0 0 4.95-2.05 1 1 0 0 0-1.414-1.414A5.02 5.02 0 1 1 13.549 8"/>
+      </g>
+      <g mask="url(#cV)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cW)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="738" y="0">
+    <defs>
+      <clipPath id="cY">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="db" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="da" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="cX" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cZ" mask-type="alpha">
+        <g filter="url(#cX)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cY)">
+      <path d="M13.549 8H11a1 1 0 0 0 0 2h5a1 1 0 0 0 1-1V4a1 1 0 0 0-2 0v2.418"/>
+      <g mask="url(#cZ)">
+        <path d="M15 6.418A6.994 6.994 0 0 0 5.408 4 6.994 6.994 0 0 0 9 17a6.954 6.954 0 0 0 4.95-2.05 1 1 0 0 0-1.414-1.414A5.02 5.02 0 1 1 13.549 8"/>
+      </g>
+      <g mask="url(#da)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#db)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="756" y="0">
+    <defs>
+      <clipPath id="dd">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="dg" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.27 18.622) scale(7.36622)"/>
+      </mask>
+      <mask id="df" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="dc" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="de" mask-type="alpha">
+        <g filter="url(#dc)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#dd)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#de)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#df)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#dg)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/icons/stop-to-reload.svg
@@ -0,0 +1,1298 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="630" height="20" fill="context-fill">
+  <svg width="18" height="20" x="0" y="0">
+    <defs>
+      <clipPath id="b">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="e" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="d" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="a" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="c" mask-type="alpha">
+        <g filter="url(#a)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#b)">
+      <path d="M13.549 8H11a1 1 0 0 0 0 2h5a1 1 0 0 0 1-1V4a1 1 0 0 0-2 0v2.418"/>
+      <g mask="url(#c)">
+        <path d="M15 6.418A6.994 6.994 0 0 0 5.408 4 6.994 6.994 0 0 0 9 17a6.954 6.954 0 0 0 4.95-2.05 1 1 0 0 0-1.414-1.414A5.02 5.02 0 1 1 13.549 8"/>
+      </g>
+      <g mask="url(#d)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#e)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="18" y="0">
+    <defs>
+      <clipPath id="g">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="j" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="i" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="f" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="h" mask-type="alpha">
+        <g filter="url(#f)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#g)">
+      <path d="M13.681 8.468l-1.93-.658a.8.8 0 0 0-.516 1.514l3.786 1.292a.8.8 0 0 0 1.015-.5l1.291-3.785a.8.8 0 0 0-1.514-.517l-.624 1.831"/>
+      <g mask="url(#h)">
+        <path d="M15.524 7.495a6.994 6.994 0 0 0-9.039-4.02 6.994 6.994 0 0 0 1.32 13.422c1.83.322 3.711-.1 5.227-1.174a1 1 0 0 0-1.152-1.635 5.02 5.02 0 1 1 1.944-5.282"/>
+      </g>
+      <g mask="url(#i)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#j)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="36" y="0">
+    <defs>
+      <clipPath id="l">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="o" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="n" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="k" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="m" mask-type="alpha">
+        <g filter="url(#k)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path display="none"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#l)">
+      <path d="M13.889 8.949l-1.21-.935a.6.6 0 0 0-.734.95l2.375 1.834a.6.6 0 0 0 .841-.109l1.833-2.374a.6.6 0 0 0-.95-.734l-.886 1.149"/>
+      <g mask="url(#m)">
+        <path d="M15.856 8.646a6.994 6.994 0 0 0-8.22-5.505 6.994 6.994 0 0 0-.992 13.45 6.954 6.954 0 0 0 5.351-.264 1 1 0 0 0-.855-1.807 5.02 5.02 0 1 1 2.817-4.872"/>
+      </g>
+      <g mask="url(#n)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#o)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="54" y="0">
+    <defs>
+      <clipPath id="q">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="t" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="s" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="p" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="r" mask-type="alpha">
+        <g filter="url(#p)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L6.625 5.75l2.596-1.742 2.341-1.57L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#q)">
+      <path d="M14.211 9.59l-.689-.752a.4.4 0 0 0-.59.54l1.351 1.475a.4.4 0 0 0 .566.024l1.474-1.35a.4.4 0 0 0-.54-.59l-.713.653"/>
+      <g mask="url(#r)">
+        <path d="M15.986 9.837a6.994 6.994 0 0 0-7.158-6.828 6.994 6.994 0 0 0-3.275 13.083 6.954 6.954 0 0 0 5.318.654 1 1 0 0 0-.535-1.927 5.02 5.02 0 1 1 3.608-4.32"/>
+      </g>
+      <g mask="url(#s)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#t)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="72" y="0">
+    <defs>
+      <clipPath id="v">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="y" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="x" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="u" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="w" mask-type="alpha">
+        <g filter="url(#u)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L5.781 6.078s4.007-2.51 4.243-3.276c.236-.765 2.054-4.098 2.054-4.098l-13.14-6.329z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#v)">
+      <path d="M14.452 10.315l-.275-.429a.2.2 0 0 0-.337.216l.54.842a.2.2 0 0 0 .276.06l.842-.54a.2.2 0 0 0-.216-.336l-.407.26"/>
+      <g mask="url(#w)">
+        <path d="M15.911 11.032a6.994 6.994 0 0 0-5.886-7.95 6.994 6.994 0 0 0-5.462 12.332 6.954 6.954 0 0 0 5.128 1.552 1 1 0 0 0-.197-1.99 5.02 5.02 0 1 1 4.292-3.64"/>
+      </g>
+      <g mask="url(#x)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#y)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="90" y="0">
+    <defs>
+      <clipPath id="A">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="D" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="C" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.075 1.705) scale(.57983)"/>
+      </mask>
+      <filter id="z" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="B" mask-type="alpha">
+        <g filter="url(#z)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625l6 14.031s5.418-3.278 5.889-4.809c.471-1.53 1.766-6.628 1.766-6.628L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#A)">
+      <path d="M14.59 11.116" opacity=".794"/>
+      <g opacity=".794" mask="url(#B)">
+        <path d="M15.633 12.198a6.994 6.994 0 0 0-4.442-8.839 6.994 6.994 0 0 0-7.487 11.218 6.954 6.954 0 0 0 4.787 2.405 1 1 0 0 0 .146-1.995 5.02 5.02 0 1 1 4.851-2.853"/>
+      </g>
+      <g mask="url(#C)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#D)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="108" y="0">
+    <defs>
+      <clipPath id="F">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="I" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="H" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.098 1.705) scale(.72448)"/>
+      </mask>
+      <filter id="E" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="G" mask-type="alpha">
+        <g filter="url(#E)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L4.094 6.734s6.83-4.047 7.536-6.343c.707-2.295 1.48-9.157 1.48-9.157L-1.063-7.624z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#F)">
+      <path d="M14.318 12.055" opacity=".353"/>
+      <g opacity=".353" mask="url(#G)">
+        <path d="M15.16 13.298a6.994 6.994 0 0 0-2.867-9.467A6.994 6.994 0 0 0 3 13.605a6.954 6.954 0 0 0 4.306 3.187 1 1 0 0 0 .484-1.94 5.02 5.02 0 1 1 5.267-1.983"/>
+      </g>
+      <g mask="url(#H)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#I)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="126" y="0">
+    <defs>
+      <clipPath id="K">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="N" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="M" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.149 1.705) scale(1.05114)"/>
+      </mask>
+      <filter id="J" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="L" mask-type="alpha">
+        <g filter="url(#J)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#K)">
+      <path d="M13.889 12.933" opacity=".076"/>
+      <g opacity=".076" mask="url(#L)">
+        <path d="M14.507 14.302a6.994 6.994 0 0 0-1.209-9.818 6.994 6.994 0 0 0-10.826 8.044 6.954 6.954 0 0 0 3.7 3.875 1 1 0 0 0 .807-1.829 5.02 5.02 0 1 1 5.528-1.054"/>
+      </g>
+      <g mask="url(#M)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#N)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="144" y="0">
+    <defs>
+      <clipPath id="P">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="S" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="R" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.251 1.705) scale(1.70603)"/>
+      </mask>
+      <filter id="O" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="Q" mask-type="alpha">
+        <g filter="url(#O)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#P)">
+      <path d="M13.316 13.724" opacity="0"/>
+      <g opacity="0" mask="url(#Q)">
+        <path d="M13.691 15.18a6.994 6.994 0 0 0 .486-9.881 6.994 6.994 0 0 0-12.04 6.077 6.954 6.954 0 0 0 2.982 4.45 1 1 0 0 0 1.109-1.664 5.02 5.02 0 1 1 5.627-.095"/>
+      </g>
+      <g mask="url(#R)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#S)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="162" y="0">
+    <defs>
+      <clipPath id="U">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="X" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="W" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.415 1.705) scale(2.75815)"/>
+      </mask>
+      <filter id="T" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="V" mask-type="alpha">
+        <g filter="url(#T)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#U)">
+      <path d="M12.617 14.407" opacity="0"/>
+      <g opacity="0" mask="url(#V)">
+        <path d="M12.738 15.904a6.994 6.994 0 0 0 2.166-9.652 6.994 6.994 0 0 0-12.902 3.931 6.954 6.954 0 0 0 2.18 4.895 1 1 0 0 0 1.376-1.45 5.02 5.02 0 1 1 5.56.868"/>
+      </g>
+      <g mask="url(#W)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#X)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="180" y="0">
+    <defs>
+      <clipPath id="Z">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="ac" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="ab" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.576 1.705) scale(3.7901)"/>
+      </mask>
+      <filter id="Y" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aa" mask-type="alpha">
+        <g filter="url(#Y)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#Z)">
+      <path d="M11.81 14.96" opacity="0"/>
+      <g opacity="0" mask="url(#aa)">
+        <path d="M11.675 16.456a6.994 6.994 0 0 0 3.782-9.14 6.994 6.994 0 0 0-13.383 1.67 6.954 6.954 0 0 0 1.31 5.194 1 1 0 0 0 1.605-1.194 5.02 5.02 0 1 1 5.33 1.805"/>
+      </g>
+      <g mask="url(#ab)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#ac)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="198" y="0">
+    <defs>
+      <clipPath id="ae">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="ah" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="ag" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.696 1.705) scale(4.56057)"/>
+      </mask>
+      <filter id="ad" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="af" mask-type="alpha">
+        <g filter="url(#ad)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#ae)">
+      <path d="M10.923 15.367" opacity="0"/>
+      <g opacity="0" mask="url(#af)">
+        <path d="M10.533 16.818a6.994 6.994 0 0 0 5.288-8.36 6.994 6.994 0 0 0-13.472-.64 6.954 6.954 0 0 0 .404 5.342 1 1 0 0 0 1.785-.903 5.02 5.02 0 1 1 4.944 2.689"/>
+      </g>
+      <g mask="url(#ag)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#ah)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="216" y="0">
+    <defs>
+      <clipPath id="aj">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="am" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="al" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.786 1.705) scale(5.13258)"/>
+      </mask>
+      <filter id="ai" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="ak" mask-type="alpha">
+        <g filter="url(#ai)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aj)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#ak)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#al)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#am)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="234" y="0">
+    <defs>
+      <clipPath id="ao">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="ar" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="aq" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.855 1.705) scale(5.57409)"/>
+      </mask>
+      <filter id="an" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="ap" mask-type="alpha">
+        <g filter="url(#an)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#ao)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#ap)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aq)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#ar)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="252" y="0">
+    <defs>
+      <clipPath id="at">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aw" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.21 18.622) scale(.57983)"/>
+      </mask>
+      <mask id="av" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.91 1.705) scale(5.92587)"/>
+      </mask>
+      <filter id="as" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="au" mask-type="alpha">
+        <g filter="url(#as)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#at)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#au)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#av)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aw)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="270" y="0">
+    <defs>
+      <clipPath id="ay">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aB" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.233 18.622) scale(.72448)"/>
+      </mask>
+      <mask id="aA" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.954 1.705) scale(6.21239)"/>
+      </mask>
+      <filter id="ax" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="az" mask-type="alpha">
+        <g filter="url(#ax)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#ay)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#az)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aA)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aB)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="288" y="0">
+    <defs>
+      <clipPath id="aD">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aG" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.284 18.622) scale(1.05114)"/>
+      </mask>
+      <mask id="aF" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.991 1.705) scale(6.44921)"/>
+      </mask>
+      <filter id="aC" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aE" mask-type="alpha">
+        <g filter="url(#aC)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aD)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aE)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aF)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aG)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="306" y="0">
+    <defs>
+      <clipPath id="aI">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aL" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.386 18.622) scale(1.70603)"/>
+      </mask>
+      <mask id="aK" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.022 1.705) scale(6.6468)"/>
+      </mask>
+      <filter id="aH" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aJ" mask-type="alpha">
+        <g filter="url(#aH)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aI)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aJ)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aK)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aL)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="324" y="0">
+    <defs>
+      <clipPath id="aN">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aQ" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.55 18.622) scale(2.75815)"/>
+      </mask>
+      <mask id="aP" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.048 1.705) scale(6.81253)"/>
+      </mask>
+      <filter id="aM" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aO" mask-type="alpha">
+        <g filter="url(#aM)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aN)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aO)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aP)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aQ)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="342" y="0">
+    <defs>
+      <clipPath id="aS">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="aV" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.711 18.622) scale(3.7901)"/>
+      </mask>
+      <mask id="aU" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.07 1.705) scale(6.95179)"/>
+      </mask>
+      <filter id="aR" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aT" mask-type="alpha">
+        <g filter="url(#aR)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aS)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aT)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aU)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#aV)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="360" y="0">
+    <defs>
+      <clipPath id="aX">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="ba" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.831 18.622) scale(4.56057)"/>
+      </mask>
+      <mask id="aZ" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.088 1.705) scale(7.06864)"/>
+      </mask>
+      <filter id="aW" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="aY" mask-type="alpha">
+        <g filter="url(#aW)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#aX)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#aY)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#aZ)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#ba)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="378" y="0">
+    <defs>
+      <clipPath id="bc">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bf" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.92 18.622) scale(5.13258)"/>
+      </mask>
+      <mask id="be" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.103 1.705) scale(7.16624)"/>
+      </mask>
+      <filter id="bb" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bd" mask-type="alpha">
+        <g filter="url(#bb)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bc)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bd)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#be)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bf)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="396" y="0">
+    <defs>
+      <clipPath id="bh">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bk" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.99 18.622) scale(5.57409)"/>
+      </mask>
+      <mask id="bj" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.116 1.705) scale(7.2471)"/>
+      </mask>
+      <filter id="bg" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bi" mask-type="alpha">
+        <g filter="url(#bg)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bh)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bi)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bj)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bk)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="414" y="0">
+    <defs>
+      <clipPath id="bm">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bp" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.044 18.622) scale(5.92587)"/>
+      </mask>
+      <mask id="bo" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.126 1.705) scale(7.3132)"/>
+      </mask>
+      <filter id="bl" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bn" mask-type="alpha">
+        <g filter="url(#bl)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bm)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bn)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bo)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bp)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="432" y="0">
+    <defs>
+      <clipPath id="br">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bu" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.09 18.622) scale(6.21239)"/>
+      </mask>
+      <mask id="bt" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.134 1.705) scale(7.36622)"/>
+      </mask>
+      <filter id="bq" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bs" mask-type="alpha">
+        <g filter="url(#bq)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#br)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bs)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bt)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bu)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="450" y="0">
+    <defs>
+      <clipPath id="bw">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bz" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.126 18.622) scale(6.44921)"/>
+      </mask>
+      <mask id="by" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.14 1.705) scale(7.40751)"/>
+      </mask>
+      <filter id="bv" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bx" mask-type="alpha">
+        <g filter="url(#bv)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bw)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bx)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#by)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bz)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="468" y="0">
+    <defs>
+      <clipPath id="bB">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bE" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.157 18.622) scale(6.6468)"/>
+      </mask>
+      <mask id="bD" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.145 1.705) scale(7.43823)"/>
+      </mask>
+      <filter id="bA" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bC" mask-type="alpha">
+        <g filter="url(#bA)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bB)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bC)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bD)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bE)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="486" y="0">
+    <defs>
+      <clipPath id="bG">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bJ" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.183 18.622) scale(6.81253)"/>
+      </mask>
+      <mask id="bI" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.149 1.705) scale(7.45936)"/>
+      </mask>
+      <filter id="bF" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bH" mask-type="alpha">
+        <g filter="url(#bF)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bG)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bH)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bI)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bJ)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="504" y="0">
+    <defs>
+      <clipPath id="bL">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bO" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.204 18.622) scale(6.95179)"/>
+      </mask>
+      <mask id="bN" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.15 1.705) scale(7.47174)"/>
+      </mask>
+      <filter id="bK" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bM" mask-type="alpha">
+        <g filter="url(#bK)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bL)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bM)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bN)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bO)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="522" y="0">
+    <defs>
+      <clipPath id="bQ">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bT" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.223 18.622) scale(7.06864)"/>
+      </mask>
+      <mask id="bS" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="bP" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bR" mask-type="alpha">
+        <g filter="url(#bP)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bQ)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bR)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bS)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bT)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="540" y="0">
+    <defs>
+      <clipPath id="bV">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="bY" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.238 18.622) scale(7.16624)"/>
+      </mask>
+      <mask id="bX" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="bU" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="bW" mask-type="alpha">
+        <g filter="url(#bU)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#bV)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#bW)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#bX)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#bY)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="558" y="0">
+    <defs>
+      <clipPath id="ca">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cd" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.25 18.622) scale(7.2471)"/>
+      </mask>
+      <mask id="cc" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="bZ" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cb" mask-type="alpha">
+        <g filter="url(#bZ)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#ca)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#cb)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#cc)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cd)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="576" y="0">
+    <defs>
+      <clipPath id="cf">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="ci" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.26 18.622) scale(7.3132)"/>
+      </mask>
+      <mask id="ch" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="ce" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cg" mask-type="alpha">
+        <g filter="url(#ce)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cf)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#cg)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#ch)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#ci)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="594" y="0">
+    <defs>
+      <clipPath id="ck">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cn" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.27 18.622) scale(7.36622)"/>
+      </mask>
+      <mask id="cm" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="cj" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cl" mask-type="alpha">
+        <g filter="url(#cj)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#ck)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#cl)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#cm)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cn)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="612" y="0">
+    <defs>
+      <clipPath id="cp">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cs" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.276 18.622) scale(7.40751)"/>
+      </mask>
+      <mask id="cr" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(1.151 1.705) scale(7.47609)"/>
+      </mask>
+      <filter id="co" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cq" mask-type="alpha">
+        <g filter="url(#co)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="block" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cp)">
+      <path d="M9.978 15.616" opacity="0"/>
+      <g opacity="0" mask="url(#cq)">
+        <path d="M9.346 16.98a6.994 6.994 0 0 0 6.638-7.335A6.994 6.994 0 0 0 2.819 6.714a6.954 6.954 0 0 0-.513 5.333 1 1 0 0 0 1.912-.585 5.02 5.02 0 1 1 4.412 3.493"/>
+      </g>
+      <g mask="url(#cr)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cs)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+  <svg width="18" height="20" x="630" y="0">
+    <defs>
+      <clipPath id="cu">
+        <path d="M0 0h18v20H0z"/>
+      </clipPath>
+      <mask id="cx" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.204 18.622) scale(.54135)"/>
+      </mask>
+      <mask id="cw" mask-type="alpha">
+        <path fill="#0005FF" d="M0-2.906A2.907 2.907 0 0 1 2.906 0 2.907 2.907 0 0 1 0 2.906 2.907 2.907 0 0 1-2.906 0 2.907 2.907 0 0 1 0-2.906z" transform="translate(.07 1.705) scale(.54135)"/>
+      </mask>
+      <filter id="ct" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
+        <feColorMatrix type="matrix" color-interpolation-filters="sRGB" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1"/>
+      </filter>
+      <mask id="cv" mask-type="alpha">
+        <g filter="url(#ct)">
+          <path fill="#fff" opacity="0" d="M0 0h18v20H0z"/>
+          <path fill="#0005FF" d="M-1.062-7.625L3.25 7.062s8.241-4.815 9.183-7.876c.942-3.061 1.192-11.686 1.192-11.686L-1.062-7.625z" display="none" transform="translate(9.425 14.172) scale(.54135)"/>
+        </g>
+      </mask>
+    </defs>
+    <g clip-path="url(#cu)">
+      <path d="M13.549 8H11a1 1 0 0 0 0 2h5a1 1 0 0 0 1-1V4a1 1 0 0 0-2 0v2.418"/>
+      <g mask="url(#cv)">
+        <path d="M15 6.418A6.994 6.994 0 0 0 5.408 4 6.994 6.994 0 0 0 9 17a6.954 6.954 0 0 0 4.95-2.05 1 1 0 0 0-1.414-1.414A5.02 5.02 0 1 1 13.549 8"/>
+      </g>
+      <g mask="url(#cw)">
+        <path d="M9 11.413l5.293 5.293a.999.999 0 0 0 1.414-1.414l-5.293-5.293"/>
+        <path d="M10.973 10.558L3.707 3.293a1 1 0 0 0-1.414 1.414l7.266 7.265"/>
+      </g>
+      <g mask="url(#cx)">
+        <path d="M9.285 8.301l-6.992 6.992a1 1 0 1 0 1.414 1.414l6.992-6.992"/>
+        <path d="M10.413 10l5.293-5.293a.999.999 0 0 0-1.414-1.414L8.999 8.586"/>
+      </g>
+    </g>
+  </svg>
+</svg>
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -171,22 +171,28 @@
   skin/classic/browser/open.svg                       (../shared/icons/open.svg)
 #ifdef MOZ_PHOTON_THEME
   skin/classic/browser/page-action.svg                (../shared/icons/page-action.svg)
 #endif
   skin/classic/browser/print.svg                      (../shared/icons/print.svg)
   skin/classic/browser/privateBrowsing.svg            (../shared/icons/privateBrowsing.svg)
   skin/classic/browser/quit.svg                       (../shared/icons/quit.svg)
   skin/classic/browser/reload.svg                     (../shared/icons/reload.svg)
+#ifdef MOZ_PHOTON_ANIMATIONS
+  skin/classic/browser/reload-to-stop.svg             (../shared/icons/reload-to-stop.svg)
+#endif
   skin/classic/browser/save.svg                       (../shared/icons/save.svg)
   skin/classic/browser/settings.svg                   (../shared/icons/settings.svg)
   skin/classic/browser/share.svg                      (../shared/icons/share.svg)
   skin/classic/browser/sidebars.svg                   (../shared/icons/sidebars.svg)
   skin/classic/browser/sidebars-right.svg             (../shared/icons/sidebars-right.svg)
   skin/classic/browser/stop.svg                       (../shared/icons/stop.svg)
+#ifdef MOZ_PHOTON_ANIMATIONS
+  skin/classic/browser/stop-to-reload.svg             (../shared/icons/stop-to-reload.svg)
+#endif
   skin/classic/browser/sync.svg                       (../shared/icons/sync.svg)
   skin/classic/browser/synced-tabs.svg                (../shared/icons/synced-tabs.svg)
   skin/classic/browser/webIDE.svg                     (../shared/icons/webIDE.svg)
   skin/classic/browser/zoom-in.svg                    (../shared/icons/zoom-in.svg)
   skin/classic/browser/zoom-out.svg                   (../shared/icons/zoom-out.svg)
 
 
   skin/classic/browser/search-indicator.png                    (../shared/search/search-indicator.png)
--- a/browser/themes/shared/toolbarbutton-icons.inc.css
+++ b/browser/themes/shared/toolbarbutton-icons.inc.css
@@ -31,16 +31,136 @@ toolbar[brighttext] .toolbarbutton-1 {
 %endif
 }
 
 #forward-button {
   list-style-image: url("chrome://browser/skin/forward.svg");
 }
 
 %ifdef MOZ_PHOTON_THEME
+%ifdef MOZ_PHOTON_ANIMATIONS
+#stop-reload-button[animate] > #reload-button > .toolbarbutton-icon,
+#stop-reload-button[animate] > #reload-button[displaystop] + #stop-button > .toolbarbutton-icon {
+  fill: transparent;
+}
+
+@keyframes reload-to-stop {
+  from {
+    transform: translateX(0);
+  }
+  to {
+    transform: translateX(-738px);
+  }
+}
+
+@keyframes reload-to-stop-rtl {
+  from {
+    transform: scaleX(-1) translateX(0);
+  }
+  to {
+    transform: scaleX(-1) translateX(-738px);
+  }
+}
+
+@keyframes stop-to-reload {
+  from {
+    transform: translateX(0);
+  }
+  to {
+    transform: translateX(-612px);
+  }
+}
+
+@keyframes stop-to-reload-rtl {
+  from {
+    transform: scaleX(-1) translateX(0);
+  }
+  to {
+    transform: scaleX(-1) translateX(-612px);
+  }
+}
+
+#reload-button > .toolbarbutton-animatable-box,
+#stop-button > .toolbarbutton-animatable-box {
+  position: fixed;
+  overflow: hidden;
+  margin-top: -10px; /* Vertically center the 20px tall animatable image */
+  /* Since .toolbarbutton-icon uses a different width than the animatable-box,
+     we need to set a padding relative to the difference in widths. */
+  margin-inline-start: calc((16px + 2 * var(--toolbarbutton-inner-padding) - 18px) / 2);
+  /* Set the min- and max- width and height of the box equal to that
+     of each frame of the SVG sprite. Setting the width and height via
+     the `width` and `height` CSS properties causes an assertion for
+     `inline-size less than zero: 'aContainingBlockISize >= 0'` (bug 1379332). */
+  min-width: 18px;
+  max-width: 18px;
+  min-height: 20px;
+  max-height: 20px;
+}
+
+#reload-button > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image,
+#stop-button > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  height: 20px; /* Height of each frame within the SVG sprite */
+  animation-fill-mode: forwards;
+  animation-iteration-count: 1;
+  list-style-image: none;
+}
+
+#stop-reload-button[animate] > #reload-button > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  background-image: url("chrome://browser/skin/reload-to-stop.svg");
+  width: 756px;
+}
+
+#stop-reload-button[animate] > #reload-button:not([displaystop]) > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  animation-name: reload-to-stop;
+}
+
+#stop-reload-button[animate] > #reload-button:not([displaystop]):-moz-locale-dir(rtl) > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  animation-name: reload-to-stop-rtl;
+}
+
+#reload-button:not([displaystop]) > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  animation-timing-function: steps(41);
+  animation-duration: 684ms;
+}
+
+#stop-reload-button[animate] > #reload-button[displaystop] + #stop-button > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  background-image: url("chrome://browser/skin/stop-to-reload.svg");
+  width: 630px;
+}
+
+#stop-reload-button[animate] > #reload-button[displaystop] + #stop-button > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  animation-name: stop-to-reload;
+}
+
+#stop-reload-button[animate] > #reload-button[displaystop] + #stop-button:-moz-locale-dir(rtl) > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  animation-name: stop-to-reload-rtl;
+}
+
+#reload-button[displaystop] + #stop-button > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  animation-timing-function: steps(34);
+  animation-duration: 600ms;
+}
+
+#reload-button > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  transform: translateX(-738px);
+}
+
+#reload-button:-moz-locale-dir(rtl) > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  transform: scaleX(-1) translateX(-738px);
+}
+
+#reload-button[displaystop] + #stop-button > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  transform: translateX(-612px);
+}
+
+#reload-button[displaystop] + #stop-button:-moz-locale-dir(rtl) > .toolbarbutton-animatable-box > .toolbarbutton-animatable-image {
+  transform: scaleX(-1) translateX(-612px);
+}
+%endif
 #reload-button {
   list-style-image: url("chrome://browser/skin/reload.svg");
 }
 
 #stop-button {
   list-style-image: url("chrome://browser/skin/stop.svg");
 }
 %endif
--- a/browser/themes/windows/browser-aero.css
+++ b/browser/themes/windows/browser-aero.css
@@ -46,19 +46,21 @@
   #browser {
     -moz-appearance: -moz-win-exclude-glass;
   }
 
   @media not all and (-moz-os-version: windows-win7) {
     @media not all and (-moz-os-version: windows-win8) {
       @media (-moz-windows-default-theme) {
 %ifdef MOZ_PHOTON_THEME
-        :root:not(:-moz-window-inactive):not(:-moz-lwtheme) {
-          background-color: hsl(235,33%,19%);
-          --titlebar-text-color: hsl(240,9%,98%);
+        @media (-moz-windows-accent-color-applies: 0) {
+          :root:not(:-moz-lwtheme) {
+            background-color: hsl(235,33%,19%);
+            --titlebar-text-color: hsl(240,9%,98%);
+          }
         }
 
         @media (-moz-windows-accent-color-applies) {
           :root:not(:-moz-window-inactive):not(:-moz-lwtheme) {
             background-color: -moz-win-accentcolor;
             --titlebar-text-color: -moz-win-accentcolortext;
           }
         }
--- a/build/gyp.mozbuild
+++ b/build/gyp.mozbuild
@@ -5,16 +5,18 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 include('gyp_base.mozbuild')
 
 gyp_vars.update({
     'lsan': 0,
     'asan': 0,
     'ubsan' : 0,
+    'fuzzing' : 1 if CONFIG['FUZZING'] else 0,
+    'libfuzzer' : 1 if CONFIG['LIBFUZZER'] else 0,
     'build_with_mozilla': 1,
     'build_with_chromium': 0,
     # 10.9 once we move to TC cross-compiles - bug 1270217
     'mac_sdk_min': '10.7',
     'mac_deployment_target': '10.7',
     'use_official_google_api_keys': 0,
     'have_clock_monotonic': 1 if CONFIG['HAVE_CLOCK_MONOTONIC'] else 0,
     'have_ethtool_cmd_speed_hi': 1 if CONFIG['MOZ_WEBRTC_HAVE_ETHTOOL_SPEED_HI'] else 0,
--- a/build/macosx/cross-mozconfig.common
+++ b/build/macosx/cross-mozconfig.common
@@ -24,16 +24,17 @@ CROSS_SYSROOT=$topsrcdir/MacOSX10.7.sdk
 CROSS_PRIVATE_FRAMEWORKS=$CROSS_SYSROOT/System/Library/PrivateFrameworks
 FLAGS="-target x86_64-apple-darwin11 -B $CROSS_CCTOOLS_PATH/bin -isysroot $CROSS_SYSROOT"
 
 export CC="$topsrcdir/clang/bin/clang $FLAGS"
 export CXX="$topsrcdir/clang/bin/clang++ $FLAGS"
 export CPP="$topsrcdir/clang/bin/clang $FLAGS -E"
 export LLVMCONFIG=$topsrcdir/clang/bin/llvm-config
 export LDFLAGS="-Wl,-syslibroot,$CROSS_SYSROOT -Wl,-dead_strip"
+export BINDGEN_CFLAGS="$FLAGS"
 export TOOLCHAIN_PREFIX=$CROSS_CCTOOLS_PATH/bin/x86_64-apple-darwin11-
 export DSYMUTIL=$topsrcdir/clang/bin/llvm-dsymutil
 export MKFSHFS=$topsrcdir/hfsplus-tools/newfs_hfs
 export DMG_TOOL=$topsrcdir/dmg/dmg
 export HFS_TOOL=$topsrcdir/dmg/hfsplus
 
 export HOST_CC="$topsrcdir/clang/bin/clang"
 export HOST_CXX="$topsrcdir/clang/bin/clang++"
--- a/build/moz.configure/toolchain.configure
+++ b/build/moz.configure/toolchain.configure
@@ -892,16 +892,30 @@ include('compile-checks.configure')
 @depends(have_64_bit,
          try_compile(body='static_assert(sizeof(void *) == 8, "")',
                      check_msg='for 64-bit OS'))
 def check_have_64_bit(have_64_bit, compiler_have_64_bit):
     if have_64_bit != compiler_have_64_bit:
         configure_error('The target compiler does not agree with configure '
                         'about the target bitness.')
 
+option(env='BINDGEN_CFLAGS',
+       nargs=1,
+       help='Options bindgen should pass to the C/C++ parser')
+
+@depends('BINDGEN_CFLAGS')
+@checking('bindgen cflags', lambda s: s if s and s.strip() else 'no')
+def bindgen_cflags(value):
+    if value and len(value):
+        # Reformat the env value for substitution into a toml list.
+        flags = value[0].split()
+        return ', '.join('"' + flag + '"' for flag in flags)
+    return ''
+
+set_config('BINDGEN_CFLAGS', bindgen_cflags)
 
 @depends(c_compiler)
 def default_debug_flags(compiler_info):
     # Debug info is ON by default.
     if compiler_info.type in ('msvc', 'clang-cl'):
         return '-Zi'
     return '-g'
 
--- a/build/unix/elfhack/elf.cpp
+++ b/build/unix/elfhack/elf.cpp
@@ -223,16 +223,17 @@ Elf::Elf(std::ifstream &file)
     delete[] shdr;
 
     eh_shstrndx = (ElfStrtab_Section *)sections[ehdr->e_shstrndx];
 
     // Skip reading program headers if there aren't any
     if (ehdr->e_phnum == 0)
         return;
 
+    bool adjusted_phdr_section = false;
     // Read program headers
     file.seekg(ehdr->e_phoff);
     for (int i = 0; i < ehdr->e_phnum; i++) {
         Elf_Phdr phdr(file, e_ident[EI_CLASS], e_ident[EI_DATA]);
         if (phdr.p_type == PT_LOAD) {
             // Default alignment for PT_LOAD on x86-64 prevents elfhack from
             // doing anything useful. However, the system doesn't actually
             // require such a big alignment, so in order for elfhack to work
@@ -242,22 +243,30 @@ Elf::Elf(std::ifstream &file)
               phdr.p_align = 0x1000;
         }
         ElfSegment *segment = new ElfSegment(&phdr);
         // Some segments aren't entirely filled (if at all) by sections
         // For those, we use fake sections
         if ((phdr.p_type == PT_LOAD) && (phdr.p_offset == 0)) {
             // Use a fake section for ehdr and phdr
             ehdr->getShdr().sh_addr = phdr.p_vaddr;
-            phdr_section->getShdr().sh_addr += phdr.p_vaddr;
+            if (!adjusted_phdr_section) {
+                phdr_section->getShdr().sh_addr += phdr.p_vaddr;
+                adjusted_phdr_section = true;
+            }
             segment->addSection(ehdr);
             segment->addSection(phdr_section);
         }
-        if (phdr.p_type == PT_PHDR)
+        if (phdr.p_type == PT_PHDR) {
+            if (!adjusted_phdr_section) {
+                phdr_section->getShdr().sh_addr = phdr.p_vaddr;
+                adjusted_phdr_section = true;
+            }
             segment->addSection(phdr_section);
+        }
         for (int j = 1; j < ehdr->e_shnum; j++)
             if (phdr.contains(sections[j]))
                 segment->addSection(sections[j]);
         // Make sure that our view of segments corresponds to the original
         // ELF file.
         // GNU gold likes to start some segments before the first section
         // they contain. https://sourceware.org/bugzilla/show_bug.cgi?id=19392
         unsigned int gold_adjustment = segment->getAddr() - phdr.p_vaddr;
--- a/build/unix/elfhack/elfhack.cpp
+++ b/build/unix/elfhack/elfhack.cpp
@@ -616,21 +616,46 @@ int do_relocation_section(Elf *elf, unsi
     if (relhack_entry.r_offset)
         relhack->push_back(relhack_entry);
     // Last entry must be nullptr
     relhack_entry.r_offset = relhack_entry.r_info = 0;
     relhack->push_back(relhack_entry);
 
     unsigned int old_end = section->getOffset() + section->getSize();
 
-    if (init_array) {
-        if (! init_array_reloc) {
+    if (init_array && !init_array_reloc) {
+        // Some linkers create a DT_INIT_ARRAY section that, for all purposes,
+        // is empty: it only contains 0x0 or 0xffffffff pointers with no relocations.
+        const size_t zero = 0;
+        const size_t all = SIZE_MAX;
+        const char *data = init_array->getData();
+        size_t length = Elf_Addr::size(elf->getClass());
+        bool empty = true;
+        for (size_t off = 0; off < init_array->getSize(); off += length) {
+            if (memcmp(data + off, &zero, length) &&
+                memcmp(data + off, &all, length)) {
+                empty = false;
+                break;
+            }
+        }
+	// If we encounter such an empty DT_INIT_ARRAY section, we add a
+	// relocation for its first entry to point to our init. Code further
+	// below will take care of actually setting the right r_info and
+	// r_addend for the relocation, as if we had a normal DT_INIT_ARRAY
+	// section.
+        if (empty) {
+            new_rels.emplace_back();
+            init_array_reloc = new_rels.size();
+            Rel_Type *rel = &new_rels[init_array_reloc - 1];
+            rel->r_offset = init_array->getAddr();
+        } else {
             fprintf(stderr, "Didn't find relocation for DT_INIT_ARRAY's first entry. Skipping\n");
             return -1;
         }
+    } else if (init_array) {
         Rel_Type *rel = &new_rels[init_array_reloc - 1];
         unsigned int addend = get_addend(rel, elf);
         // Use relocated value of DT_INIT_ARRAY's first entry for the
         // function to be called by the injected code.
         if (ELF32_R_TYPE(rel->r_info) == rel_type) {
             original_init = addend;
         } else if (ELF32_R_TYPE(rel->r_info) == rel_type2) {
             ElfSymtab_Section *symtab = (ElfSymtab_Section *)section->getLink();
--- a/build/unix/elfhack/elfxx.h
+++ b/build/unix/elfhack/elfxx.h
@@ -553,26 +553,32 @@ public:
     Elf_SymValue *lookup(const char *name, unsigned int type_filter = STT(OBJECT) | STT(FUNC));
 
 //private: // Until we have a real API
     std::vector<Elf_SymValue> syms;
 };
 
 class Elf_Rel: public serializable<Elf_Rel_Traits> {
 public:
+    Elf_Rel()
+    : serializable<Elf_Rel_Traits>() {};
+
     Elf_Rel(std::ifstream &file, char ei_class, char ei_data)
     : serializable<Elf_Rel_Traits>(file, ei_class, ei_data) {};
 
     static const unsigned int sh_type = SHT_REL;
     static const unsigned int d_tag = DT_REL;
     static const unsigned int d_tag_count = DT_RELCOUNT;
 };
 
 class Elf_Rela: public serializable<Elf_Rela_Traits> {
 public:
+    Elf_Rela()
+    : serializable<Elf_Rela_Traits>() {};
+
     Elf_Rela(std::ifstream &file, char ei_class, char ei_data)
     : serializable<Elf_Rela_Traits>(file, ei_class, ei_data) {};
 
     static const unsigned int sh_type = SHT_RELA;
     static const unsigned int d_tag = DT_RELA;
     static const unsigned int d_tag_count = DT_RELACOUNT;
 };
 
--- a/devtools/client/aboutdebugging/test/browser.ini
+++ b/devtools/client/aboutdebugging/test/browser.ini
@@ -33,16 +33,17 @@ tags = webextensions
 [browser_addons_debugging_initial_state.js]
 [browser_addons_install.js]
 [browser_addons_reload.js]
 [browser_addons_remove.js]
 [browser_addons_toggle_debug.js]
 [browser_page_not_found.js]
 [browser_service_workers.js]
 [browser_service_workers_fetch_flag.js]
+skip-if = os == 'mac' # bug 1333759
 [browser_service_workers_multi_content_process.js]
 skip-if = !e10s # This test is only valid in e10s
 [browser_service_workers_not_compatible.js]
 [browser_service_workers_push.js]
 [browser_service_workers_push_service.js]
 [browser_service_workers_start.js]
 [browser_service_workers_status.js]
 [browser_service_workers_timeout.js]
--- a/dom/indexedDB/test/browser.ini
+++ b/dom/indexedDB/test/browser.ini
@@ -12,10 +12,11 @@ support-files =
   browser_permissionsWorker.js
   bug839193.js
   bug839193.xul
 
 [browser_forgetThisSite.js]
 [browser_permissionsPromptAllow.js]
 [browser_permissionsPromptDeny.js]
 [browser_permissionsPromptWorker.js]
+skip-if = os == 'mac' # bug 1334950
 [browser_perwindow_privateBrowsing.js]
 [browser_bug839193.js]
deleted file mode 100644
--- a/dom/presentation/PresentationDeviceInfoManager.js
+++ /dev/null
@@ -1,119 +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/. */
-
-"use strict";
-
-const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
-
-function log(aMsg) {
-  //dump("-*- PresentationDeviceInfoManager.js : " + aMsg + "\n");
-}
-
-const PRESENTATIONDEVICEINFOMANAGER_CID = Components.ID("{1bd66bef-f643-4be3-b690-0c656353eafd}");
-const PRESENTATIONDEVICEINFOMANAGER_CONTRACTID = "@mozilla.org/presentation-device/deviceInfo;1";
-
-XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
-                                   "@mozilla.org/childprocessmessagemanager;1",
-                                   "nsIMessageSender");
-
-function PresentationDeviceInfoManager() {}
-
-PresentationDeviceInfoManager.prototype = {
-  __proto__: DOMRequestIpcHelper.prototype,
-
-  classID: PRESENTATIONDEVICEINFOMANAGER_CID,
-  contractID: PRESENTATIONDEVICEINFOMANAGER_CONTRACTID,
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference,
-                                         Ci.nsIObserver,
-                                         Ci.nsIDOMGlobalPropertyInitializer]),
-
-  receiveMessage: function(aMsg) {
-    if (!aMsg || !aMsg.data) {
-      return;
-    }
-
-    let data = aMsg.data;
-
-    log("receive aMsg: " + aMsg.name);
-    switch (aMsg.name) {
-      case "PresentationDeviceInfoManager:OnDeviceChange": {
-        let detail = {
-          detail: {
-            type: data.type,
-            deviceInfo: data.deviceInfo,
-          }
-        };
-        let event = new this._window.CustomEvent("devicechange", Cu.cloneInto(detail, this._window));
-        this.__DOM_IMPL__.dispatchEvent(event);
-        break;
-      }
-      case "PresentationDeviceInfoManager:GetAll:Result:Ok": {
-        let resolver = this.takePromiseResolver(data.requestId);
-
-        if (!resolver) {
-          return;
-        }
-
-        resolver.resolve(Cu.cloneInto(data.devices, this._window));
-        break;
-      }
-      case "PresentationDeviceInfoManager:GetAll:Result:Error": {
-        let resolver = this.takePromiseResolver(data.requestId);
-
-        if (!resolver) {
-          return;
-        }
-
-        resolver.reject(data.error);
-        break;
-      }
-    }
-  },
-
-  init: function(aWin) {
-    log("init");
-    this.initDOMRequestHelper(aWin, [
-      {name: "PresentationDeviceInfoManager:OnDeviceChange", weakRef: true},
-      {name: "PresentationDeviceInfoManager:GetAll:Result:Ok", weakRef: true},
-      {name: "PresentationDeviceInfoManager:GetAll:Result:Error", weakRef: true},
-    ]);
-  },
-
-  uninit: function() {
-    log("uninit");
-    let self = this;
-
-    this.forEachPromiseResolver(function(aKey) {
-      self.takePromiseResolver(aKey).reject("PresentationDeviceInfoManager got destroyed");
-    });
-  },
-
-  get ondevicechange() {
-    return this.__DOM_IMPL__.getEventHandler("ondevicechange");
-  },
-
-  set ondevicechange(aHandler) {
-    this.__DOM_IMPL__.setEventHandler("ondevicechange", aHandler);
-  },
-
-  getAll: function() {
-    log("getAll");
-    let self = this;
-    return this.createPromiseWithId(function(aResolverId) {
-      cpmm.sendAsyncMessage("PresentationDeviceInfoManager:GetAll", {
-        requestId: aResolverId,
-      });
-    });
-  },
-
-  forceDiscovery: function() {
-    cpmm.sendAsyncMessage("PresentationDeviceInfoManager:ForceDiscovery");
-  },
-};
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PresentationDeviceInfoManager]);
deleted file mode 100644
--- a/dom/presentation/PresentationDeviceInfoManager.jsm
+++ /dev/null
@@ -1,98 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- /
-/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
-/* 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/. */
-
-"use strict";
-
-const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
-
-this.EXPORTED_SYMBOLS = ["PresentationDeviceInfoService"];
-
-function log(aMsg) {
-  //dump("PresentationDeviceInfoManager.jsm: " + aMsg + "\n");
-}
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyServiceGetter(this, "presentationDeviceManager",
-                                   "@mozilla.org/presentation-device/manager;1",
-                                   "nsIPresentationDeviceManager");
-
-XPCOMUtils.defineLazyServiceGetter(this, "ppmm",
-                                   "@mozilla.org/parentprocessmessagemanager;1",
-                                   "nsIMessageBroadcaster");
-
-this.PresentationDeviceInfoService = {
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIMessageListener,
-                                         Ci.nsIObserver]),
-
-  init: function() {
-    log("init");
-    ppmm.addMessageListener("PresentationDeviceInfoManager:GetAll", this);
-    ppmm.addMessageListener("PresentationDeviceInfoManager:ForceDiscovery", this);
-    Services.obs.addObserver(this, "presentation-device-change");
-  },
-
-  getAll: function(aData, aMm) {
-    log("getAll");
-    let deviceArray = presentationDeviceManager.getAvailableDevices().QueryInterface(Ci.nsIArray);
-    if (!deviceArray) {
-      aData.error = "DataError";
-      aMm.sendAsyncMessage("PresentationDeviceInfoManager:GetAll:Result:Error", aData);
-      return;
-    }
-
-    aData.devices = [];
-    for (let i = 0; i < deviceArray.length; i++) {
-      let device = deviceArray.queryElementAt(i, Ci.nsIPresentationDevice);
-      aData.devices.push({
-        id: device.id,
-        name: device.name,
-        type: device.type,
-      });
-    }
-    aMm.sendAsyncMessage("PresentationDeviceInfoManager:GetAll:Result:Ok", aData);
-  },
-
-  forceDiscovery: function() {
-    log("forceDiscovery");
-    presentationDeviceManager.forceDiscovery();
-  },
-
-  observe: function(aSubject, aTopic, aData) {
-    log("observe: " + aTopic);
-
-    let device = aSubject.QueryInterface(Ci.nsIPresentationDevice);
-    let data = {
-      type: aData,
-      deviceInfo: {
-        id: device.id,
-        name: device.name,
-        type: device.type,
-      },
-    };
-    ppmm.broadcastAsyncMessage("PresentationDeviceInfoManager:OnDeviceChange", data);
-  },
-
-  receiveMessage: function(aMessage) {
-    let msg = aMessage.data || {};
-    let mm = aMessage.target;
-
-    log("receiveMessage: " + aMessage.name);
-    switch (aMessage.name) {
-      case "PresentationDeviceInfoManager:GetAll": {
-        this.getAll(msg, mm);
-        break;
-      }
-      case "PresentationDeviceInfoManager:ForceDiscovery": {
-        this.forceDiscovery();
-        break;
-      }
-    }
-  },
-};
-
-this.PresentationDeviceInfoService.init();
deleted file mode 100644
--- a/dom/presentation/PresentationDeviceInfoManager.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-# PresentationDeviceInfoManager.js
-component {1bd66bef-f643-4be3-b690-0c656353eafd} PresentationDeviceInfoManager.js
-contract @mozilla.org/presentation-device/deviceInfo;1 {1bd66bef-f643-4be3-b690-0c656353eafd}
--- a/dom/presentation/moz.build
+++ b/dom/presentation/moz.build
@@ -58,30 +58,24 @@ UNIFIED_SOURCES += [
     'PresentationTCPSessionTransport.cpp',
     'PresentationTerminateRequest.cpp',
     'PresentationTransportBuilderConstructor.cpp'
 ]
 
 EXTRA_COMPONENTS += [
     'PresentationDataChannelSessionTransport.js',
     'PresentationDataChannelSessionTransport.manifest',
-    'PresentationDeviceInfoManager.js',
-    'PresentationDeviceInfoManager.manifest',
 ]
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
     EXTRA_COMPONENTS += [
         'PresentationNetworkHelper.js',
         'PresentationNetworkHelper.manifest',
     ]
 
-EXTRA_JS_MODULES += [
-    'PresentationDeviceInfoManager.jsm',
-]
-
 IPDL_SOURCES += [
     'ipc/PPresentation.ipdl',
     'ipc/PPresentationBuilder.ipdl',
     'ipc/PPresentationRequest.ipdl'
 ]
 
 LOCAL_INCLUDES += [
     '../base'
--- a/dom/presentation/tests/mochitest/PresentationDeviceInfoChromeScript.js
+++ b/dom/presentation/tests/mochitest/PresentationDeviceInfoChromeScript.js
@@ -1,17 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 'use strict';
 
 const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
 
-Cu.import('resource://gre/modules/PresentationDeviceInfoManager.jsm');
-
 const { XPCOMUtils } = Cu.import('resource://gre/modules/XPCOMUtils.jsm');
 
 const manager = Cc['@mozilla.org/presentation-device/manager;1']
                   .getService(Ci.nsIPresentationDeviceManager);
 
 var testProvider = {
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIPresentationDeviceProvider]),
   forceDiscovery: function() {
--- a/dom/presentation/tests/mochitest/chrome.ini
+++ b/dom/presentation/tests/mochitest/chrome.ini
@@ -1,14 +1,13 @@
 [DEFAULT]
 support-files =
   PresentationDeviceInfoChromeScript.js
   PresentationSessionChromeScript.js
 
 [test_presentation_datachannel_sessiontransport.html]
 skip-if = os == 'android'
-[test_presentation_device_info.html]
 [test_presentation_sender_startWithDevice.html]
 skip-if = toolkit == 'android' # Bug 1129785
 [test_presentation_tcp_sender.html]
 skip-if = toolkit == 'android' # Bug 1129785
 [test_presentation_tcp_sender_default_request.html]
 skip-if = toolkit == 'android' # Bug 1129785
--- a/dom/presentation/tests/mochitest/mochitest.ini
+++ b/dom/presentation/tests/mochitest/mochitest.ini
@@ -34,17 +34,16 @@ skip-if = (e10s || toolkit == 'android')
 [test_presentation_1ua_sender_and_receiver_inproc.html]
 skip-if = (e10s || toolkit == 'android') # Bug 1129785
 [test_presentation_1ua_sender_and_receiver_oop.html]
 skip-if = (e10s || toolkit == 'android') # Bug 1129785
 [test_presentation_1ua_connection_wentaway_inproc.html]
 skip-if = (e10s || toolkit == 'android') # Bug 1129785
 [test_presentation_1ua_connection_wentaway_oop.html]
 skip-if = (e10s || toolkit == 'android') # Bug 1129785
-[test_presentation_device_info_permission.html]
 [test_presentation_tcp_sender_disconnect.html]
 skip-if = toolkit == 'android' # Bug 1129785
 [test_presentation_tcp_sender_establish_connection_error.html]
 skip-if = toolkit == 'android' # Bug 1129785
 [test_presentation_tcp_receiver_establish_connection_error.html]
 skip-if = (e10s || toolkit == 'android' || os == 'mac' || os == 'win') # Bug 1129785, Bug 1204709
 [test_presentation_tcp_receiver_establish_connection_timeout.html]
 skip-if = (e10s || toolkit == 'android') # Bug 1129785
deleted file mode 100644
--- a/dom/presentation/tests/mochitest/test_presentation_device_info.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!-- Any copyright is dedicated to the Public Domain.
-   - http://creativecommons.org/publicdomain/zero/1.0/ -->
-<head>
-  <meta charset="utf-8">
-  <title>Test for B2G Presentation Device Info API</title>
-  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
-  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1080474">Test for B2G Presentation Device Info API</a>
-<script type="application/javascript">
-
-'use strict';
-
-SimpleTest.waitForExplicitFinish();
-
-var testDevice = {
-  id: 'id',
-  name: 'name',
-  type: 'type',
-};
-
-var gUrl = SimpleTest.getTestFileURL('PresentationDeviceInfoChromeScript.js');
-var gScript = SpecialPowers.loadChromeScript(gUrl);
-
-function testSetup() {
-  return new Promise(function(resolve, reject) {
-    gScript.addMessageListener('setup-complete', function() {
-      resolve();
-    });
-    gScript.sendAsyncMessage('setup');
-  });
-}
-
-function testForceDiscovery() {
-  info('test force discovery');
-  return new Promise(function(resolve, reject) {
-    gScript.addMessageListener('force-discovery', function() {
-      ok(true, 'nsIPresentationDeviceProvider.forceDiscovery is invoked');
-      resolve();
-    });
-    navigator.mozPresentationDeviceInfo.forceDiscovery();
-  });
-}
-
-function testDeviceAdd() {
-  info('test device add');
-  return new Promise(function(resolve, reject) {
-    navigator.mozPresentationDeviceInfo.addEventListener('devicechange', function(e) {
-      let detail = e.detail;
-      is(detail.type, 'add', 'expected update type');
-      is(detail.deviceInfo.id, testDevice.id, 'expected device id');
-      is(detail.deviceInfo.name, testDevice.name, 'expected device name');
-      is(detail.deviceInfo.type, testDevice.type, 'expected device type');
-
-      navigator.mozPresentationDeviceInfo.getAll()
-      .then(function(devices) {
-        is(devices.length, 1, 'expected 1 available device');
-        is(devices[0].id, testDevice.id, 'expected device id');
-        is(devices[0].name, testDevice.name, 'expected device name');
-        is(devices[0].type, testDevice.type, 'expected device type');
-        resolve();
-      });
-    }, {once: true});
-    gScript.sendAsyncMessage('trigger-device-add', testDevice);
-  });
-}
-
-function testDeviceUpdate() {
-  info('test device update');
-  return new Promise(function(resolve, reject) {
-    testDevice.name = 'name-update';
-
-    navigator.mozPresentationDeviceInfo.addEventListener('devicechange', function(e) {
-      let detail = e.detail;
-      is(detail.type, 'update', 'expected update type');
-      is(detail.deviceInfo.id, testDevice.id, 'expected device id');
-      is(detail.deviceInfo.name, testDevice.name, 'expected device name');
-      is(detail.deviceInfo.type, testDevice.type, 'expected device type');
-
-      navigator.mozPresentationDeviceInfo.getAll()
-      .then(function(devices) {
-        is(devices.length, 1, 'expected 1 available device');
-        is(devices[0].id, testDevice.id, 'expected device id');
-        is(devices[0].name, testDevice.name, 'expected device name');
-        is(devices[0].type, testDevice.type, 'expected device type');
-        resolve();
-      });
-    }, {once: true});
-    gScript.sendAsyncMessage('trigger-device-update', testDevice);
-  });
-}
-
-function testDeviceRemove() {
-  info('test device remove');
-  return new Promise(function(resolve, reject) {
-    navigator.mozPresentationDeviceInfo.addEventListener('devicechange', function(e) {
-      let detail = e.detail;
-      is(detail.type, 'remove', 'expected update type');
-      is(detail.deviceInfo.id, testDevice.id, 'expected device id');
-      is(detail.deviceInfo.name, testDevice.name, 'expected device name');
-      is(detail.deviceInfo.type, testDevice.type, 'expected device type');
-
-      navigator.mozPresentationDeviceInfo.getAll()
-      .then(function(devices) {
-        is(devices.length, 0, 'expected 0 available device');
-        resolve();
-      });
-    }, {once: true});
-    gScript.sendAsyncMessage('trigger-device-remove');
-  });
-}
-
-function runTests() {
-  testSetup()
-  .then(testForceDiscovery)
-  .then(testDeviceAdd)
-  .then(testDeviceUpdate)
-  .then(testDeviceRemove)
-  .then(function() {
-    info('test finished, teardown');
-    gScript.sendAsyncMessage('teardown', '');
-    gScript.destroy();
-    SimpleTest.finish();
-  });
-}
-
-window.addEventListener('load', function() {
-  SpecialPowers.pushPrefEnv({
-    'set': [
-      ['dom.presentation.enabled', true],
-    ]
-  }, runTests);
-});
-
-</script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/dom/presentation/tests/mochitest/test_presentation_device_info_permission.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!-- Any copyright is dedicated to the Public Domain.
-   - http://creativecommons.org/publicdomain/zero/1.0/ -->
-<head>
-  <meta charset="utf-8">
-  <title>Test for B2G Presentation Device Info API Permission</title>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1080474">Test for B2G Presentation Device Info API Permission</a>
-<script type="application/javascript">
-
-'use strict';
-
-SimpleTest.waitForExplicitFinish();
-
-function runTests() {
-  is(navigator.mozPresentationDeviceInfo, undefined, 'navigator.mozPresentationDeviceInfo is undefined');
-  SimpleTest.finish();
-}
-
-window.addEventListener('load', function() {
-  SpecialPowers.pushPrefEnv({
-    'set': [
-      ['dom.presentation.enabled', true],
-    ]
-  }, runTests);
-});
-
-</script>
-</pre>
-</body>
-</html>
--- a/dom/tests/mochitest/general/test_interfaces.js
+++ b/dom/tests/mochitest/general/test_interfaces.js
@@ -751,19 +751,16 @@ var interfaceNamesInGlobalScope =
     {name: "PointerEvent", nightly: true, desktop: true, android: false},
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "PopStateEvent",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "PopupBlockedEvent",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "PopupBoxObject", xbl: true},
 // IMPORTANT: Do not change this list without review from a DOM peer!
-    {name: "PresentationDeviceInfoManager",
-     disabled: true},
-// IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "Presentation", desktop: false, release: false },
 // IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "PresentationAvailability", desktop: false, release: false },
 // IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "PresentationConnection", desktop: false, release: false},
 // IMPORTANT: Do not change this list without review from a DOM peer!
     {name: "PresentationConnectionAvailableEvent", desktop: false, release: false },
 // IMPORTANT: Do not change this list without review from a DOM peer!
deleted file mode 100644
--- a/dom/webidl/PresentationDeviceInfoManager.webidl
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* 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/.
- */
-
-dictionary PresentationDeviceInfo {
-  DOMString id;
-  DOMString name;
-  DOMString type;
-};
-
-[NavigatorProperty="mozPresentationDeviceInfo",
- JSImplementation="@mozilla.org/presentation-device/deviceInfo;1",
- Pref="dom.presentation.enabled",
- ChromeOnly]
-interface PresentationDeviceInfoManager : EventTarget {
-  // notify if any device updated.
-  attribute EventHandler ondevicechange;
-
-  // retrieve all available device infos
-  Promise<sequence<PresentationDeviceInfo>> getAll();
-
-  // Force all registered device provider to update device information.
-  void forceDiscovery();
-};
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -746,17 +746,16 @@ WEBIDL_FILES = [
     'PopupBoxObject.webidl',
     'Position.webidl',
     'PositionError.webidl',
     'PrecompiledScript.webidl',
     'Presentation.webidl',
     'PresentationAvailability.webidl',
     'PresentationConnection.webidl',
     'PresentationConnectionList.webidl',
-    'PresentationDeviceInfoManager.webidl',
     'PresentationReceiver.webidl',
     'PresentationRequest.webidl',
     'ProcessingInstruction.webidl',
     'ProfileTimelineMarker.webidl',
     'Promise.webidl',
     'PromiseDebugging.webidl',
     'PushEvent.webidl',
     'PushManager.webidl',
--- a/editor/libeditor/tests/test_bug586662.html
+++ b/editor/libeditor/tests/test_bug586662.html
@@ -39,22 +39,22 @@ SimpleTest.waitForFocus(function() {
       // Scroll back up
       win.scrollTo(0, 0);
       setTimeout(function() {
         is(win.scrollY, 0, "Page is scrolled back up");
         // Make sure that typing something into the textarea will cause the
         // page to scroll down
         synthesizeKey("a", {}, win);
         requestAnimationFrame(function() {
-          setTimeout(function() {
+          requestAnimationFrame(function() {
             isnot(win.scrollY, 0, "Page is scrolled down again");
 
             win.close();
             SimpleTest.finish();
-          }, 0);
+          });
         });
       }, 0);
     }, 0);
   }, win);
 });
 
    </script>
   </pre>
--- a/gfx/layers/apz/src/APZCTreeManager.cpp
+++ b/gfx/layers/apz/src/APZCTreeManager.cpp
@@ -495,17 +495,17 @@ APZCTreeManager::PushStateToWR(wr::WebRe
         }
 
         // Use a 0 presShellId because when we do a lookup in this map for the
         // scrollbar below we don't have (or care about) the presShellId.
         ScrollableLayerGuid guid(lastLayersId, 0, apzc->GetGuid().mScrollId);
         httnMap.emplace(guid, aNode);
 
         ParentLayerPoint layerTranslation = apzc->GetCurrentAsyncTransform(
-            AsyncPanZoomController::RESPECT_FORCE_DISABLE).mTranslation;
+            AsyncPanZoomController::eForCompositing).mTranslation;
         // The positive translation means the painted content is supposed to
         // move down (or to the right), and that corresponds to a reduction in
         // the scroll offset. Since we are effectively giving WR the async
         // scroll delta here, we want to negate the translation.
         ParentLayerPoint asyncScrollDelta = -layerTranslation;
         aWrApi->UpdateScrollPosition(lastPipelineId, apzc->GetGuid().mScrollId,
             wr::ToWrPoint(asyncScrollDelta));
 
@@ -846,17 +846,17 @@ APZCTreeManager::PrepareNodeForLayer(con
             "parentScrollId", apzc->GetParent()->GetGuid().mScrollId);
       }
       if (aMetrics.IsRootContent()) {
         aState.mPaintLogger.LogTestData(aMetrics.GetScrollId(),
             "isRootContent", true);
       }
       // Note that the async scroll offset is in ParentLayer pixels
       aState.mPaintLogger.LogTestData(aMetrics.GetScrollId(), "asyncScrollOffset",
-          apzc->GetCurrentAsyncScrollOffset(AsyncPanZoomController::NORMAL));
+          apzc->GetCurrentAsyncScrollOffset(AsyncPanZoomController::eForHitTesting));
     }
 
     if (newApzc) {
       auto it = mZoomConstraints.find(guid);
       if (it != mZoomConstraints.end()) {
         // We have a zoomconstraints for this guid, apply it.
         apzc->UpdateZoomConstraints(it->second);
       } else if (!apzc->HasNoParentWithSameLayersId()) {
@@ -951,17 +951,17 @@ APZCTreeManager::ReceiveInputEvent(Input
 
 #if defined(MOZ_WIDGET_ANDROID)
   MOZ_ASSERT(mToolbarAnimator);
   ScreenPoint scrollOffset;
   {
     MutexAutoLock lock(mTreeLock);
     RefPtr<AsyncPanZoomController> apzc = FindRootContentOrRootApzc();
     if (apzc) {
-      scrollOffset = ViewAs<ScreenPixel>(apzc->GetCurrentAsyncScrollOffset(AsyncPanZoomController::NORMAL),
+      scrollOffset = ViewAs<ScreenPixel>(apzc->GetCurrentAsyncScrollOffset(AsyncPanZoomController::eForHitTesting),
                                          PixelCastJustification::ScreenIsParentLayerForRoot);
     }
   }
   nsEventStatus isConsumed = mToolbarAnimator->ReceiveInputEvent(aEvent, scrollOffset);
   // Check if the mToolbarAnimator consumed the event.
   if (isConsumed == nsEventStatus_eConsumeNoDefault) {
     APZCTM_LOG("Dynamic toolbar consumed event");
     return isConsumed;
@@ -2420,17 +2420,17 @@ APZCTreeManager::GetScreenToApzcTransfor
 
   // result is initialized to PC.Inverse() * OC.Inverse() * NC.Inverse() * MC.Inverse()
   result = ancestorUntransform;
 
   for (AsyncPanZoomController* parent = aApzc->GetParent(); parent; parent = parent->GetParent()) {
     // ancestorUntransform is updated to RC.Inverse() * QC.Inverse() when parent == P
     ancestorUntransform = parent->GetAncestorTransform().Inverse();
     // asyncUntransform is updated to PA.Inverse() when parent == P
-    Matrix4x4 asyncUntransform = parent->GetCurrentAsyncTransformWithOverscroll(AsyncPanZoomController::NORMAL).Inverse().ToUnknownMatrix();
+    Matrix4x4 asyncUntransform = parent->GetCurrentAsyncTransformWithOverscroll(AsyncPanZoomController::eForHitTesting).Inverse().ToUnknownMatrix();
     // untransformSinceLastApzc is RC.Inverse() * QC.Inverse() * PA.Inverse()
     Matrix4x4 untransformSinceLastApzc = ancestorUntransform * asyncUntransform;
 
     // result is RC.Inverse() * QC.Inverse() * PA.Inverse() * PC.Inverse() * OC.Inverse() * NC.Inverse() * MC.Inverse()
     result = untransformSinceLastApzc * result;
 
     // The above value for result when parent == P matches the required output
     // as explained in the comment above this method. Note that any missing
@@ -2452,17 +2452,17 @@ APZCTreeManager::GetApzcToGeckoTransform
 
   // The comments below assume there is a chain of layers L..R with L and P having APZC instances as
   // explained in the comment above. This function is called with aApzc at L, and the loop
   // below performs one iteration, where parent is at P. The comments explain what values are stored
   // in the variables at these two levels. All the comments use standard matrix notation where the
   // leftmost matrix in a multiplication is applied first.
 
   // asyncUntransform is LA.Inverse()
-  Matrix4x4 asyncUntransform = aApzc->GetCurrentAsyncTransformWithOverscroll(AsyncPanZoomController::NORMAL).Inverse().ToUnknownMatrix();
+  Matrix4x4 asyncUntransform = aApzc->GetCurrentAsyncTransformWithOverscroll(AsyncPanZoomController::eForHitTesting).Inverse().ToUnknownMatrix();
 
   // aTransformToGeckoOut is initialized to LA.Inverse() * LD * MC * NC * OC * PC
   result = asyncUntransform * aApzc->GetTransformToLastDispatchedPaint() * aApzc->GetAncestorTransform();
 
   for (AsyncPanZoomController* parent = aApzc->GetParent(); parent; parent = parent->GetParent()) {
     // aTransformToGeckoOut is LA.Inverse() * LD * MC * NC * OC * PC * PD * QC * RC
     result = result * parent->GetTransformToLastDispatchedPaint() * parent->GetAncestorTransform();
 
@@ -2547,17 +2547,17 @@ APZCTreeManager::CommonAncestor(AsyncPan
 LayerToParentLayerMatrix4x4
 APZCTreeManager::ComputeTransformForNode(const HitTestingTreeNode* aNode) const
 {
   if (AsyncPanZoomController* apzc = aNode->GetApzc()) {
     // If the node represents scrollable content, apply the async transform
     // from its APZC.
     return aNode->GetTransform() *
         CompleteAsyncTransform(
-          apzc->GetCurrentAsyncTransformWithOverscroll(AsyncPanZoomController::NORMAL));
+          apzc->GetCurrentAsyncTransformWithOverscroll(AsyncPanZoomController::eForHitTesting));
   } else if (aNode->IsScrollThumbNode()) {
     // If the node represents a scrollbar thumb, compute and apply the
     // transformation that will be applied to the thumb in
     // AsyncCompositionManager.
     ScrollableLayerGuid guid{aNode->GetLayersId(), 0, aNode->GetScrollTargetId()};
     if (RefPtr<HitTestingTreeNode> scrollTargetNode = GetTargetNode(guid, &GuidComparatorIgnoringPresShell)) {
       AsyncPanZoomController* scrollTargetApzc = scrollTargetNode->GetApzc();
       MOZ_ASSERT(scrollTargetApzc);
--- a/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.cpp
+++ b/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.cpp
@@ -1012,20 +1012,20 @@ AndroidDynamicToolbarAnimator::UpdateFra
         (mControllerToolbarHeight != mControllerMaxToolbarHeight) &&
         !mPinnedFlags) {
       // The end of the page has been reached, the page is twice the height of the visible height,
       // and the toolbar is not completely visible so animate it into view.
       StartCompositorAnimation(MOVE_TOOLBAR_DOWN, eAnimate, mControllerToolbarHeight, /* wait for page resize */ true);
     }
     RefPtr<UiCompositorControllerParent> uiController = UiCompositorControllerParent::GetFromRootLayerTreeId(mRootLayerTreeId);
     MOZ_ASSERT(uiController);
-    CompositorThreadHolder::Loop()->PostTask(NewRunnableMethod<ScreenPoint, CSSToScreenScale, CSSRect>(
+    CompositorThreadHolder::Loop()->PostTask(NewRunnableMethod<ScreenPoint, CSSToScreenScale>(
                                                "UiCompositorControllerParent::SendRootFrameMetrics",
                                                uiController, &UiCompositorControllerParent::SendRootFrameMetrics,
-                                               aScrollOffset, aScale, aCssPageRect));
+                                               aScrollOffset, aScale));
   }
 }
 
 bool
 AndroidDynamicToolbarAnimator::PageTooSmallEnsureToolbarVisible()
 {
   MOZ_ASSERT(APZThreadUtils::IsControllerThread());
   // if the page is too small then the toolbar can not be hidden
--- a/gfx/layers/apz/src/AsyncPanZoomController.cpp
+++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp
@@ -268,31 +268,42 @@ typedef GenericFlingAnimation FlingAnima
  * \li\b apz.fling_stopped_threshold
  * When flinging, if the velocity goes below this number, we just stop the
  * animation completely. This is to prevent asymptotically approaching 0
  * velocity and rerendering unnecessarily.\n
  * Units: screen pixels per millisecond.\n
  * NOTE: Should not be set to anything
  * other than 0.0 for Android except for tests to disable flings.
  *
+ * \li\b apz.frame_delay.enabled
+ * If this is set to true, changes to the async scroll offset and async zoom
+ * will not be immediately reflected in GetCurrentAsyncTransform() when called
+ * with |AsyncTransformConsumer::eForCompositing|. Rather, the transform will
+ * reflect the value of the async scroll offset and async zoom at the last time
+ * SampleCompositedAsyncTransform() was called.
+ *
  * \li\b apz.max_velocity_inches_per_ms
  * Maximum velocity.  Velocity will be capped at this value if a faster fling
  * occurs.  Negative values indicate unlimited velocity.\n
  * Units: (real-world, i.e. screen) inches per millisecond
  *
  * \li\b apz.max_velocity_queue_size
  * Maximum size of velocity queue. The queue contains last N velocity records.
  * On touch end we calculate the average velocity in order to compensate
  * touch/mouse drivers misbehaviour.
  *
  * \li\b apz.min_skate_speed
  * Minimum amount of speed along an axis before we switch to "skate" multipliers
  * rather than using the "stationary" multipliers.\n
  * Units: CSS pixels per millisecond
  *
+ * \li\b apz.one_touch_pinch.enabled
+ * Whether or not the "one-touch-pinch" gesture (for zooming with one finger)
+ * is enabled or not.
+ *
  * \li\b apz.overscroll.enabled
  * Pref that enables overscrolling. If this is disabled, excess scroll that
  * cannot be handed off is discarded.
  *
  * \li\b apz.overscroll.min_pan_distance_ratio
  * The minimum ratio of the pan distance along one axis to the pan distance
  * along the other axis needed to initiate overscroll along the first axis
  * during panning.
@@ -3213,16 +3224,22 @@ bool AsyncPanZoomController::UpdateAnima
 
   // This function may get called multiple with the same sample time, because
   // there may be multiple layers with this APZC, and each layer invokes this
   // function during composition. However we only want to do one animation step
   // per composition so we need to deduplicate these calls first.
   if (mLastSampleTime == aSampleTime) {
     return false;
   }
+
+  // Sample the composited async transform once per composite. Note that we
+  // call this after the |mLastSampleTime == aSampleTime| check, to ensure
+  // it's only called once per APZC on each composite.
+  SampleCompositedAsyncTransform();
+
   TimeDuration sampleTimeDelta = aSampleTime - mLastSampleTime;
   mLastSampleTime = aSampleTime;
 
   if (mAnimation) {
     bool continueAnimation = mAnimation->Sample(mFrameMetrics, sampleTimeDelta);
     bool wantsRepaints = mAnimation->WantsRepaints();
     *aOutDeferredTasks = mAnimation->TakeDeferredTasks();
     if (!continueAnimation) {
@@ -3237,21 +3254,21 @@ bool AsyncPanZoomController::UpdateAnima
     }
     UpdateSharedCompositorFrameMetrics();
     return true;
   }
   return false;
 }
 
 AsyncTransformComponentMatrix
-AsyncPanZoomController::GetOverscrollTransform(AsyncMode aMode) const
+AsyncPanZoomController::GetOverscrollTransform(AsyncTransformConsumer aMode) const
 {
   ReentrantMonitorAutoEnter lock(mMonitor);
 
-  if (aMode == RESPECT_FORCE_DISABLE && mScrollMetadata.IsApzForceDisabled()) {
+  if (aMode == eForCompositing && mScrollMetadata.IsApzForceDisabled()) {
     return AsyncTransformComponentMatrix();
   }
 
   if (!IsOverscrolled()) {
     return AsyncTransformComponentMatrix();
   }
 
   // The overscroll effect is a simple translation by the overscroll offset.
@@ -3306,54 +3323,54 @@ bool AsyncPanZoomController::AdvanceAnim
   // One of the deferred tasks may have started a new animation. In this case,
   // we want to ask the compositor to schedule a new composite.
   requestAnimationFrame |= (mAnimation != nullptr);
 
   return requestAnimationFrame;
 }
 
 ParentLayerPoint
-AsyncPanZoomController::GetCurrentAsyncScrollOffset(AsyncMode aMode) const
+AsyncPanZoomController::GetCurrentAsyncScrollOffset(AsyncTransformConsumer aMode) const
 {
   ReentrantMonitorAutoEnter lock(mMonitor);
 
-  if (aMode == RESPECT_FORCE_DISABLE && mScrollMetadata.IsApzForceDisabled()) {
+  if (aMode == eForCompositing && mScrollMetadata.IsApzForceDisabled()) {
     return mLastContentPaintMetrics.GetScrollOffset() * mLastContentPaintMetrics.GetZoom();
   }
 
-  return (mFrameMetrics.GetScrollOffset() + mTestAsyncScrollOffset)
-      * mFrameMetrics.GetZoom() * mTestAsyncZoom.scale;
+  return (GetEffectiveScrollOffset(aMode) + mTestAsyncScrollOffset)
+      * GetEffectiveZoom(aMode) * mTestAsyncZoom.scale;
 }
 
 CSSPoint
-AsyncPanZoomController::GetCurrentAsyncScrollOffsetInCssPixels(AsyncMode aMode) const {
+AsyncPanZoomController::GetCurrentAsyncScrollOffsetInCssPixels(AsyncTransformConsumer aMode) const {
   ReentrantMonitorAutoEnter lock(mMonitor);
 
-  if (aMode == RESPECT_FORCE_DISABLE && mScrollMetadata.IsApzForceDisabled()) {
+  if (aMode == eForCompositing && mScrollMetadata.IsApzForceDisabled()) {
     return mLastContentPaintMetrics.GetScrollOffset();
   }
 
-  return mFrameMetrics.GetScrollOffset() + mTestAsyncScrollOffset;
+  return GetEffectiveScrollOffset(aMode) + mTestAsyncScrollOffset;
 }
 
 AsyncTransform
-AsyncPanZoomController::GetCurrentAsyncTransform(AsyncMode aMode) const
+AsyncPanZoomController::GetCurrentAsyncTransform(AsyncTransformConsumer aMode) const
 {
   ReentrantMonitorAutoEnter lock(mMonitor);
 
-  if (aMode == RESPECT_FORCE_DISABLE && mScrollMetadata.IsApzForceDisabled()) {
+  if (aMode == eForCompositing && mScrollMetadata.IsApzForceDisabled()) {
     return AsyncTransform();
   }
 
   CSSPoint lastPaintScrollOffset;
   if (mLastContentPaintMetrics.IsScrollable()) {
     lastPaintScrollOffset = mLastContentPaintMetrics.GetScrollOffset();
   }
 
-  CSSPoint currentScrollOffset = mFrameMetrics.GetScrollOffset() +
+  CSSPoint currentScrollOffset = GetEffectiveScrollOffset(aMode) +
     mTestAsyncScrollOffset;
 
   // If checkerboarding has been disallowed, clamp the scroll position to stay
   // within rendered content.
   if (!gfxPrefs::APZAllowCheckerboarding() &&
       !mLastContentPaintMetrics.GetDisplayPort().IsEmpty()) {
     CSSSize compositedSize = mLastContentPaintMetrics.CalculateCompositedSizeInCssPixels();
     CSSPoint maxScrollOffset = lastPaintScrollOffset +
@@ -3364,26 +3381,56 @@ AsyncPanZoomController::GetCurrentAsyncT
     if (minScrollOffset.x < maxScrollOffset.x) {
       currentScrollOffset.x = clamped(currentScrollOffset.x, minScrollOffset.x, maxScrollOffset.x);
     }
     if (minScrollOffset.y < maxScrollOffset.y) {
       currentScrollOffset.y = clamped(currentScrollOffset.y, minScrollOffset.y, maxScrollOffset.y);
     }
   }
 
+  CSSToParentLayerScale2D effectiveZoom = GetEffectiveZoom(aMode);
+
   ParentLayerPoint translation = (currentScrollOffset - lastPaintScrollOffset)
-                               * mFrameMetrics.GetZoom() * mTestAsyncZoom.scale;
-
+                               * effectiveZoom * mTestAsyncZoom.scale;
+
+  LayerToParentLayerScale compositedAsyncZoom =
+      (effectiveZoom / mFrameMetrics.LayersPixelsPerCSSPixel()).ToScaleFactor();
   return AsyncTransform(
-    LayerToParentLayerScale(mFrameMetrics.GetAsyncZoom().scale * mTestAsyncZoom.scale),
+    LayerToParentLayerScale(compositedAsyncZoom.scale * mTestAsyncZoom.scale),
     -translation);
 }
 
+CSSPoint
+AsyncPanZoomController::GetEffectiveScrollOffset(AsyncTransformConsumer aMode) const
+{
+  if (gfxPrefs::APZFrameDelayEnabled() && aMode == eForCompositing) {
+    return mCompositedScrollOffset;
+  }
+  return mFrameMetrics.GetScrollOffset();
+}
+
+CSSToParentLayerScale2D
+AsyncPanZoomController::GetEffectiveZoom(AsyncTransformConsumer aMode) const
+{
+  if (gfxPrefs::APZFrameDelayEnabled() && aMode == eForCompositing) {
+    return mCompositedZoom;
+  }
+  return mFrameMetrics.GetZoom();
+}
+
+void
+AsyncPanZoomController::SampleCompositedAsyncTransform()
+{
+  ReentrantMonitorAutoEnter lock(mMonitor);
+  mCompositedScrollOffset = mFrameMetrics.GetScrollOffset();
+  mCompositedZoom = mFrameMetrics.GetZoom();
+}
+
 AsyncTransformComponentMatrix
-AsyncPanZoomController::GetCurrentAsyncTransformWithOverscroll(AsyncMode aMode) const
+AsyncPanZoomController::GetCurrentAsyncTransformWithOverscroll(AsyncTransformConsumer aMode) const
 {
   return AsyncTransformComponentMatrix(GetCurrentAsyncTransform(aMode))
        * GetOverscrollTransform(aMode);
 }
 
 Matrix4x4 AsyncPanZoomController::GetTransformToLastDispatchedPaint() const {
   ReentrantMonitorAutoEnter lock(mMonitor);
 
@@ -3623,16 +3670,19 @@ void AsyncPanZoomController::NotifyLayer
     // Initialize our internal state to something sane when the content
     // that was just painted is something we knew nothing about previously
     CancelAnimation();
 
     mScrollMetadata = aScrollMetadata;
     mExpectedGeckoMetrics = aLayerMetrics;
     ShareCompositorFrameMetrics();
 
+    mCompositedScrollOffset = mFrameMetrics.GetScrollOffset();
+    mCompositedZoom = mFrameMetrics.GetZoom();
+
     if (mFrameMetrics.GetDisplayPortMargins() != ScreenMargin()) {
       // A non-zero display port margin here indicates a displayport has
       // been set by a previous APZC for the content at this guid. The
       // scrollable rect may have changed since then, making the margins
       // wrong, so we need to calculate a new display port.
       APZC_LOG("%p detected non-empty margins which probably need updating\n", this);
       needContentRepaint = true;
     }
@@ -3654,21 +3704,24 @@ void AsyncPanZoomController::NotifyLayer
       gfxSize totalResolutionChange = aLayerMetrics.GetCumulativeResolution()
                                     / mFrameMetrics.GetCumulativeResolution();
       float presShellResolutionChange = aLayerMetrics.GetPresShellResolution()
                                       / mFrameMetrics.GetPresShellResolution();
       if (presShellResolutionChange != 1.0f) {
         needContentRepaint = true;
       }
       mFrameMetrics.ZoomBy(totalResolutionChange / presShellResolutionChange);
+      mCompositedZoom.xScale *= (totalResolutionChange / presShellResolutionChange).width;
+      mCompositedZoom.yScale *= (totalResolutionChange / presShellResolutionChange).height;
     } else {
       // Take the new zoom as either device scale or composition width or
       // viewport size got changed (e.g. due to orientation change, or content
       // changing the meta-viewport tag).
       mFrameMetrics.SetZoom(aLayerMetrics.GetZoom());
+      mCompositedZoom = aLayerMetrics.GetZoom();
       mFrameMetrics.SetDevPixelsPerCSSPixel(aLayerMetrics.GetDevPixelsPerCSSPixel());
     }
     bool scrollableRectChanged = false;
     if (!mFrameMetrics.GetScrollableRect().IsEqualEdges(aLayerMetrics.GetScrollableRect())) {
       mFrameMetrics.SetScrollableRect(aLayerMetrics.GetScrollableRect());
       needContentRepaint = true;
       scrollableRectChanged = true;
     }
@@ -3697,16 +3750,17 @@ void AsyncPanZoomController::NotifyLayer
       // Send an acknowledgement with the new scroll generation so that any
       // repaint requests later in this function go through.
       // Because of the scroll generation update, any inflight paint requests are
       // going to be ignored by layout, and so mExpectedGeckoMetrics
       // becomes incorrect for the purposes of calculating the LD transform. To
       // correct this we need to update mExpectedGeckoMetrics to be the
       // last thing we know was painted by Gecko.
       mFrameMetrics.CopyScrollInfoFrom(aLayerMetrics);
+      mCompositedScrollOffset = mFrameMetrics.GetScrollOffset();
       mExpectedGeckoMetrics = aLayerMetrics;
 
       // Cancel the animation (which might also trigger a repaint request)
       // after we update the scroll offset above. Otherwise we can be left
       // in a state where things are out of sync.
       CancelAnimation();
 
       // Since the scroll offset has changed, we need to recompute the
--- a/gfx/layers/apz/src/AsyncPanZoomController.h
+++ b/gfx/layers/apz/src/AsyncPanZoomController.h
@@ -726,16 +726,21 @@ private:
   FrameMetrics& mLastContentPaintMetrics;  // for convenience, refers to mLastContentPaintMetadata.mMetrics
   // The last metrics used for a content repaint request.
   FrameMetrics mLastPaintRequestMetrics;
   // The metrics that we expect content to have. This is updated when we
   // request a content repaint, and when we receive a shadow layers update.
   // This allows us to transform events into Gecko's coordinate space.
   FrameMetrics mExpectedGeckoMetrics;
 
+  // These variables cache the scroll offset and zoom stored in |mFrameMetrics|
+  // the last time SampleCompositedAsyncTransform() was called.
+  CSSPoint mCompositedScrollOffset;
+  CSSToParentLayerScale2D mCompositedZoom;
+
   AxisX mX;
   AxisY mY;
 
   // This flag is set to true when we are in a axis-locked pan as a result of
   // the touch-action CSS property.
   bool mPanDirRestricted;
 
   // Most up-to-date constraints on zooming. These should always be reasonable
@@ -780,62 +785,90 @@ public:
   }
 
   /* ===================================================================
    * The functions and members in this section are used to expose
    * the current async transform state to callers.
    */
 public:
   /**
-   * Allows callers to specify which type of async transform they want:
-   * NORMAL provides the actual async transforms of the APZC, whereas
-   * RESPECT_FORCE_DISABLE will provide empty async transforms if and only if
-   * the metrics has the mForceDisableApz flag set. In general the latter should
-   * only be used by call sites that are applying the transform to update
-   * a layer's position.
+   * Allows consumers of async transforms to specify for what purpose they are
+   * using the async transform:
+   *
+   *   |eForHitTesting| is intended for hit-testing and other uses that need
+   *                    the most up-to-date transform, reflecting all events
+   *                    that have been processed so far, even if the transform
+   *                    is not yet reflected visually.
+   *   |eForCompositing| is intended for the transform that should be reflected
+   *                     visually.
+   *
+   * For example, if an APZC has metrics with the mForceDisableApz flag set,
+   * then the |eForCompositing| async transform will be empty, while the
+   * |eForHitTesting| async transform will reflect processed input events
+   * regardless of mForceDisableApz.
    */
-  enum AsyncMode {
-    NORMAL,
-    RESPECT_FORCE_DISABLE,
+  enum AsyncTransformConsumer {
+    eForHitTesting,
+    eForCompositing,
   };
 
   /**
    * Get the current scroll offset of the scrollable frame corresponding
    * to this APZC, including the effects of any asynchronous panning and
    * zooming, in ParentLayer pixels.
    */
-  ParentLayerPoint GetCurrentAsyncScrollOffset(AsyncMode aMode) const;
+  ParentLayerPoint GetCurrentAsyncScrollOffset(AsyncTransformConsumer aMode) const;
 
   /**
    * Get the current scroll offset of the scrollable frame corresponding
    * to this APZC, including the effects of any asynchronous panning, in
    * CSS pixels.
    */
-  CSSPoint GetCurrentAsyncScrollOffsetInCssPixels(AsyncMode aMode) const;
+  CSSPoint GetCurrentAsyncScrollOffsetInCssPixels(AsyncTransformConsumer aMode) const;
 
   /**
    * Return a visual effect that reflects this apzc's
    * overscrolled state, if any.
    */
-  AsyncTransformComponentMatrix GetOverscrollTransform(AsyncMode aMode) const;
+  AsyncTransformComponentMatrix GetOverscrollTransform(AsyncTransformConsumer aMode) const;
 
   /**
    * Returns the incremental transformation corresponding to the async pan/zoom
    * in progress. That is, when this transform is multiplied with the layer's
    * existing transform, it will make the layer appear with the desired pan/zoom
    * amount.
    */
-  AsyncTransform GetCurrentAsyncTransform(AsyncMode aMode) const;
+  AsyncTransform GetCurrentAsyncTransform(AsyncTransformConsumer aMode) const;
 
   /**
    * Returns the same transform as GetCurrentAsyncTransform(), but includes
    * any transform due to axis over-scroll.
    */
-  AsyncTransformComponentMatrix GetCurrentAsyncTransformWithOverscroll(AsyncMode aMode) const;
+  AsyncTransformComponentMatrix GetCurrentAsyncTransformWithOverscroll(AsyncTransformConsumer aMode) const;
 
+private:
+  /**
+   * Samples the composited async transform, making the result of
+   * |GetCurrentAsyncTransform(eForCompositing)| and similar functions reflect
+   * the async scroll offset and zoom stored in |mFrameMetrics|.
+   *
+   * (This is only relevant when |gfxPrefs::APZFrameDelayEnabled() == true|.
+   * Otherwise, GetCurrentAsyncTransform() always reflects what's stored in
+   * |mFrameMetrics| immediately, without any delay.)
+   */
+  void SampleCompositedAsyncTransform();
+
+  /*
+   * Helper functions to query the async scroll offset and zoom either
+   * directly from |mFrameMetrics|, or from cached variables that store
+   * the scroll offset and zoom from the last time it was sampled by
+   * calling SampleCompositedAsyncTransform(), depending on who is asking.
+   */
+  CSSPoint GetEffectiveScrollOffset(AsyncTransformConsumer aMode) const;
+  CSSToParentLayerScale2D GetEffectiveZoom(AsyncTransformConsumer aMode) const;
 
   /* ===================================================================
    * The functions and members in this section are used to manage
    * the state that tracks what this APZC is doing with the input events.
    */
 protected:
   enum PanZoomState {
     NOTHING,                  /* no touch-start events received */
--- a/gfx/layers/apz/src/GestureEventListener.cpp
+++ b/gfx/layers/apz/src/GestureEventListener.cpp
@@ -280,16 +280,23 @@ nsEventStatus GestureEventListener::Hand
 
   // The user has performed a double tap, but not lifted her finger.
   case GESTURE_SECOND_SINGLE_TOUCH_DOWN: {
     // If touch has moved noticeably (within MAX_TAP_TIME), change state.
     if (MoveDistanceIsLarge()) {
       CancelLongTapTimeoutTask();
       CancelMaxTapTimeoutTask();
       mSingleTapSent = Nothing();
+      if (!gfxPrefs::APZOneTouchPinchEnabled()) {
+        // If the one-touch-pinch feature is disabled, bail out of the double-
+        // tap gesture instead.
+        SetState(GESTURE_NONE);
+        break;
+      }
+
       SetState(GESTURE_ONE_TOUCH_PINCH);
 
       ParentLayerCoord currentSpan = 1.0f;
       ParentLayerPoint currentFocus = mTouchStartPosition;
 
       PinchGestureInput pinchEvent(PinchGestureInput::PINCHGESTURE_START,
                                    mLastTouchInput.mTime,
                                    mLastTouchInput.mTimeStamp,
--- a/gfx/layers/apz/test/gtest/APZCBasicTester.h
+++ b/gfx/layers/apz/test/gtest/APZCBasicTester.h
@@ -94,17 +94,17 @@ protected:
     ParentLayerPoint pointOut;
     AsyncTransform viewTransformOut;
     while (apzc->SampleContentTransformForFrame(&viewTransformOut, pointOut)) {
       // The reported scroll offset should be the same throughout.
       EXPECT_EQ(aExpectedScrollOffset, pointOut);
 
       // Trigger computation of the overscroll tranform, to make sure
       // no assetions fire during the calculation.
-      apzc->GetOverscrollTransform(AsyncPanZoomController::NORMAL);
+      apzc->GetOverscrollTransform(AsyncPanZoomController::eForHitTesting);
 
       if (!apzc->IsOverscrolled()) {
         recoveredFromOverscroll = true;
       }
 
       mcc->AdvanceBy(increment);
     }
     EXPECT_TRUE(recoveredFromOverscroll);
--- a/gfx/layers/apz/test/gtest/APZTestCommon.h
+++ b/gfx/layers/apz/test/gtest/APZTestCommon.h
@@ -282,19 +282,19 @@ public:
   }
 
   bool SampleContentTransformForFrame(AsyncTransform* aOutTransform,
                                       ParentLayerPoint& aScrollOffset,
                                       const TimeDuration& aIncrement = TimeDuration::FromMilliseconds(0)) {
     mcc->AdvanceBy(aIncrement);
     bool ret = AdvanceAnimations(mcc->Time());
     if (aOutTransform) {
-      *aOutTransform = GetCurrentAsyncTransform(AsyncPanZoomController::NORMAL);
+      *aOutTransform = GetCurrentAsyncTransform(AsyncPanZoomController::eForHitTesting);
     }
-    aScrollOffset = GetCurrentAsyncScrollOffset(AsyncPanZoomController::NORMAL);
+    aScrollOffset = GetCurrentAsyncScrollOffset(AsyncPanZoomController::eForHitTesting);
     return ret;
   }
 
   void SetWaitForMainThread() {
     mWaitForMainThread = true;
   }
 
 private:
--- a/gfx/layers/apz/test/gtest/TestHitTesting.cpp
+++ b/gfx/layers/apz/test/gtest/TestHitTesting.cpp
@@ -502,18 +502,18 @@ TEST_F(APZHitTestingTester, TestForceDis
   ParentLayerPoint point;
   apzcroot->SampleContentTransformForFrame(&viewTransform, point);
   // Since APZ is force-disabled, we expect to see the async transform via
   // the NORMAL AsyncMode, but not via the RESPECT_FORCE_DISABLE AsyncMode.
   EXPECT_EQ(0, point.x);
   EXPECT_EQ(10, point.y);
   EXPECT_EQ(0, viewTransform.mTranslation.x);
   EXPECT_EQ(-10, viewTransform.mTranslation.y);
-  viewTransform = apzcroot->GetCurrentAsyncTransform(AsyncPanZoomController::RESPECT_FORCE_DISABLE);
-  point = apzcroot->GetCurrentAsyncScrollOffset(AsyncPanZoomController::RESPECT_FORCE_DISABLE);
+  viewTransform = apzcroot->GetCurrentAsyncTransform(AsyncPanZoomController::eForCompositing);
+  point = apzcroot->GetCurrentAsyncScrollOffset(AsyncPanZoomController::eForCompositing);
   EXPECT_EQ(0, point.x);
   EXPECT_EQ(0, point.y);
   EXPECT_EQ(0, viewTransform.mTranslation.x);
   EXPECT_EQ(0, viewTransform.mTranslation.y);
 
   mcc->AdvanceByMillis(10);
 
   // With untransforming events we should get normal behaviour (in this case,
--- a/gfx/layers/apz/test/gtest/TestInputQueue.cpp
+++ b/gfx/layers/apz/test/gtest/TestInputQueue.cpp
@@ -33,12 +33,12 @@ TEST_F(APZCTreeManagerTester, WheelInter
   // Continue the drag, check that the block id is the same as before
   MouseMove(apzc, ScreenIntPoint(7, 5), mcc->Time(), &tmpBlockId);
   EXPECT_EQ(dragBlockId, tmpBlockId);
 
   // Finish the wheel animation
   apzc->AdvanceAnimationsUntilEnd();
 
   // Check that it scrolled
-  ParentLayerPoint scroll = apzc->GetCurrentAsyncScrollOffset(AsyncPanZoomController::NORMAL);
+  ParentLayerPoint scroll = apzc->GetCurrentAsyncScrollOffset(AsyncPanZoomController::eForHitTesting);
   EXPECT_EQ(scroll.x, 0);
   EXPECT_EQ(scroll.y, 10); // We scrolled 1 "line" or 10 pixels
 }
--- a/gfx/layers/apz/test/gtest/TestSnapping.cpp
+++ b/gfx/layers/apz/test/gtest/TestSnapping.cpp
@@ -42,24 +42,24 @@ TEST_F(APZCSnappingTester, Bug1265510)
   // Position the mouse near the bottom of the outer frame and scroll by 60px.
   // (6 lines of 10px each). APZC will actually scroll to y=100 because of the
   // mandatory snap coordinate there.
   TimeStamp now = mcc->Time();
   SmoothWheel(manager, ScreenIntPoint(50, 80), ScreenPoint(0, 6), now);
   // Advance in 5ms increments until we've scrolled by 70px. At this point, the
   // closest snap point is y=100, and the inner frame should be under the mouse
   // cursor.
-  while (outer->GetCurrentAsyncScrollOffset(AsyncPanZoomController::AsyncMode::NORMAL).y < 70) {
+  while (outer->GetCurrentAsyncScrollOffset(AsyncPanZoomController::AsyncTransformConsumer::eForHitTesting).y < 70) {
     mcc->AdvanceByMillis(5);
     outer->AdvanceAnimations(mcc->Time());
   }
   // Now do another wheel in a new transaction. This should start scrolling the
   // inner frame; we verify that it does by checking the inner scroll position.
   TimeStamp newTransactionTime = now + TimeDuration::FromMilliseconds(gfxPrefs::MouseWheelTransactionTimeoutMs() + 100);
   SmoothWheel(manager, ScreenIntPoint(50, 80), ScreenPoint(0, 6), newTransactionTime);
   inner->AdvanceAnimationsUntilEnd();
-  EXPECT_LT(0.0f, inner->GetCurrentAsyncScrollOffset(AsyncPanZoomController::AsyncMode::NORMAL).y);
+  EXPECT_LT(0.0f, inner->GetCurrentAsyncScrollOffset(AsyncPanZoomController::AsyncTransformConsumer::eForHitTesting).y);
 
   // However, the outer frame should also continue to the snap point, otherwise
   // it is demonstrating incorrect behaviour by violating the mandatory snapping.
   outer->AdvanceAnimationsUntilEnd();
-  EXPECT_EQ(100.0f, outer->GetCurrentAsyncScrollOffset(AsyncPanZoomController::AsyncMode::NORMAL).y);
+  EXPECT_EQ(100.0f, outer->GetCurrentAsyncScrollOffset(AsyncPanZoomController::AsyncTransformConsumer::eForHitTesting).y);
 }
--- a/gfx/layers/apz/test/mochitest/helper_touch_action_regions.html
+++ b/gfx/layers/apz/test/mochitest/helper_touch_action_regions.html
@@ -66,17 +66,17 @@ function chromeTouchEventCounter(operati
       topWin.removeEventListener('touchend', topWin.counter);
       delete topWin.counter;
       delete topWin.eventCounts;
       return true;
     });
   }
 
   if (typeof chromeTouchEventCounter.chromeHelper == 'undefined') {
-    // This is the first time getSnapshot is being called; do initialization
+    // This is the first time chromeTouchEventCounter is being called; do initialization
     chromeTouchEventCounter.chromeHelper = SpecialPowers.loadChromeScript(chromeProcessCounter);
     SimpleTest.registerCleanupFunction(function() { chromeTouchEventCounter.chromeHelper.destroy() });
   }
 
   return chromeTouchEventCounter.chromeHelper.sendSyncMessage(operation, "");
 }
 
 // Simple wrapper that waits until the chrome process has seen |count| instances
@@ -177,37 +177,46 @@ function* test(testDriver) {
   synthesizeNativeTouch(scroller, 10, 10, SpecialPowers.DOMWindowUtils.TOUCH_REMOVE, null, 0);
   SpecialPowers.executeSoon(testDriver);
   ok(true, "Finished setting up event queue");
 
   // Get our baseline snapshot
   var rect = rectRelativeToScreen(scroller);
   var lastSnapshot = getSnapshot(rect);
   ok(true, "Got baseline snapshot");
+  var numDifferentSnapshotPairs = 0;
 
   yield; // this will tell the chrome process to synthesize the touchstart event
          // and then we wait to make sure it got processed:
   ok(waitFor('touchstart', 1), "Touchstart processed in chrome process");
 
   // Loop through the touchmove events
   for (var i = 1; i < 10; i++) {
     yield;
     ok(waitFor('touchmove', i), "Touchmove processed in chrome process");
 
+    // Take a snapshot after each touch move event. This forces
+    // a composite each time, even we don't get a vsync in this
+    // interval.
     var snapshot = getSnapshot(rect);
-    if (i == 1) {
-      // The first touchmove is consumed to get us into the panning state, so
-      // no actual panning occurs
-      ok(lastSnapshot == snapshot, "Snapshot 1 was the same as baseline");
-    } else {
-      ok(lastSnapshot != snapshot, "Snapshot " + i + " was different from the previous one");
+    if (lastSnapshot != snapshot) {
+      numDifferentSnapshotPairs += 1;
     }
     lastSnapshot = snapshot;
   }
 
+  // Check that the snapshot has changed since the baseline, indicating
+  // that the touch events caused async scrolling. Note that, since we
+  // orce a composite after each touch event, even if there is a frame
+  // of delay between APZ processing a touch event and the compositor
+  // applying the async scroll (bug 1375949), by the end of the gesture
+  // the snapshot should have changed.
+  ok(numDifferentSnapshotPairs > 0,
+     "The number of different snapshot pairs was " + numDifferentSnapshotPairs);
+
   // Wait for the touchend as well, just for good form
   yield;
   ok(waitFor('touchend', 1), "Touchend processed in chrome process");
 
   // Clean up the chrome process hooks
   chromeTouchEventCounter('end');
 
   // Now we are going to release our grip on the child process main thread,
--- a/gfx/layers/composite/AsyncCompositionManager.cpp
+++ b/gfx/layers/composite/AsyncCompositionManager.cpp
@@ -912,19 +912,19 @@ AsyncCompositionManager::ApplyAsyncConte
           AsyncPanZoomController* controller = layer->GetAsyncPanZoomController(i);
           if (!controller) {
             continue;
           }
 
           hasAsyncTransform = true;
 
           AsyncTransform asyncTransformWithoutOverscroll =
-              controller->GetCurrentAsyncTransform(AsyncPanZoomController::RESPECT_FORCE_DISABLE);
+              controller->GetCurrentAsyncTransform(AsyncPanZoomController::eForCompositing);
           AsyncTransformComponentMatrix overscrollTransform =
-              controller->GetOverscrollTransform(AsyncPanZoomController::RESPECT_FORCE_DISABLE);
+              controller->GetOverscrollTransform(AsyncPanZoomController::eForCompositing);
           AsyncTransformComponentMatrix asyncTransform =
               AsyncTransformComponentMatrix(asyncTransformWithoutOverscroll)
             * overscrollTransform;
 
           if (!layer->IsScrollInfoLayer()) {
             controller->MarkAsyncTransformAppliedToContent();
           }
 
@@ -1150,17 +1150,17 @@ AsyncCompositionManager::ComputeTransfor
   // disparity between scrollbars and visible content.
   if (aMetrics.IsScrollInfoLayer()) {
     return LayerToParentLayerMatrix4x4{};
   }
 
   MOZ_RELEASE_ASSERT(aApzc);
 
   AsyncTransformComponentMatrix asyncTransform =
-    aApzc->GetCurrentAsyncTransform(AsyncPanZoomController::RESPECT_FORCE_DISABLE);
+    aApzc->GetCurrentAsyncTransform(AsyncPanZoomController::eForCompositing);
 
   // |asyncTransform| represents the amount by which we have scrolled and
   // zoomed since the last paint. Because the scrollbar was sized and positioned based
   // on the painted content, we need to adjust it based on asyncTransform so that
   // it reflects what the user is actually seeing now.
   AsyncTransformComponentMatrix scrollbarTransform;
   if (aThumbData.mDirection == ScrollDirection::VERTICAL) {
     const ParentLayerCoord asyncScrollY = asyncTransform._42;
@@ -1266,17 +1266,17 @@ AsyncCompositionManager::ComputeTransfor
   // wrong place.
   //
   // Note that since the async transform is applied on top of the content's
   // regular transform, we need to make sure to unapply the async transform in
   // the same coordinate space. This requires applying the content transform
   // and then unapplying it after unapplying the async transform.
   if (aScrollbarIsDescendant) {
     AsyncTransformComponentMatrix overscroll =
-        aApzc->GetOverscrollTransform(AsyncPanZoomController::RESPECT_FORCE_DISABLE);
+        aApzc->GetOverscrollTransform(AsyncPanZoomController::eForCompositing);
     Matrix4x4 asyncUntransform = (asyncTransform * overscroll).Inverse().ToUnknownMatrix();
     Matrix4x4 contentTransform = aScrollableContentTransform;
     Matrix4x4 contentUntransform = contentTransform.Inverse();
 
     AsyncTransformComponentMatrix asyncCompensation =
         ViewAs<AsyncTransformComponentMatrix>(
             contentTransform
           * asyncUntransform
--- a/gfx/layers/composite/ContainerLayerComposite.cpp
+++ b/gfx/layers/composite/ContainerLayerComposite.cpp
@@ -288,17 +288,17 @@ RenderMinimap(ContainerT* aContainer, La
     return;
   }
 
   AsyncPanZoomController* controller = aLayer->GetAsyncPanZoomController(0);
   if (!controller) {
     return;
   }
 
-  ParentLayerPoint scrollOffset = controller->GetCurrentAsyncScrollOffset(AsyncPanZoomController::RESPECT_FORCE_DISABLE);
+  ParentLayerPoint scrollOffset = controller->GetCurrentAsyncScrollOffset(AsyncPanZoomController::eForCompositing);
 
   // Options
   const int verticalPadding = 10;
   const int horizontalPadding = 5;
   gfx::Color backgroundColor(0.3f, 0.3f, 0.3f, 0.3f);
   gfx::Color tileActiveColor(1, 1, 1, 0.4f);
   gfx::Color tileBorderColor(0, 0, 0, 0.1f);
   gfx::Color pageBorderColor(0, 0, 0);
@@ -478,17 +478,17 @@ RenderLayers(ContainerT* aContainer, Lay
         // use the parent's effective transform rather than the layer's own.
         ParentLayerRect compositionBounds = layer->GetFrameMetrics(i - 1).GetCompositionBounds();
         aManager->GetCompositor()->DrawDiagnostics(DiagnosticFlags::CONTAINER,
                                                    compositionBounds.ToUnknownRect(),
                                                    aClipRect.ToUnknownRect(),
                                                    asyncTransform * aContainer->GetEffectiveTransform());
         if (AsyncPanZoomController* apzc = layer->GetAsyncPanZoomController(i - 1)) {
           asyncTransform =
-              apzc->GetCurrentAsyncTransformWithOverscroll(AsyncPanZoomController::RESPECT_FORCE_DISABLE).ToUnknownMatrix()
+              apzc->GetCurrentAsyncTransformWithOverscroll(AsyncPanZoomController::eForCompositing).ToUnknownMatrix()
             * asyncTransform;
         }
       }
     }
 
     if (gfxPrefs::APZMinimap()) {
       RenderMinimap(aContainer, aManager, aClipRect, layer);
     }
@@ -628,17 +628,17 @@ ContainerRender(ContainerT* aContainer,
   // enabled).
   if (gfxPrefs::LayersDrawFPS() && aContainer->IsScrollInfoLayer()) {
     // Since aContainer doesn't have any children we can just iterate from the top metrics
     // on it down to the bottom using GetFirstChild and not worry about walking onto another
     // underlying layer.
     for (LayerMetricsWrapper i(aContainer); i; i = i.GetFirstChild()) {
       if (AsyncPanZoomController* apzc = i.GetApzc()) {
         if (!apzc->GetAsyncTransformAppliedToContent()
-            && !AsyncTransformComponentMatrix(apzc->GetCurrentAsyncTransform(AsyncPanZoomController::NORMAL)).IsIdentity()) {
+            && !AsyncTransformComponentMatrix(apzc->GetCurrentAsyncTransform(AsyncPanZoomController::eForHitTesting)).IsIdentity()) {
           aManager->UnusedApzTransformWarning();
           break;
         }
       }
     }
   }
 }
 
--- a/gfx/layers/ipc/PUiCompositorController.ipdl
+++ b/gfx/layers/ipc/PUiCompositorController.ipdl
@@ -35,14 +35,14 @@ parent:
   async Pinned(bool aPinned, int32_t aReason);
   async ToolbarAnimatorMessageFromUI(int32_t aMessage);
   async DefaultClearColor(uint32_t aColor);
   async RequestScreenPixels();
   async EnableLayerUpdateNotifications(bool aEnable);
   async ToolbarPixelsToCompositor(Shmem aMem, ScreenIntSize aSize);
 child:
   async ToolbarAnimatorMessageFromCompositor(int32_t aMessage);
-  async RootFrameMetrics(ScreenPoint aScrollOffset, CSSToScreenScale aZoom, CSSRect aPage);
+  async RootFrameMetrics(ScreenPoint aScrollOffset, CSSToScreenScale aZoom);
   async ScreenPixels(Shmem aMem, ScreenIntSize aSize);
 };
 
 } // layers
 } // mozilla
--- a/gfx/layers/ipc/UiCompositorControllerChild.cpp
+++ b/gfx/layers/ipc/UiCompositorControllerChild.cpp
@@ -270,21 +270,21 @@ UiCompositorControllerChild::RecvToolbar
     mWidget->RecvToolbarAnimatorMessageFromCompositor(aMessage);
   }
 #endif // defined(MOZ_WIDGET_ANDROID)
 
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
-UiCompositorControllerChild::RecvRootFrameMetrics(const ScreenPoint& aScrollOffset, const CSSToScreenScale& aZoom, const CSSRect& aPage)
+UiCompositorControllerChild::RecvRootFrameMetrics(const ScreenPoint& aScrollOffset, const CSSToScreenScale& aZoom)
 {
 #if defined(MOZ_WIDGET_ANDROID)
   if (mWidget) {
-    mWidget->UpdateRootFrameMetrics(aScrollOffset, aZoom, aPage);
+    mWidget->UpdateRootFrameMetrics(aScrollOffset, aZoom);
   }
 #endif // defined(MOZ_WIDGET_ANDROID)
 
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 UiCompositorControllerChild::RecvScreenPixels(ipc::Shmem&& aMem, const ScreenIntSize& aSize)
--- a/gfx/layers/ipc/UiCompositorControllerChild.h
+++ b/gfx/layers/ipc/UiCompositorControllerChild.h
@@ -48,17 +48,17 @@ public:
   bool DeallocPixelBuffer(Shmem& aMem);
 
 protected:
   void ActorDestroy(ActorDestroyReason aWhy) override;
   void DeallocPUiCompositorControllerChild() override;
   void ProcessingError(Result aCode, const char* aReason) override;
   virtual void HandleFatalError(const char* aName, const char* aMsg) const override;
   mozilla::ipc::IPCResult RecvToolbarAnimatorMessageFromCompositor(const int32_t& aMessage) override;
-  mozilla::ipc::IPCResult RecvRootFrameMetrics(const ScreenPoint& aScrollOffset, const CSSToScreenScale& aZoom, const CSSRect& aPage) override;
+  mozilla::ipc::IPCResult RecvRootFrameMetrics(const ScreenPoint& aScrollOffset, const CSSToScreenScale& aZoom) override;
   mozilla::ipc::IPCResult RecvScreenPixels(ipc::Shmem&& aMem, const ScreenIntSize& aSize) override;
 private:
   explicit UiCompositorControllerChild(const uint64_t& aProcessToken);
   ~UiCompositorControllerChild();
   void OpenForSameProcess();
   void OpenForGPUProcess(Endpoint<PUiCompositorControllerChild>&& aEndpoint);
   void SendCachedValues();
 
--- a/gfx/thebes/gfxPrefs.h
+++ b/gfx/thebes/gfxPrefs.h
@@ -306,23 +306,25 @@ private:
   DECL_GFX_PREF(Once, "apz.fling_curve_function_x2",           APZCurveFunctionX2, float, 1.0f);
   DECL_GFX_PREF(Once, "apz.fling_curve_function_y1",           APZCurveFunctionY1, float, 0.0f);
   DECL_GFX_PREF(Once, "apz.fling_curve_function_y2",           APZCurveFunctionY2, float, 1.0f);
   DECL_GFX_PREF(Live, "apz.fling_curve_threshold_inches_per_ms", APZCurveThreshold, float, -1.0f);
   DECL_GFX_PREF(Live, "apz.fling_friction",                    APZFlingFriction, float, 0.002f);
   DECL_GFX_PREF(Live, "apz.fling_min_velocity_threshold",      APZFlingMinVelocityThreshold, float, 0.5f);
   DECL_GFX_PREF(Live, "apz.fling_stop_on_tap_threshold",       APZFlingStopOnTapThreshold, float, 0.05f);
   DECL_GFX_PREF(Live, "apz.fling_stopped_threshold",           APZFlingStoppedThreshold, float, 0.01f);
+  DECL_GFX_PREF(Live, "apz.frame_delay.enabled",               APZFrameDelayEnabled, bool, false);
   DECL_GFX_PREF(Live, "apz.highlight_checkerboarded_areas",    APZHighlightCheckerboardedAreas, bool, false);
   DECL_GFX_PREF(Once, "apz.keyboard.enabled",                  APZKeyboardEnabled, bool, false);
   DECL_GFX_PREF(Live, "apz.max_velocity_inches_per_ms",        APZMaxVelocity, float, -1.0f);
   DECL_GFX_PREF(Once, "apz.max_velocity_queue_size",           APZMaxVelocityQueueSize, uint32_t, 5);
   DECL_GFX_PREF(Live, "apz.min_skate_speed",                   APZMinSkateSpeed, float, 1.0f);
   DECL_GFX_PREF(Live, "apz.minimap.enabled",                   APZMinimap, bool, false);
   DECL_GFX_PREF(Live, "apz.minimap.visibility.enabled",        APZMinimapVisibilityEnabled, bool, false);
+  DECL_GFX_PREF(Live, "apz.one_touch_pinch.enabled",           APZOneTouchPinchEnabled, bool, true);
   DECL_GFX_PREF(Live, "apz.overscroll.enabled",                APZOverscrollEnabled, bool, false);
   DECL_GFX_PREF(Live, "apz.overscroll.min_pan_distance_ratio", APZMinPanDistanceRatio, float, 1.0f);
   DECL_GFX_PREF(Live, "apz.overscroll.spring_friction",        APZOverscrollSpringFriction, float, 0.015f);
   DECL_GFX_PREF(Live, "apz.overscroll.spring_stiffness",       APZOverscrollSpringStiffness, float, 0.001f);
   DECL_GFX_PREF(Live, "apz.overscroll.stop_distance_threshold", APZOverscrollStopDistanceThreshold, float, 5.0f);
   DECL_GFX_PREF(Live, "apz.overscroll.stop_velocity_threshold", APZOverscrollStopVelocityThreshold, float, 0.01f);
   DECL_GFX_PREF(Live, "apz.overscroll.stretch_factor",         APZOverscrollStretchFactor, float, 0.5f);
   DECL_GFX_PREF(Live, "apz.paint_skipping.enabled",            APZPaintSkipping, bool, true);
--- a/js/xpconnect/loader/mozJSComponentLoader.cpp
+++ b/js/xpconnect/loader/mozJSComponentLoader.cpp
@@ -293,26 +293,16 @@ NS_IMPL_ISUPPORTS(mozJSComponentLoader,
                   mozilla::ModuleLoader,
                   xpcIJSModuleLoader,
                   nsIObserver)
 
 nsresult
 mozJSComponentLoader::ReallyInit()
 {
     nsresult rv;
-
-    nsCOMPtr<nsIScriptSecurityManager> secman =
-        do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID);
-    if (!secman)
-        return NS_ERROR_FAILURE;
-
-    rv = secman->GetSystemPrincipal(getter_AddRefs(mSystemPrincipal));
-    if (NS_FAILED(rv) || !mSystemPrincipal)
-        return NS_ERROR_FAILURE;
-
     nsCOMPtr<nsIObserverService> obsSvc =
         do_GetService(kObserverServiceContractID, &rv);
     NS_ENSURE_SUCCESS(rv, rv);
 
     rv = obsSvc->AddObserver(this, "xpcom-shutdown-loaders", false);
     NS_ENSURE_SUCCESS(rv, rv);
 
     mInitialized = true;
@@ -486,17 +476,17 @@ mozJSComponentLoader::CreateLoaderGlobal
 
     // Defer firing OnNewGlobalObject until after the __URI__ property has
     // been defined so the JS debugger can tell what module the global is
     // for
     nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
     rv = nsXPConnect::XPConnect()->
         InitClassesWithNewWrappedGlobal(aCx,
                                         static_cast<nsIGlobalObject*>(backstagePass),
-                                        mSystemPrincipal,
+                                        nsContentUtils::GetSystemPrincipal(),
                                         nsIXPConnect::DONT_FIRE_ONNEWGLOBALHOOK,
                                         options,
                                         getter_AddRefs(holder));
     NS_ENSURE_SUCCESS_VOID(rv);
 
     RootedObject global(aCx, holder->GetJSObject());
     NS_ENSURE_TRUE_VOID(global);
 
@@ -624,17 +614,17 @@ mozJSComponentLoader::ObjectForLocation(
     StartupCache* cache = StartupCache::GetSingleton();
 
     nsAutoCString cachePath(kJSCachePrefix);
     rv = PathifyURI(aInfo.URI(), cachePath);
     NS_ENSURE_SUCCESS(rv, rv);
 
     script = ScriptPreloader::GetSingleton().GetCachedScript(cx, cachePath);
     if (!script && cache) {
-        ReadCachedScript(cache, cachePath, cx, mSystemPrincipal, &script);
+        ReadCachedScript(cache, cachePath, cx, &script);
     }
 
     if (script) {
         LOG(("Successfully loaded %s from startupcache\n", nativePath.get()));
     } else if (cache) {
         // This is ok, it just means the script is not yet in the
         // cache. Could mean that the cache was corrupted and got removed,
         // but either way we're going to write this out.
@@ -710,18 +700,17 @@ mozJSComponentLoader::ObjectForLocation(
     if (!script) {
         return NS_ERROR_FAILURE;
     }
 
     ScriptPreloader::GetSingleton().NoteScript(nativePath, cachePath, script);
 
     if (writeToCache) {
         // We successfully compiled the script, so cache it.
-        rv = WriteCachedScript(cache, cachePath, cx, mSystemPrincipal,
-                               script);
+        rv = WriteCachedScript(cache, cachePath, cx, script);
 
         // Don't treat failure to write as fatal, since we might be working
         // with a read-only cache.
         if (NS_SUCCEEDED(rv)) {
             LOG(("Successfully wrote to cache\n"));
         } else {
             LOG(("Failed to write to cache\n"));
         }
--- a/js/xpconnect/loader/mozJSComponentLoader.h
+++ b/js/xpconnect/loader/mozJSComponentLoader.h
@@ -81,17 +81,16 @@ class mozJSComponentLoader : public mozi
                                JS::MutableHandleValue aException);
 
     nsresult ImportInto(const nsACString& aLocation,
                         JS::HandleObject targetObj,
                         JSContext* callercx,
                         JS::MutableHandleObject vp);
 
     nsCOMPtr<nsIComponentManager> mCompMgr;
-    nsCOMPtr<nsIPrincipal> mSystemPrincipal;
 
     class ModuleEntry : public mozilla::Module
     {
     public:
         explicit ModuleEntry(JS::RootingContext* aRootingCx)
           : mozilla::Module(), obj(aRootingCx), thisObjectKey(aRootingCx)
         {
             mVersion = mozilla::Module::kVersion;
--- a/js/xpconnect/loader/mozJSLoaderUtils.cpp
+++ b/js/xpconnect/loader/mozJSLoaderUtils.cpp
@@ -16,17 +16,17 @@ using namespace JS;
 using namespace mozilla::scache;
 using mozilla::UniquePtr;
 
 // We only serialize scripts with system principals. So we don't serialize the
 // principals when writing a script. Instead, when reading it back, we set the
 // principals to the system principals.
 nsresult
 ReadCachedScript(StartupCache* cache, nsACString& uri, JSContext* cx,
-                 nsIPrincipal* systemPrincipal, MutableHandleScript scriptp)
+                 MutableHandleScript scriptp)
 {
     UniquePtr<char[]> buf;
     uint32_t len;
     nsresult rv = cache->GetBuffer(PromiseFlatCString(uri).get(), &buf, &len);
     if (NS_FAILED(rv))
         return rv; // don't warn since NOT_AVAILABLE is an ok error
 
     JS::TranscodeBuffer buffer;
@@ -40,19 +40,19 @@ ReadCachedScript(StartupCache* cache, ns
 
     MOZ_ASSERT((code & JS::TranscodeResult_Throw) != 0);
     JS_ClearPendingException(cx);
     return NS_ERROR_OUT_OF_MEMORY;
 }
 
 nsresult
 WriteCachedScript(StartupCache* cache, nsACString& uri, JSContext* cx,
-                  nsIPrincipal* systemPrincipal, HandleScript script)
+                  HandleScript script)
 {
-    MOZ_ASSERT(JS_GetScriptPrincipals(script) == nsJSPrincipals::get(systemPrincipal));
+    MOZ_ASSERT(nsJSPrincipals::get(JS_GetScriptPrincipals(script))->GetIsSystemPrincipal());
 
     JS::TranscodeBuffer buffer;
     JS::TranscodeResult code = JS::EncodeScript(cx, buffer, script);
     if (code != JS::TranscodeResult_Ok) {
         if ((code & JS::TranscodeResult_Failure) != 0)
             return NS_ERROR_FAILURE;
         MOZ_ASSERT((code & JS::TranscodeResult_Throw) != 0);
         JS_ClearPendingException(cx);
--- a/js/xpconnect/loader/mozJSLoaderUtils.h
+++ b/js/xpconnect/loader/mozJSLoaderUtils.h
@@ -12,17 +12,15 @@
 namespace mozilla {
 namespace scache {
 class StartupCache;
 } // namespace scache
 } // namespace mozilla
 
 nsresult
 ReadCachedScript(mozilla::scache::StartupCache* cache, nsACString& uri,
-                 JSContext* cx, nsIPrincipal* systemPrincipal,
-                 JS::MutableHandleScript scriptp);
+                 JSContext* cx, JS::MutableHandleScript scriptp);
 
 nsresult
 WriteCachedScript(mozilla::scache::StartupCache* cache, nsACString& uri,
-                  JSContext* cx, nsIPrincipal* systemPrincipal,
-                  JS::HandleScript script);
+                  JSContext* cx, JS::HandleScript script);
 
 #endif /* mozJSLoaderUtils_h */
--- a/js/xpconnect/loader/mozJSSubScriptLoader.cpp
+++ b/js/xpconnect/loader/mozJSSubScriptLoader.cpp
@@ -199,29 +199,16 @@ EvalScript(JSContext* cx,
     }
 
     if (script && (startupCache || preloadCache)) {
         nsAutoCString cachePath;
         JSVersion version = JS_GetVersion(cx);
         cachePath.AppendPrintf("jssubloader/%d", version);
         PathifyURI(uri, cachePath);
 
-        nsCOMPtr<nsIScriptSecurityManager> secman =
-            do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID);
-        if (!secman) {
-            return false;
-        }
-
-        nsCOMPtr<nsIPrincipal> principal;
-        nsresult rv = secman->GetSystemPrincipal(getter_AddRefs(principal));
-        if (NS_FAILED(rv) || !principal) {
-            ReportError(cx, LOAD_ERROR_NOPRINCIPALS, uri);
-            return false;
-        }
-
         nsCString uriStr;
         if (preloadCache && NS_SUCCEEDED(uri->GetSpec(uriStr))) {
             // Note that, when called during startup, this will keep the
             // original JSScript object alive for an indefinite amount of time.
             // This has the side-effect of keeping the global that the script
             // was compiled for alive, too.
             //
             // For most startups, the global in question will be the
@@ -239,18 +226,17 @@ EvalScript(JSContext* cx,
             // to cached scripts being held alive, and tied to nuked Sandbox
             // globals. Given the unusual circumstances required to trigger
             // this, it's not a major concern. But it should be kept in mind.
             ScriptPreloader::GetSingleton().NoteScript(uriStr, cachePath, script);
         }
 
         if (startupCache) {
             JSAutoCompartment ac(cx, script);
-            WriteCachedScript(StartupCache::GetSingleton(),
-                              cachePath, cx, principal, script);
+            WriteCachedScript(StartupCache::GetSingleton(), cachePath, cx, script);
         }
     }
 
     return true;
 }
 
 class AsyncScriptLoader : public nsIIncrementalStreamLoaderObserver
 {
@@ -567,49 +553,29 @@ mozJSSubScriptLoader::LoadSubScriptWithO
 
 nsresult
 mozJSSubScriptLoader::DoLoadSubScriptWithOptions(const nsAString& url,
                                                  LoadSubScriptOptions& options,
                                                  JSContext* cx,
                                                  MutableHandleValue retval)
 {
     nsresult rv = NS_OK;
-
-    /* set the system principal if it's not here already */
-    if (!mSystemPrincipal) {
-        nsCOMPtr<nsIScriptSecurityManager> secman =
-            do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID);
-        if (!secman)
-            return NS_OK;
-
-        rv = secman->GetSystemPrincipal(getter_AddRefs(mSystemPrincipal));
-        if (NS_FAILED(rv) || !mSystemPrincipal)
-            return rv;
-    }
-
     RootedObject targetObj(cx);
     if (options.target) {
         targetObj = options.target;
     } else {
         mozJSComponentLoader* loader = mozJSComponentLoader::Get();
         loader->FindTargetObject(cx, &targetObj);
         MOZ_ASSERT(JS_IsGlobalObject(targetObj));
     }
 
-    // Remember an object out of the calling compartment so that we
-    // can properly wrap the result later.
-    nsCOMPtr<nsIPrincipal> principal = mSystemPrincipal;
-    RootedObject result_obj(cx, targetObj);
     targetObj = JS_FindCompilationScope(cx, targetObj);
     if (!targetObj)
         return NS_ERROR_FAILURE;
 
-    if (targetObj != result_obj)
-        principal = GetObjectPrincipal(targetObj);
-
     /* load up the url.  From here on, failures are reflected as ``custom''
      * js exceptions */
     nsCOMPtr<nsIURI> uri;
     nsAutoCString uriStr;
     nsAutoCString scheme;
 
     // Figure out who's calling us
     JS::AutoFilename filename;
@@ -667,31 +633,32 @@ mozJSSubScriptLoader::DoLoadSubScriptWit
         tmp.AppendLiteral(" -> ");
         tmp.Append(uriStr);
 
         uriStr = tmp;
     }
 
     // Suppress caching if we're compiling as content or if we're loading a
     // blob: URI.
-    bool ignoreCache = options.ignoreCache || principal != mSystemPrincipal ||
-                       scheme.EqualsLiteral("blob");
+    bool ignoreCache = options.ignoreCache
+        || !GetObjectPrincipal(targetObj)->GetIsSystemPrincipal()
+        || scheme.EqualsLiteral("blob");
     StartupCache* cache = ignoreCache ? nullptr : StartupCache::GetSingleton();
 
     JSVersion version = JS_GetVersion(cx);
     nsAutoCString cachePath;
     cachePath.AppendPrintf("jssubloader/%d", version);
     PathifyURI(uri, cachePath);
 
     RootedScript script(cx);
     if (!options.ignoreCache) {
         if (!options.wantReturnValue)
             script = ScriptPreloader::GetSingleton().GetCachedScript(cx, cachePath);
         if (!script && cache)
-            rv = ReadCachedScript(cache, cachePath, cx, mSystemPrincipal, &script);
+            rv = ReadCachedScript(cache, cachePath, cx, &script);
         if (NS_FAILED(rv) || !script) {
             // ReadCachedScript may have set a pending exception.
             JS_ClearPendingException(cx);
         }
     }
 
     // If we are doing an async load, trigger it and bail out.
     if (!script && options.async) {
--- a/js/xpconnect/loader/mozJSSubScriptLoader.h
+++ b/js/xpconnect/loader/mozJSSubScriptLoader.h
@@ -46,11 +46,9 @@ private:
                              bool wantReturnValue,
                              bool cache,
                              JS::MutableHandleValue retval);
 
     nsresult DoLoadSubScriptWithOptions(const nsAString& url,
                                         LoadSubScriptOptions& options,
                                         JSContext* cx,
                                         JS::MutableHandleValue retval);
-
-    nsCOMPtr<nsIPrincipal> mSystemPrincipal;
 };
--- a/layout/base/MobileViewportManager.cpp
+++ b/layout/base/MobileViewportManager.cpp
@@ -83,33 +83,44 @@ MobileViewportManager::Destroy()
   mDocument = nullptr;
   mPresShell = nullptr;
 }
 
 void
 MobileViewportManager::SetRestoreResolution(float aResolution,
                                             LayoutDeviceIntSize aDisplaySize)
 {
-  mRestoreResolution = Some(aResolution);
+  SetRestoreResolution(aResolution);
   ScreenIntSize restoreDisplaySize = ViewAs<ScreenPixel>(aDisplaySize,
     PixelCastJustification::LayoutDeviceIsScreenForBounds);
   mRestoreDisplaySize = Some(restoreDisplaySize);
 }
 
 void
+MobileViewportManager::SetRestoreResolution(float aResolution)
+{
+  mRestoreResolution = Some(aResolution);
+}
+
+void
 MobileViewportManager::RequestReflow()
 {
   MVM_LOG("%p: got a reflow request\n", this);
   RefreshViewportSize(false);
 }
 
 void
 MobileViewportManager::ResolutionUpdated()
 {
   MVM_LOG("%p: resolution updated\n", this);
+  if (!mPainted) {
+    // Save the value, so our default zoom calculation
+    // can take it into account later on.
+    SetRestoreResolution(mPresShell->GetResolution());
+  }
   RefreshSPCSPS();
 }
 
 NS_IMETHODIMP
 MobileViewportManager::HandleEvent(nsIDOMEvent* event)
 {
   nsAutoString type;
   event->GetType(type);
@@ -194,17 +205,17 @@ MobileViewportManager::UpdateResolution(
 {
   CSSToLayoutDeviceScale cssToDev =
       mPresShell->GetPresContext()->CSSToDevPixelScale();
   LayoutDeviceToLayerScale res(mPresShell->GetResolution());
 
   if (mIsFirstPaint) {
     CSSToScreenScale defaultZoom;
     if (mRestoreResolution) {
-    LayoutDeviceToLayerScale restoreResolution(mRestoreResolution.value());
+      LayoutDeviceToLayerScale restoreResolution(mRestoreResolution.value());
       if (mRestoreDisplaySize) {
         CSSSize prevViewport = mDocument->GetViewportInfo(mRestoreDisplaySize.value()).GetSize();
         float restoreDisplayWidthChangeRatio = (mRestoreDisplaySize.value().width > 0)
           ? (float)aDisplaySize.width / (float)mRestoreDisplaySize.value().width : 1.0f;
 
         restoreResolution =
           ScaleResolutionWithDisplayWidth(restoreResolution,
                                           restoreDisplayWidthChangeRatio,
--- a/layout/base/MobileViewportManager.h
+++ b/layout/base/MobileViewportManager.h
@@ -32,16 +32,20 @@ public:
    * resolution computed from the viewport info metadata. This is in the same
    * "units" as the argument to nsDOMWindowUtils::SetResolutionAndScaleTo.
    * Also takes the previous display dimensions as they were at the time the
    * resolution was stored in order to correctly adjust the resolution if the
    * device was rotated in the meantime. */
   void SetRestoreResolution(float aResolution,
                             mozilla::LayoutDeviceIntSize aDisplaySize);
 
+private:
+  void SetRestoreResolution(float aResolution);
+
+public:
   /* Notify the MobileViewportManager that a reflow was requested in the
    * presShell.*/
   void RequestReflow();
 
   /* Notify the MobileViewportManager that the resolution on the presShell was
    * updated, and the SPCSPS needs to be updated. */
   void ResolutionUpdated();
 
--- a/layout/base/RestyleManager.cpp
+++ b/layout/base/RestyleManager.cpp
@@ -150,18 +150,17 @@ RestyleManager::RestyleForInsertOrChange
   // The container might be a document or a ShadowRoot.
   if (!aContainer->IsElement()) {
     return;
   }
   Element* container = aContainer->AsElement();
 
   NS_ASSERTION(!aChild->IsRootOfAnonymousSubtree(),
                "anonymous nodes should not be in child lists");
-  uint32_t selectorFlags =
-    container ? (container->GetFlags() & NODE_ALL_SELECTOR_FLAGS) : 0;
+  uint32_t selectorFlags = container->GetFlags() & NODE_ALL_SELECTOR_FLAGS;
   if (selectorFlags == 0)
     return;
 
   if (selectorFlags & NODE_HAS_EMPTY_SELECTOR) {
     // see whether we need to restyle the container
     bool wasEmpty = true; // :empty or :-moz-only-whitespace
     for (nsIContent* child = container->GetFirstChild();
          child;
@@ -245,18 +244,17 @@ RestyleManager::ContentRemoved(nsINode* 
 
   if (aOldChild->IsRootOfAnonymousSubtree()) {
     // This should be an assert, but this is called incorrectly in
     // HTMLEditor::DeleteRefToAnonymousNode and the assertions were clogging
     // up the logs.  Make it an assert again when that's fixed.
     MOZ_ASSERT(aOldChild->GetProperty(nsGkAtoms::restylableAnonymousNode),
                "anonymous nodes should not be in child lists (bug 439258)");
   }
-  uint32_t selectorFlags =
-    container ? (container->GetFlags() & NODE_ALL_SELECTOR_FLAGS) : 0;
+  uint32_t selectorFlags = container->GetFlags() & NODE_ALL_SELECTOR_FLAGS;
   if (selectorFlags == 0)
     return;
 
   if (selectorFlags & NODE_HAS_EMPTY_SELECTOR) {
     // see whether we need to restyle the container
     bool isEmpty = true; // :empty or :-moz-only-whitespace
     for (nsIContent* child = container->GetFirstChild();
          child;
--- a/layout/base/RestyleManager.h
+++ b/layout/base/RestyleManager.h
@@ -251,19 +251,19 @@ private:
   uint32_t mRestyleGeneration;
   uint32_t mHoverGeneration;
 
   // Used to keep track of frames that have been destroyed during
   // ProcessRestyledFrames, so we don't try to touch them again even if
   // they're referenced again later in the changelist.
   mozilla::UniquePtr<nsTHashtable<nsPtrHashKey<const nsIFrame>>> mDestroyedFrames;
 
+protected:
   const StyleBackendType mType;
 
-protected:
   // True if we're in the middle of a nsRefreshDriver refresh
   bool mInStyleRefresh;
 
   // The total number of animation flushes by this frame constructor.
   // Used to keep the layer and animation manager in sync.
   uint64_t mAnimationGeneration;
 
   OverflowChangedTracker mOverflowChangedTracker;
--- a/layout/base/RestyleManagerHandle.h
+++ b/layout/base/RestyleManagerHandle.h
@@ -99,65 +99,43 @@ public:
     const RestyleManager* AsBase() const {
       return reinterpret_cast<const RestyleManager*>(mValue & ~SERVO_BIT);
     }
 
     RestyleManager* AsBase() {
       return reinterpret_cast<RestyleManager*>(mValue & ~SERVO_BIT);
     }
 
-    // These inline methods are defined in RestyleManagerHandleInlines.h.
-    inline MozExternalRefCountType AddRef();
-    inline MozExternalRefCountType Release();
-
     // Restyle manager interface.  These inline methods are defined in
     // RestyleManagerHandleInlines.h and just forward to the underlying
     // GeckoRestyleManager or ServoRestyleManager.  See corresponding comments
     // in GeckoRestyleManager.h for descriptions of these methods.
 
-    inline void Disconnect();
     inline void PostRestyleEvent(dom::Element* aElement,
                                  nsRestyleHint aRestyleHint,
                                  nsChangeHint aMinChangeHint);
     inline void PostRestyleEventForLazyConstruction();
     inline void RebuildAllStyleData(nsChangeHint aExtraHint,
                                     nsRestyleHint aRestyleHint);
     inline void PostRebuildAllStyleDataEvent(nsChangeHint aExtraHint,
                                              nsRestyleHint aRestyleHint);
     inline void ProcessPendingRestyles();
-    inline void ContentInserted(nsINode* aContainer,
-                                nsIContent* aChild);
-    inline void ContentAppended(nsIContent* aContainer,
-                                nsIContent* aFirstNewContent);
-    inline void ContentRemoved(nsINode* aContainer,
-                               nsIContent* aOldChild,
-                               nsIContent* aFollowingSibling);
-    inline void RestyleForInsertOrChange(nsINode* aContainer,
-                                         nsIContent* aChild);
-    inline void RestyleForAppend(nsIContent* aContainer,
-                                 nsIContent* aFirstNewContent);
     inline nsresult ContentStateChanged(nsIContent* aContent,
                                         EventStates aStateMask);
     inline void AttributeWillChange(dom::Element* aElement,
                                     int32_t aNameSpaceID,
                                     nsIAtom* aAttribute,
                                     int32_t aModType,
                                     const nsAttrValue* aNewValue);
     inline void AttributeChanged(dom::Element* aElement,
                                  int32_t aNameSpaceID,
                                  nsIAtom* aAttribute,
                                  int32_t aModType,
                                  const nsAttrValue* aOldValue);
     inline nsresult ReparentStyleContext(nsIFrame* aFrame);
-    inline uint64_t GetRestyleGeneration() const;
-    inline uint32_t GetHoverGeneration() const;
-    inline void SetObservingRefreshDriver(bool aObserving);
-    inline nsresult ProcessRestyledFrames(nsStyleChangeList& aChangeList);
-    inline void FlushOverflowChangedTracker();
-    inline void NotifyDestroyingFrame(nsIFrame* aFrame);
 
   private:
     // Stores a pointer to a GeckoRestyleManager or a ServoRestyleManager.
     // The least significant bit is 0 for the former, 1 for the latter.  This is
     // valid as the least significant bit will never be used for a pointer
     // value on platforms we care about.
     uintptr_t mValue;
   };
--- a/layout/base/RestyleManagerHandleInlines.h
+++ b/layout/base/RestyleManagerHandleInlines.h
@@ -16,34 +16,16 @@
   } else { \
     return AsServo()->method_ servoargs_; \
   }
 
 #define FORWARD(method_, args_) FORWARD_CONCRETE(method_, args_, args_)
 
 namespace mozilla {
 
-MozExternalRefCountType
-RestyleManagerHandle::Ptr::AddRef()
-{
-  FORWARD(AddRef, ());
-}
-
-MozExternalRefCountType
-RestyleManagerHandle::Ptr::Release()
-{
-  FORWARD(Release, ());
-}
-
-void
-RestyleManagerHandle::Ptr::Disconnect()
-{
-  FORWARD(Disconnect, ());
-}
-
 void
 RestyleManagerHandle::Ptr::PostRestyleEvent(dom::Element* aElement,
                                             nsRestyleHint aRestyleHint,
                                             nsChangeHint aMinChangeHint)
 {
   FORWARD(PostRestyleEvent, (aElement, aRestyleHint, aMinChangeHint));
 }
 
@@ -70,64 +52,16 @@ RestyleManagerHandle::Ptr::PostRebuildAl
 
 void
 RestyleManagerHandle::Ptr::ProcessPendingRestyles()
 {
   FORWARD(ProcessPendingRestyles, ());
 }
 
 nsresult
-RestyleManagerHandle::Ptr::ProcessRestyledFrames(nsStyleChangeList& aChangeList)
-{
-  FORWARD(ProcessRestyledFrames, (aChangeList));
-}
-
-void
-RestyleManagerHandle::Ptr::FlushOverflowChangedTracker()
-{
-  FORWARD(FlushOverflowChangedTracker, ());
-}
-
-void
-RestyleManagerHandle::Ptr::ContentInserted(nsINode* aContainer,
-                                           nsIContent* aChild)
-{
-  FORWARD(ContentInserted, (aContainer, aChild));
-}
-
-void
-RestyleManagerHandle::Ptr::ContentAppended(nsIContent* aContainer,
-                                           nsIContent* aFirstNewContent)
-{
-  FORWARD(ContentAppended, (aContainer, aFirstNewContent));
-}
-
-void
-RestyleManagerHandle::Ptr::ContentRemoved(nsINode* aContainer,
-                                          nsIContent* aOldChild,
-                                          nsIContent* aFollowingSibling)
-{
-  FORWARD(ContentRemoved, (aContainer, aOldChild, aFollowingSibling));
-}
-
-void
-RestyleManagerHandle::Ptr::RestyleForInsertOrChange(nsINode* aContainer,
-                                                    nsIContent* aChild)
-{
-  FORWARD(RestyleForInsertOrChange, (aContainer, aChild));
-}
-
-void
-RestyleManagerHandle::Ptr::RestyleForAppend(nsIContent* aContainer,
-                                            nsIContent* aFirstNewContent)
-{
-  FORWARD(RestyleForAppend, (aContainer, aFirstNewContent));
-}
-
-nsresult
 RestyleManagerHandle::Ptr::ContentStateChanged(nsIContent* aContent,
                                           EventStates aStateMask)
 {
   FORWARD(ContentStateChanged, (aContent, aStateMask));
 }
 
 void
 RestyleManagerHandle::Ptr::AttributeWillChange(dom::Element* aElement,
@@ -152,38 +86,14 @@ RestyleManagerHandle::Ptr::AttributeChan
 }
 
 nsresult
 RestyleManagerHandle::Ptr::ReparentStyleContext(nsIFrame* aFrame)
 {
   FORWARD(ReparentStyleContext, (aFrame));
 }
 
-uint64_t
-RestyleManagerHandle::Ptr::GetRestyleGeneration() const
-{
-  FORWARD(GetRestyleGeneration, ());
-}
-
-uint32_t
-RestyleManagerHandle::Ptr::GetHoverGeneration() const
-{
-  FORWARD(GetHoverGeneration, ());
-}
-
-void
-RestyleManagerHandle::Ptr::SetObservingRefreshDriver(bool aObserving)
-{
-  FORWARD(SetObservingRefreshDriver, (aObserving));
-}
-
-void
-RestyleManagerHandle::Ptr::NotifyDestroyingFrame(nsIFrame* aFrame)
-{
-  FORWARD(NotifyDestroyingFrame, (aFrame));
-}
-
 } // namespace mozilla
 
 #undef FORWARD
 #undef FORWARD_CONCRETE
 
 #endif // mozilla_RestyleManagerHandleInlines_h
--- a/layout/base/ServoRestyleManager.cpp
+++ b/layout/base/ServoRestyleManager.cpp
@@ -876,50 +876,16 @@ ServoRestyleManager::UpdateOnlyAnimation
   if (!doCSS) {
     return;
   }
 
   DoProcessPendingRestyles(TraversalRestyleBehavior::ForAnimationOnly);
 }
 
 void
-ServoRestyleManager::RestyleForInsertOrChange(nsINode* aContainer,
-                                              nsIContent* aChild)
-{
-  //
-  // XXXbholley: We need the Gecko logic here to correctly restyle for things
-  // like :empty and positional selectors (though we may not need to post
-  // restyle events as agressively as the Gecko path does).
-  //
-  // Bug 1297899 tracks this work.
-  //
-}
-
-void
-ServoRestyleManager::RestyleForAppend(nsIContent* aContainer,
-                                      nsIContent* aFirstNewContent)
-{
-  //
-  // XXXbholley: We need the Gecko logic here to correctly restyle for things
-  // like :empty and positional selectors (though we may not need to post
-  // restyle events as agressively as the Gecko path does).
-  //
-  // Bug 1297899 tracks this work.
-  //
-}
-
-void
-ServoRestyleManager::ContentRemoved(nsINode* aContainer,
-                                    nsIContent* aOldChild,
-                                    nsIContent* aFollowingSibling)
-{
-  NS_WARNING("stylo: ServoRestyleManager::ContentRemoved not implemented");
-}
-
-void
 ServoRestyleManager::ContentStateChanged(nsIContent* aContent,
                                          EventStates aChangedBits)
 {
   MOZ_ASSERT(!mInStyleRefresh);
 
   if (!aContent->IsElement()) {
     return;
   }
--- a/layout/base/ServoRestyleManager.h
+++ b/layout/base/ServoRestyleManager.h
@@ -120,27 +120,16 @@ public:
   void RebuildAllStyleData(nsChangeHint aExtraHint,
                            nsRestyleHint aRestyleHint);
   void PostRebuildAllStyleDataEvent(nsChangeHint aExtraHint,
                                     nsRestyleHint aRestyleHint);
   void ProcessPendingRestyles();
 
   void UpdateOnlyAnimationStyles();
 
-  void ContentInserted(nsINode* aContainer, nsIContent* aChild);
-  void ContentAppended(nsIContent* aContainer,
-                       nsIContent* aFirstNewContent);
-  void ContentRemoved(nsINode* aContainer,
-                      nsIContent* aOldChild,
-                      nsIContent* aFollowingSibling);
-
-  void RestyleForInsertOrChange(nsINode* aContainer,
-                                nsIContent* aChild);
-  void RestyleForAppend(nsIContent* aContainer,
-                        nsIContent* aFirstNewContent);
   void ContentStateChanged(nsIContent* aContent, EventStates aStateMask);
   void AttributeWillChange(dom::Element* aElement,
                            int32_t aNameSpaceID,
                            nsIAtom* aAttribute,
                            int32_t aModType,
                            const nsAttrValue* aNewValue);
   void ClassAttributeWillBeChangedBySMIL(dom::Element* aElement);
 
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -118,16 +118,17 @@
 #include "mozilla/RuleNodeCacheConditions.h"
 #include "mozilla/StyleAnimationValue.h"
 #include "mozilla/StyleSetHandle.h"
 #include "mozilla/StyleSetHandleInlines.h"
 #include "RegionBuilder.h"
 #include "SVGSVGElement.h"
 #include "DisplayItemClip.h"
 #include "mozilla/layers/WebRenderLayerManager.h"
+#include "prenv.h"
 
 #ifdef MOZ_XUL
 #include "nsXULPopupManager.h"
 #endif
 
 #include "GeckoProfiler.h"
 #include "nsAnimationManager.h"
 #include "nsTransitionManager.h"
@@ -7791,18 +7792,22 @@ nsLayoutUtils::Initialize()
                                "nglayout.debug.invalidation");
   Preferences::AddBoolVarCache(&sInterruptibleReflowEnabled,
                                "layout.interruptible-reflow.enabled");
   Preferences::AddBoolVarCache(&sSVGTransformBoxEnabled,
                                "svg.transform-box.enabled");
   Preferences::AddBoolVarCache(&sTextCombineUprightDigitsEnabled,
                                "layout.css.text-combine-upright-digits.enabled");
 #ifdef MOZ_STYLO
-  Preferences::AddBoolVarCache(&sStyloEnabled,
-                               "layout.css.servo.enabled");
+  if (PR_GetEnv("STYLO_FORCE_ENABLED")) {
+    sStyloEnabled = true;
+  } else {
+    Preferences::AddBoolVarCache(&sStyloEnabled,
+                                 "layout.css.servo.enabled");
+  }
 #endif
   Preferences::AddBoolVarCache(&sStyleAttrWithXMLBaseDisabled,
                                "layout.css.style-attr-with-xml-base.disabled");
   Preferences::AddUintVarCache(&sIdlePeriodDeadlineLimit,
                                "layout.idle_period.time_limit",
                                DEFAULT_IDLE_PERIOD_TIME_LIMIT);
   Preferences::AddUintVarCache(&sQuiescentFramesBeforeIdlePeriod,
                                "layout.idle_period.required_quiescent_frames",
--- a/layout/ipc/RenderFrameParent.cpp
+++ b/layout/ipc/RenderFrameParent.cpp
@@ -71,18 +71,25 @@ GetContentRectLayerOffset(nsIFrame* aCon
 inline static bool
 IsTempLayerManager(LayerManager* aManager)
 {
   return (mozilla::layers::LayersBackend::LAYERS_BASIC == aManager->GetBackendType() &&
           !static_cast<BasicLayerManager*>(aManager)->IsRetained());
 }
 
 already_AddRefed<LayerManager>
-GetFrom(nsFrameLoader* aFrameLoader)
+GetLayerManager(nsFrameLoader* aFrameLoader)
 {
+  if (nsIContent* content = aFrameLoader->GetOwnerContent()) {
+    RefPtr<LayerManager> lm = nsContentUtils::LayerManagerForContent(content);
+    if (lm) {
+      return lm.forget();
+    }
+  }
+
   nsIDocument* doc = aFrameLoader->GetOwnerDoc();
   if (!doc) {
     return nullptr;
   }
   return nsContentUtils::LayerManagerForDocument(doc);
 }
 
 RenderFrameParent::RenderFrameParent(nsFrameLoader* aFrameLoader)
@@ -103,17 +110,17 @@ bool
 RenderFrameParent::Init(nsFrameLoader* aFrameLoader)
 {
   if (mInitted || !aFrameLoader) {
     return false;
   }
 
   mFrameLoader = aFrameLoader;
 
-  RefPtr<LayerManager> lm = GetFrom(mFrameLoader);
+  RefPtr<LayerManager> lm = GetLayerManager(mFrameLoader);
 
   mAsyncPanZoomEnabled = lm && lm->AsyncPanZoomEnabled();
 
   TabParent* browser = TabParent::GetFrom(mFrameLoader);
   if (XRE_IsParentProcess()) {
     PCompositorBridgeChild* compositor = nullptr;
     if (lm) {
       compositor = lm->GetCompositorBridgeChild();
@@ -206,25 +213,18 @@ RenderFrameParent::BuildLayer(nsDisplayL
 
   return layer.forget();
 }
 
 LayerManager*
 RenderFrameParent::AttachLayerManager()
 {
   RefPtr<LayerManager> lm;
-
   if (mFrameLoader) {
-    nsIContent* content = mFrameLoader->GetOwnerContent();
-    if (content) {
-      lm = nsContentUtils::LayerManagerForContent(content);
-    }
-    if (!lm) {
-      lm = GetFrom(mFrameLoader);
-    }
+    lm = GetLayerManager(mFrameLoader);
   }
 
   // Perhaps the document containing this frame currently has no presentation?
   if (lm && lm->GetCompositorBridgeChild() && lm != mLayerManager) {
     mLayersConnected = lm->GetCompositorBridgeChild()->SendAdoptChild(mLayersId);
     FrameLayerBuilder::InvalidateAllLayers(lm);
   }
 
@@ -296,17 +296,17 @@ RenderFrameParent::BuildDisplayList(nsDi
 
   aLists.Content()->AppendToTop(
     new (aBuilder) nsDisplayRemote(aBuilder, aFrame, this));
 }
 
 void
 RenderFrameParent::GetTextureFactoryIdentifier(TextureFactoryIdentifier* aTextureFactoryIdentifier)
 {
-  RefPtr<LayerManager> lm = mFrameLoader ? GetFrom(mFrameLoader) : nullptr;
+  RefPtr<LayerManager> lm = mFrameLoader ? GetLayerManager(mFrameLoader) : nullptr;
   // Perhaps the document containing this frame currently has no presentation?
   if (lm) {
     *aTextureFactoryIdentifier = lm->GetTextureFactoryIdentifier();
   } else {
     *aTextureFactoryIdentifier = TextureFactoryIdentifier();
   }
 }
 
@@ -328,17 +328,17 @@ RenderFrameParent::TakeFocusForClickFrom
   fm->SetFocus(element, nsIFocusManager::FLAG_BYMOUSE |
                         nsIFocusManager::FLAG_BYTOUCH |
                         nsIFocusManager::FLAG_NOSCROLL);
 }
 
 void
 RenderFrameParent::EnsureLayersConnected(CompositorOptions* aCompositorOptions)
 {
-  RefPtr<LayerManager> lm = GetFrom(mFrameLoader);
+  RefPtr<LayerManager> lm = GetLayerManager(mFrameLoader);
   if (!lm) {
     return;
   }
 
   if (!lm->GetCompositorBridgeChild()) {
     return;
   }
 
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1379041-ref.html
@@ -0,0 +1,4 @@
+<!doctype html>
+<html style="font-size: 8px">
+<div style="font-size: 2rem; color: black;">Should be 16px black text.</div>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/1379041.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<html style="font-size: 8px">
+<div style="font-size: 2rem">Should be 16px black text.</div>
+<script>
+window.onload = function() {
+  let div = document.querySelector('div');
+  window.getDefaultComputedStyle(div).color;
+  div.style.color = "black";
+}
+</script>
+</html>
--- a/layout/reftests/bugs/reftest.list
+++ b/layout/reftests/bugs/reftest.list
@@ -2029,8 +2029,9 @@ fails-if(!stylo||styloVsGecko) == 136516
 == 1375315-12.html 1375315-12-ref.html
 == 1374062.html 1374062-ref.html
 == 1375513.html 1375513-ref.html
 == 1375674.html 1375674-ref.html
 == 1372041.html 1372041-ref.html
 == 1376092.html 1376092-ref.html
 needs-focus == 1377447-1.html 1377447-1-ref.html
 needs-focus != 1377447-1.html 1377447-2.html
+== 1379041.html 1379041-ref.html
new file mode 100644
--- /dev/null
+++ b/layout/style/bindgen.toml.in
@@ -0,0 +1,4 @@
+[build]
+args = [
+    @BINDGEN_CFLAGS@
+]
new file mode 100644
--- /dev/null
+++ b/layout/style/crashtests/1378814.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<script>
+getComputedStyle(document.documentElement, '::first-letter').display;
+</script>
--- a/layout/style/crashtests/crashtests.list
+++ b/layout/style/crashtests/crashtests.list
@@ -172,8 +172,9 @@ load 1342316-1.html
 load 1356601-1.html
 load 1370793-1.xhtml
 load 1374175-1.html
 load content-only-on-link-before.html
 load content-only-on-visited-before.html
 load 1375812-1.html
 load 1377053-1.html
 load 1377256-1.html
+load 1378814.html
--- a/layout/style/moz.build
+++ b/layout/style/moz.build
@@ -310,8 +310,12 @@ if CONFIG['COMPILE_ENVIRONMENT']:
         'nsCSSPropsGenerated.inc',
     ]
     css_props = GENERATED_FILES['nsCSSPropsGenerated.inc']
     css_props.script = 'GenerateCSSPropsGenerated.py:generate'
     css_props.inputs = [
         'nsCSSPropsGenerated.inc.in',
         'PythonCSSProps.h',
     ]
+
+    CONFIGURE_SUBST_FILES += [
+        'bindgen.toml',
+    ]
--- a/layout/style/nsCSSRuleProcessor.cpp
+++ b/layout/style/nsCSSRuleProcessor.cpp
@@ -319,17 +319,17 @@ RuleHash_TagTable_MoveEntry(PLDHashTable
   newEntry->mTag.swap(oldEntry->mTag);
   newEntry->mRules.SwapElements(oldEntry->mRules);
   oldEntry->~RuleHashTagTableEntry();
 }
 
 static PLDHashNumber
 RuleHash_NameSpaceTable_HashKey(const void *key)
 {
-  return NS_PTR_TO_INT32(key);
+  return HashGeneric(key);
 }
 
 static bool
 RuleHash_NameSpaceTable_MatchEntry(const PLDHashEntryHdr *hdr, const void *key)
 {
   const RuleHashTableEntry *entry =
     static_cast<const RuleHashTableEntry*>(hdr);
 
@@ -3498,17 +3498,17 @@ struct PerWeightData {
 
 struct RuleByWeightEntry : public PLDHashEntryHdr {
   PerWeightData data; // mWeight is key, mRuleSelectorPairs are value
 };
 
 static PLDHashNumber
 HashIntKey(const void *key)
 {
-  return PLDHashNumber(NS_PTR_TO_INT32(key));
+  return HashGeneric(key);
 }
 
 static bool
 MatchWeightEntry(const PLDHashEntryHdr *hdr, const void *key)
 {
   const RuleByWeightEntry *entry = (const RuleByWeightEntry *)hdr;
   return entry->data.mWeight == NS_PTR_TO_INT32(key);
 }
--- a/media/webrtc/signaling/signaling.gyp
+++ b/media/webrtc/signaling/signaling.gyp
@@ -367,16 +367,21 @@
           ],
         }],
         ['clang == 1', {
           'cflags_mozilla': [
             '-Wno-inconsistent-missing-override',
             '-Wno-macro-redefined',
          ],
         }],
+        ['libfuzzer == 1', {
+          'cflags_mozilla': [
+            '-fsanitize-coverage=trace-pc-guard',
+         ],
+        }],
       ],
     },
   ],
 }
 
 # Local Variables:
 # tab-width:2
 # indent-tabs-mode:nil
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -178,16 +178,17 @@ import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.regex.Pattern;
 
 import static org.mozilla.gecko.Tab.TabType;
 import static org.mozilla.gecko.Tabs.INVALID_TAB_ID;
+import static org.mozilla.gecko.mma.MmaDelegate.NEW_TAB;
 
 public class BrowserApp extends GeckoApp
                         implements ActionModePresenter,
                                    AnchoredPopup.OnVisibilityChangeListener,
                                    BookmarkEditFragment.Callbacks,
                                    BrowserSearch.OnEditSuggestionListener,
                                    BrowserSearch.OnSearchListener,
                                    DynamicToolbarAnimator.MetricsListener,
@@ -3750,16 +3751,19 @@ public class BrowserApp extends GeckoApp
         final int itemId = item.getItemId();
 
         // Track the menu action. We don't know much about the context, but we can use this to determine
         // the frequency of use for various actions.
         String extras = getResources().getResourceEntryName(itemId);
         if (TextUtils.equals(extras, "new_private_tab")) {
             // Mask private browsing
             extras = "new_tab";
+        } else {
+            // We only track opening normal tab
+            MmaDelegate.track(NEW_TAB);
         }
         Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.MENU, extras);
 
         mBrowserToolbar.cancelEdit();
 
         if (itemId == R.id.bookmark) {
             tab = Tabs.getInstance().getSelectedTab();
             if (tab != null) {
--- a/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
@@ -23,25 +23,28 @@ import org.mozilla.gecko.preferences.Gec
 import org.mozilla.gecko.tabqueue.TabQueueHelper;
 import org.mozilla.gecko.tabqueue.TabQueueService;
 
 import static org.mozilla.gecko.BrowserApp.ACTIVITY_REQUEST_PREFERENCES;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.DEEP_LINK_SCHEME;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_BOOKMARK_LIST;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_DEFAULT_BROWSER;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_HISTORY_LIST;
+import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES_HOME;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES_ACCESSIBILITY;
+import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES_GENERAL;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES_NOTIFICATIONS;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES_PRIAVACY;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_PREFERENCES_SEARCH;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_SAVE_AS_PDF;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_SIGN_UP;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.SUMO_DEFAULT_BROWSER;
 import static org.mozilla.gecko.deeplink.DeepLinkContract.LINK_FXA_SIGNIN;
+
 import org.mozilla.gecko.deeplink.DeepLinkContract;
 
 /**
  * Activity that receives incoming Intents and dispatches them to the appropriate activities (e.g. browser, custom tabs, web app).
  */
 public class LauncherActivity extends Activity {
     private static final String TAG = LauncherActivity.class.getSimpleName();
 
@@ -221,16 +224,18 @@ public class LauncherActivity extends Ac
                 break;
             case LINK_PREFERENCES:
                 Intent settingsIntent = new Intent(this, GeckoPreferences.class);
 
                 // We want to know when the Settings activity returns, because
                 // we might need to redisplay based on a locale change.
                 startActivityForResult(settingsIntent, ACTIVITY_REQUEST_PREFERENCES);
                 break;
+            case LINK_PREFERENCES_GENERAL:
+            case LINK_PREFERENCES_HOME:
             case LINK_PREFERENCES_PRIAVACY:
             case LINK_PREFERENCES_SEARCH:
             case LINK_PREFERENCES_NOTIFICATIONS:
             case LINK_PREFERENCES_ACCESSIBILITY:
                 settingsIntent = new Intent(this, GeckoPreferences.class);
                 GeckoPreferences.setResourceToOpen(settingsIntent, host);
                 startActivityForResult(settingsIntent, ACTIVITY_REQUEST_PREFERENCES);
                 break;
--- a/mobile/android/base/java/org/mozilla/gecko/deeplink/DeepLinkContract.java
+++ b/mobile/android/base/java/org/mozilla/gecko/deeplink/DeepLinkContract.java
@@ -14,18 +14,20 @@ public class DeepLinkContract {
 
     public static final String LINK_FXA_SIGNIN = "fxa-signin";
 
     public static final String LINK_DEFAULT_BROWSER = "default_browser";
     public static final String LINK_SAVE_AS_PDF = "save_as_pdf";
     public static final String LINK_BOOKMARK_LIST = "bookmark_list";
     public static final String LINK_HISTORY_LIST = "history_list";
     public static final String LINK_SIGN_UP = "sign_up";
+    public static final String LINK_PREFERENCES_GENERAL = "preferences_general";
     public static final String LINK_PREFERENCES = "preferences";
     public static final String LINK_PREFERENCES_PRIAVACY = "preferences_privacy";
     public static final String LINK_PREFERENCES_SEARCH = "preferences_search";
     public static final String LINK_PREFERENCES_NOTIFICATIONS = "preferences_notifications";
     public static final String LINK_PREFERENCES_ACCESSIBILITY = "preferences_accessibility";
+    public static final String LINK_PREFERENCES_HOME = "preferences_home";
 
     public static final String ACCOUNTS_TOKEN_PARAM = "signin";
     public static final String ACCOUNTS_ENTRYPOINT_PARAM = "entrypoint";
     public static final String ACCOUNTS_UTM_PREFIX = "utm_";
 }
--- a/mobile/android/base/java/org/mozilla/gecko/mma/MmaDelegate.java
+++ b/mobile/android/base/java/org/mozilla/gecko/mma/MmaDelegate.java
@@ -30,16 +30,17 @@ public class MmaDelegate {
     public static final String DOWNLOAD_MEDIA_SAVED_IMAGE = "E_Download_Media_Saved_Image";
     public static final String CLEARED_PRIVATE_DATA = "E_Cleared_Private_Data";
     public static final String SAVED_BOOKMARK = "E_Saved_Bookmark";
     public static final String OPENED_BOOKMARK = "E_Opened_Bookmark";
     public static final String INTERACT_WITH_SEARCH_URL_AREA = "E_Interact_With_Search_URL_Area";
     public static final String SCREENSHOT = "E_Screenshot";
     public static final String SAVED_LOGIN_AND_PASSWORD = "E_Saved_Login_And_Password";
     public static final String LAUNCH_BUT_NOT_DEFAULT_BROWSER = "E_Launch_But_Not_Default_Browser";
+    public static final String NEW_TAB = "E_Opened_New_Tab";
 
 
     private static final String TAG = "MmaDelegate";
     private static final String KEY_PREF_BOOLEAN_MMA_ENABLED = "mma.enabled";
     private static final String[] PREFS = { KEY_PREF_BOOLEAN_MMA_ENABLED };
 
 
     private static boolean isGeckoPrefOn = false;
--- a/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferenceFragment.java
+++ b/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferenceFragment.java
@@ -103,16 +103,24 @@ public class GeckoPreferenceFragment ext
      * This method sets the title that you see on non-multi-pane devices.
      */
     private String getTitle() {
         final int res = getResource();
         if (res == R.xml.preferences) {
             return getString(R.string.settings_title);
         }
 
+        if (res == R.xml.preferences_general) {
+            return getString(R.string.pref_category_general);
+        }
+
+        if (res == R.xml.preferences_home) {
+            return getString((R.string.pref_category_home));
+        }
+
         // We can launch this category from the Data Reporting notification.
         if (res == R.xml.preferences_privacy) {
             return getString(R.string.pref_category_privacy_short);
         }
 
         // We can launch this category from the the magnifying glass in the quick search bar.
         if (res == R.xml.preferences_search) {
             return getString(R.string.pref_category_search);
--- a/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java
+++ b/mobile/android/base/java/org/mozilla/gecko/tabs/TabsPanel.java
@@ -11,16 +11,17 @@ import org.mozilla.gecko.GeckoApplicatio
 import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.Telemetry;
 import org.mozilla.gecko.TelemetryContract;
 import org.mozilla.gecko.animation.PropertyAnimator;
 import org.mozilla.gecko.animation.ViewHelper;
 import org.mozilla.gecko.lwt.LightweightTheme;
 import org.mozilla.gecko.lwt.LightweightThemeDrawable;
+import org.mozilla.gecko.mma.MmaDelegate;
 import org.mozilla.gecko.preferences.GeckoPreferences;
 import org.mozilla.gecko.restrictions.Restrictable;
 import org.mozilla.gecko.restrictions.Restrictions;
 import org.mozilla.gecko.util.HardwareUtils;
 import org.mozilla.gecko.util.ThreadUtils;
 import org.mozilla.gecko.widget.GeckoPopupMenu;
 import org.mozilla.gecko.widget.IconTabWidget;
 
@@ -43,16 +44,18 @@ import android.widget.FrameLayout;
 import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.RelativeLayout;
 
 import org.mozilla.gecko.switchboard.SwitchBoard;
 
 import org.mozilla.gecko.widget.themed.ThemedImageButton;
 
+import static org.mozilla.gecko.mma.MmaDelegate.NEW_TAB;
+
 public class TabsPanel extends LinearLayout
                        implements GeckoPopupMenu.OnMenuItemClickListener,
                                   LightweightTheme.OnChangeListener,
                                   IconTabWidget.OnTabChangedListener,
                                   SharedPreferences.OnSharedPreferenceChangeListener {
     private static final String LOGTAG = "Gecko" + TabsPanel.class.getSimpleName();
 
     public enum Panel {
@@ -206,16 +209,18 @@ public class TabsPanel extends LinearLay
         mPopupMenu.show();
     }
 
     private void addTab() {
         Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.ACTIONBAR, "new_tab");
 
         if (mCurrentPanel == Panel.NORMAL_TABS) {
             mActivity.addTab();
+            // We only track opening normal tab
+            MmaDelegate.track(NEW_TAB);
         } else {
             mActivity.addPrivateTab();
         }
 
         mActivity.autoHideTabs();
     }
 
     @Override
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -399,17 +399,16 @@ gvjar.sources += [geckoview_source_dir +
     'gfx/IntSize.java',
     'gfx/LayerView.java',
     'gfx/NativePanZoomController.java',
     'gfx/Overscroll.java',
     'gfx/OverscrollEdgeEffect.java',
     'gfx/PanningPerfAPI.java',
     'gfx/PanZoomController.java',
     'gfx/PointUtils.java',
-    'gfx/RectUtils.java',
     'gfx/RenderTask.java',
     'gfx/StackScroller.java',
     'gfx/SurfaceAllocator.java',
     'gfx/SurfaceAllocatorService.java',
     'gfx/SurfaceTextureListener.java',
     'gfx/ViewTransform.java',
     'gfx/VsyncSource.java',
     'InputConnectionListener.java',
--- a/mobile/android/chrome/content/aboutAddons.js
+++ b/mobile/android/chrome/content/aboutAddons.js
@@ -98,17 +98,17 @@ var ContextMenus = {
 }
 
 function init() {
   window.addEventListener("popstate", onPopState);
 
   AddonManager.addInstallListener(Addons);
   AddonManager.addAddonListener(Addons);
   Addons.init();
-  showList();
+  showAddons();
   ContextMenus.init();
 }
 
 
 function uninit() {
   AddonManager.removeInstallListener(Addons);
   AddonManager.removeAddonListener(Addons);
 }
@@ -123,29 +123,38 @@ function onPopState(aEvent) {
   if (aEvent.state) {
     // Show the detail page for an addon
     Addons.showDetails(Addons._getElementForAddon(aEvent.state.id));
   } else {
     // Clear any previous detail addon
     let detailItem = document.querySelector("#addons-details > .addon-item");
     detailItem.addon = null;
 
-    showList();
+    showAddons();
   }
 }
 
-function showList() {
-  // Hide the detail page and show the list
+function showAddons() {
+  // Hide the addon options and show the addons list
   let details = document.querySelector("#addons-details");
-  details.style.display = "none";
+  details.classList.add("hidden");
   let list = document.querySelector("#addons-list");
-  list.style.display = "block";
+  list.classList.remove("hidden");
   document.documentElement.removeAttribute("details");
 }
 
+function showAddonOptions() {
+  // Hide the addon list and show the addon options
+  let list = document.querySelector("#addons-list");
+  list.classList.add("hidden");
+  let details = document.querySelector("#addons-details");
+  details.classList.remove("hidden");
+  document.documentElement.setAttribute("details", "true");
+}
+
 var Addons = {
   _restartCount: 0,
 
   _createItem: function _createItem(aAddon) {
     let outer = document.createElement("div");
     outer.setAttribute("addonID", aAddon.id);
     outer.className = "addon-item list-item";
     outer.setAttribute("role", "button");
@@ -222,21 +231,16 @@ var Addons = {
   _createItemForAddon: function _createItemForAddon(aAddon) {
     let appManaged = (aAddon.scope == AddonManager.SCOPE_APPLICATION);
     let opType = this._getOpTypeForOperations(aAddon.pendingOperations);
     let updateable = (aAddon.permissions & AddonManager.PERM_CAN_UPGRADE) > 0;
     let uninstallable = (aAddon.permissions & AddonManager.PERM_CAN_UNINSTALL) > 0;
 
     let optionsURL = aAddon.optionsURL || "";
 
-    if (aAddon.optionsType == AddonManager.OPTIONS_TYPE_INLINE_BROWSER) {
-      // Ignore OPTIONS_TYPE_INLINE_BROWSER until support is added in bug 1302504.
-      optionsURL = "";
-    }
-
     let blocked = "";
     switch(aAddon.blocklistState) {
       case Ci.nsIBlocklistService.STATE_BLOCKED:
         blocked = "blocked";
         break;
       case Ci.nsIBlocklistService.STATE_SOFTBLOCKED:
         blocked = "softBlocked";
         break;
@@ -304,32 +308,16 @@ var Addons = {
     if (aOperations & AddonManager.PENDING_ENABLE)
       return "needs-enable";
     if (aOperations & AddonManager.PENDING_DISABLE)
       return "needs-disable";
     return "";
   },
 
   showDetails: function showDetails(aListItem) {
-    // This function removes and returns the text content of aNode without
-    // removing any child elements. Removing the text nodes ensures any XBL
-    // bindings apply properly.
-    function stripTextNodes(aNode) {
-      var text = "";
-      for (var i = 0; i < aNode.childNodes.length; i++) {
-        if (aNode.childNodes[i].nodeType != document.ELEMENT_NODE) {
-          text += aNode.childNodes[i].textContent;
-          aNode.removeChild(aNode.childNodes[i--]);
-        } else {
-          text += stripTextNodes(aNode.childNodes[i]);
-        }
-      }
-      return text;
-    }
-
     let detailItem = document.querySelector("#addons-details > .addon-item");
     detailItem.setAttribute("isDisabled", aListItem.getAttribute("isDisabled"));
     detailItem.setAttribute("isUnsigned", aListItem.getAttribute("isUnsigned"));
     detailItem.setAttribute("opType", aListItem.getAttribute("opType"));
     detailItem.setAttribute("optionsURL", aListItem.getAttribute("optionsURL"));
     let addon = detailItem.addon = aListItem.addon;
 
     let favicon = document.querySelector("#addons-details > .addon-item .icon");
@@ -350,61 +338,99 @@ var Addons = {
 
     let uninstallBtn = document.getElementById("uninstall-btn");
     if (addon.scope == AddonManager.SCOPE_APPLICATION) {
       uninstallBtn.setAttribute("disabled", "true");
     } else {
       uninstallBtn.removeAttribute("disabled");
     }
 
-    let box = document.querySelector("#addons-details > .addon-item .options-box");
-    box.innerHTML = "";
+    let addonItem = document.querySelector("#addons-details > .addon-item");
+    let optionsBox = addonItem.querySelector(".options-box");
+    let optionsURL = aListItem.getAttribute("optionsURL");
+    switch (parseInt(addon.optionsType)) {
+      case AddonManager.OPTIONS_TYPE_INLINE_BROWSER:
+        this.createWebExtensionOptions(optionsBox, optionsURL, addon.optionsBrowserStyle);
+        break;
+      case AddonManager.OPTIONS_TYPE_INLINE:
+        this.createInlineOptions(optionsBox, optionsURL);
+        break;
+    }
+
+    showAddonOptions();
+  },
+
+  createWebExtensionOptions: async function(destination, optionsURL, browserStyle) {
+    destination.innerHTML = "";
 
-    // Retrieve the extensions preferences
+    let frame = document.createElement("iframe");
+    frame.setAttribute("id", "addon-options");
+    frame.setAttribute("mozbrowser", "true");
+    destination.appendChild(frame);
+    // Loading the URL this way prevents the native back
+    // button from applying to the iframe.
+    frame.contentWindow.location.replace(optionsURL);
+  },
+
+  createInlineOptions(destination, optionsURL) {
+    destination.innerHTML = "";
+
+    // This function removes and returns the text content of aNode without
+    // removing any child elements. Removing the text nodes ensures any XBL
+    // bindings apply properly.
+    function stripTextNodes(aNode) {
+      var text = "";
+      for (var i = 0; i < aNode.childNodes.length; i++) {
+        if (aNode.childNodes[i].nodeType != document.ELEMENT_NODE) {
+          text += aNode.childNodes[i].textContent;
+          aNode.removeChild(aNode.childNodes[i--]);
+        } else {
+          text += stripTextNodes(aNode.childNodes[i]);
+        }
+      }
+      return text;
+    }
+
     try {
-      let optionsURL = aListItem.getAttribute("optionsURL");
       let xhr = new XMLHttpRequest();
       xhr.open("GET", optionsURL, true);
       xhr.onload = function(e) {
         if (xhr.responseXML) {
           // Only allow <setting> for now
           let settings = xhr.responseXML.querySelectorAll(":root > setting");
           if (settings.length > 0) {
             for (let i = 0; i < settings.length; i++) {
               var setting = settings[i];
               var desc = stripTextNodes(setting).trim();
               if (!setting.hasAttribute("desc")) {
                 setting.setAttribute("desc", desc);
               }
-              box.appendChild(setting);
+              destination.appendChild(setting);
             }
             // Send an event so add-ons can prepopulate any non-preference based
             // settings
             let event = document.createEvent("Events");
             event.initEvent("AddonOptionsLoad", true, false);
             window.dispatchEvent(event);
           } else {
             // Reset the options URL to hide the options header if there are no
             // valid settings to show.
+            let detailItem = document.querySelector("#addons-details > .addon-item");
             detailItem.setAttribute("optionsURL", "");
           }
 
           // Also send a notification to match the behavior of desktop Firefox
           let id = aListItem.getAttribute("addonID");
           Services.obs.notifyObservers(document, AddonManager.OPTIONS_NOTIFICATION_DISPLAYED, id);
         }
       }
       xhr.send(null);
-    } catch (e) { }
-
-    let list = document.querySelector("#addons-list");
-    list.style.display = "none";
-    let details = document.querySelector("#addons-details");
-    details.style.display = "block";
-    document.documentElement.setAttribute("details", "true");
+    } catch (e) {
+      Cu.reportError(e);
+    }
   },
 
   setEnabled: function setEnabled(aValue, aAddon) {
     let detailItem = document.querySelector("#addons-details > .addon-item");
     let addon = aAddon || detailItem.addon;
     if (!addon)
       return;
 
--- a/mobile/android/chrome/content/aboutAddons.xhtml
+++ b/mobile/android/chrome/content/aboutAddons.xhtml
@@ -28,28 +28,27 @@
     <menuitem id="contextmenu-enable" label="&addonAction.enable;"></menuitem>
     <menuitem id="contextmenu-disable" label="&addonAction.disable;" ></menuitem>
     <menuitem id="contextmenu-uninstall" label="&addonAction.uninstall;" ></menuitem>
   </menu>
 
   <div id="addons-header" class="header">
     <div>&aboutAddons.header2;</div>
   </div>
-  <div id="addons-list" class="list">
+  <div id="addons-list" class="list hidden">
   </div>
 
-  <div id="addons-details" class="list">
+  <div id="addons-details" class="list hidden">
     <div class="addon-item list-item">
       <img class="icon"/>
       <div class="inner">
         <div class="details">
           <div class="title"></div><div class="version"></div>
         </div>
         <div class="description-full"></div>
-        <div class="options-header">&aboutAddons.options;</div>
         <div class="options-box"></div>
       </div>
       <div class="warn-unsigned">&addonUnsigned.message; <a id="unsigned-learn-more">&addonUnsigned.learnMore;</a></div>
       <div class="status status-uninstalled show-on-uninstall"></div>
       <div class="buttons">
         <button id="enable-btn" class="show-on-disable hide-on-enable hide-on-uninstall" >&addonAction.enable;</button>
         <button id="disable-btn" class="show-on-enable hide-on-disable hide-on-uninstall" >&addonAction.disable;</button>
         <button id="uninstall-btn" class="hide-on-uninstall" >&addonAction.uninstall;</button>
--- a/mobile/android/docs/mma.rst
+++ b/mobile/android/docs/mma.rst
@@ -128,33 +128,39 @@ List of current Events related data that
 * Interact with search url area
 {
   "event" : "E_Interact_With_Search_URL_Area"
 }
 * When a screenshot is taken
 {
   "event" : "E_Screenshot"
 }
+* Open a new tab
+{
+  "event" : "E_Opened_New_Tab"
+}
 
 Deep Links:
 Deep links are actions that can point Fennec to open certain pages or load features such as `show bookmark list` or
 `open a SUMO page`. When users see a prompt Leanplum message, they can click the button(s) on it. These buttons can
 trigger the following deep links
 * Link to Set Default Browser settings (firefox://default_browser)
 * Link to specific Add-on page (http://link_to_the_add_on_page)
 * Link to sync signup/sign in (firefox://sign_up)
 * Link to default search engine settings (firefox://preferences_search)
 * Link to “Save as PDF” feature (firefox://save_as_pdf)
 * Take user directly to a Sign up for a newsletter (http://link_to_newsletter_page)
 * Link to bookmark list (firefox://bookmark_list)
 * Link to history list (firefox://history_list)
-* Link to general preferences (firefox://preferences)
+* Link to main preferences (firefox://preferences)
 * Link to privacy preferences (firefox://preferences_privacy)
 * Link to notifications preferences (firefox://preferences_notifications)
 * Link to accessibility preferences (firefox://preferences_accessibility)
+* Link to general setting (firefox://preferences_general)
+* Link to home page setting (firefox://preferences_home)
 
 Messages :
 Messages are in-app prompts to the user from Leanplum. The interaction of that prompt will be kept and sent to Leanplum backend (such
 as "Accept" and "Show"). A messages is a combination of an Event and a Deep Link. The combinations are downloaded from Leanplum
 when Leanplum SDK is initialized. When the criteria is met (set in Leanplum backend, could be when an event happens a certain number of times,
 and/or targeting certain user attribute ), a prompt message will show up. And there may be buttons for users to click. Those clicks
 may trigger deep links.
 
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/FloatSize.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/FloatSize.java
@@ -1,54 +1,16 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
  * 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/. */
 
 package org.mozilla.gecko.gfx;
 
-import org.mozilla.gecko.util.FloatUtils;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
 public class FloatSize {
     public final float width, height;
 
-    public FloatSize(FloatSize size) { width = size.width; height = size.height; }
-    public FloatSize(IntSize size) { width = size.width; height = size.height; }
     public FloatSize(float aWidth, float aHeight) { width = aWidth; height = aHeight; }
 
-    public FloatSize(JSONObject json) {
-        try {
-            width = (float)json.getDouble("width");
-            height = (float)json.getDouble("height");
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
     @Override
     public String toString() { return "(" + width + "," + height + ")"; }
-
-    public boolean isPositive() {
-        return (width > 0 && height > 0);
-    }
-
-    public boolean fuzzyEquals(FloatSize size) {
-        return (FloatUtils.fuzzyEquals(size.width, width) &&
-                FloatUtils.fuzzyEquals(size.height, height));
-    }
-
-    public FloatSize scale(float factor) {
-        return new FloatSize(width * factor, height * factor);
-    }
-
-    /*
-     * Returns the size that represents a linear transition between this size and `to` at time `t`,
-     * which is on the scale [0, 1).
-     */
-    public FloatSize interpolate(FloatSize to, float t) {
-        return new FloatSize(FloatUtils.interpolate(width, to.width, t),
-                             FloatUtils.interpolate(height, to.height, t));
-    }
 }
 
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/GeckoLayerClient.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/GeckoLayerClient.java
@@ -4,17 +4,16 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.gfx;
 
 import org.mozilla.gecko.annotation.RobocopTarget;
 import org.mozilla.gecko.annotation.WrapForJNI;
 import org.mozilla.gecko.EventDispatcher;
 import org.mozilla.gecko.GeckoAppShell;
-import org.mozilla.gecko.util.FloatUtils;
 import org.mozilla.gecko.util.GeckoBundle;
 
 import android.content.Context;
 import android.graphics.Color;
 import android.graphics.Matrix;
 import android.graphics.PointF;
 import android.graphics.RectF;
 import android.os.SystemClock;
@@ -211,22 +210,19 @@ class GeckoLayerClient implements LayerV
     }
 
     /** The compositor invokes this function just before compositing a frame where the document
       * is different from the document composited on the last frame. In these cases, the viewport
       * information we have in Java is no longer valid and needs to be replaced with the new
       * viewport information provided.
       */
     @WrapForJNI(calledFrom = "ui")
-    public void updateRootFrameMetrics(float scrollX, float scrollY, float zoom,
-            float cssPageLeft, float cssPageTop, float cssPageRight, float cssPageBottom) {
-        RectF cssPageRect = new RectF(cssPageLeft, cssPageTop, cssPageRight, cssPageBottom);
+    public void updateRootFrameMetrics(float scrollX, float scrollY, float zoom) {
         mViewportMetrics = mViewportMetrics.setViewportOrigin(scrollX, scrollY)
-            .setZoomFactor(zoom)
-            .setPageRect(RectUtils.scale(cssPageRect, zoom), cssPageRect);
+            .setZoomFactor(zoom);
 
         mToolbarAnimator.onMetricsChanged(mViewportMetrics);
         mContentDocumentIsDisplayed = true;
     }
 
     class PointerInfo {
         // We reserve one pointer ID for the mouse, so that tests don't have
         // to worry about tracking pointer IDs if they just want to test mouse
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/ImmutableViewportMetrics.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/ImmutableViewportMetrics.java
@@ -1,74 +1,47 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
  * 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/. */
 
 package org.mozilla.gecko.gfx;
 
-import org.mozilla.gecko.annotation.WrapForJNI;
-import org.mozilla.gecko.util.FloatUtils;
-
 import android.graphics.PointF;
 import android.graphics.RectF;
 import android.util.DisplayMetrics;
 
 /**
  * ImmutableViewportMetrics are used to store the viewport metrics
  * in way that we can access a version of them from multiple threads
  * without having to take a lock
  */
 public class ImmutableViewportMetrics {
 
     // We need to flatten the RectF and FloatSize structures
     // because Java doesn't have the concept of const classes
-    public final float pageRectLeft;
-    public final float pageRectTop;
-    public final float pageRectRight;
-    public final float pageRectBottom;
-    public final float cssPageRectLeft;
-    public final float cssPageRectTop;
-    public final float cssPageRectRight;
-    public final float cssPageRectBottom;
     public final float viewportRectLeft;
     public final float viewportRectTop;
     public final int viewportRectWidth;
     public final int viewportRectHeight;
 
     public final float zoomFactor;
 
     public ImmutableViewportMetrics(DisplayMetrics metrics) {
-        viewportRectLeft   = pageRectLeft   = cssPageRectLeft   = 0;
-        viewportRectTop    = pageRectTop    = cssPageRectTop    = 0;
+        viewportRectLeft   = 0;
+        viewportRectTop    = 0;
         viewportRectWidth = metrics.widthPixels;
         viewportRectHeight = metrics.heightPixels;
-        pageRectRight  = cssPageRectRight  = metrics.widthPixels;
-        pageRectBottom = cssPageRectBottom = metrics.heightPixels;
         zoomFactor = 1.0f;
     }
 
-    /** This constructor is used by native code in AndroidJavaWrappers.cpp, be
-     * careful when modifying the signature.
-     */
-    @WrapForJNI(calledFrom = "gecko")
-    private ImmutableViewportMetrics(float aPageRectLeft, float aPageRectTop,
-        float aPageRectRight, float aPageRectBottom, float aCssPageRectLeft,
-        float aCssPageRectTop, float aCssPageRectRight, float aCssPageRectBottom,
+    private ImmutableViewportMetrics(
         float aViewportRectLeft, float aViewportRectTop, int aViewportRectWidth,
         int aViewportRectHeight, float aZoomFactor)
     {
-        pageRectLeft = aPageRectLeft;
-        pageRectTop = aPageRectTop;
-        pageRectRight = aPageRectRight;
-        pageRectBottom = aPageRectBottom;
-        cssPageRectLeft = aCssPageRectLeft;
-        cssPageRectTop = aCssPageRectTop;
-        cssPageRectRight = aCssPageRectRight;
-        cssPageRectBottom = aCssPageRectBottom;
         viewportRectLeft = aViewportRectLeft;
         viewportRectTop = aViewportRectTop;
         viewportRectWidth = aViewportRectWidth;
         viewportRectHeight = aViewportRectHeight;
         zoomFactor = aZoomFactor;
     }
 
     public float getWidth() {
@@ -97,186 +70,36 @@ public class ImmutableViewportMetrics {
 
     public RectF getViewport() {
         return new RectF(viewportRectLeft,
                          viewportRectTop,
                          viewportRectRight(),
                          viewportRectBottom());
     }
 
-    public RectF getCssViewport() {
-        return RectUtils.scale(getViewport(), 1 / zoomFactor);
-    }
-
-    public RectF getPageRect() {
-        return new RectF(pageRectLeft, pageRectTop, pageRectRight, pageRectBottom);
-    }
-
-    public float getPageWidth() {
-        return pageRectRight - pageRectLeft;
-    }
-
-    public float getPageHeight() {
-        return pageRectBottom - pageRectTop;
-    }
-
-    public RectF getCssPageRect() {
-        return new RectF(cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom);
-    }
-
-    public RectF getOverscroll() {
-        return new RectF(Math.max(0, pageRectLeft - viewportRectLeft),
-                         Math.max(0, pageRectTop - viewportRectTop),
-                         Math.max(0, viewportRectRight() - pageRectRight),
-                         Math.max(0, viewportRectBottom() - pageRectBottom));
-    }
-
-    /*
-     * Returns the viewport metrics that represent a linear transition between "this" and "to" at
-     * time "t", which is on the scale [0, 1). This function interpolates all values stored in
-     * the viewport metrics.
-     */
-    public ImmutableViewportMetrics interpolate(ImmutableViewportMetrics to, float t) {
-        return new ImmutableViewportMetrics(
-            FloatUtils.interpolate(pageRectLeft, to.pageRectLeft, t),
-            FloatUtils.interpolate(pageRectTop, to.pageRectTop, t),
-            FloatUtils.interpolate(pageRectRight, to.pageRectRight, t),
-            FloatUtils.interpolate(pageRectBottom, to.pageRectBottom, t),
-            FloatUtils.interpolate(cssPageRectLeft, to.cssPageRectLeft, t),
-            FloatUtils.interpolate(cssPageRectTop, to.cssPageRectTop, t),
-            FloatUtils.interpolate(cssPageRectRight, to.cssPageRectRight, t),
-            FloatUtils.interpolate(cssPageRectBottom, to.cssPageRectBottom, t),
-            FloatUtils.interpolate(viewportRectLeft, to.viewportRectLeft, t),
-            FloatUtils.interpolate(viewportRectTop, to.viewportRectTop, t),
-            (int)FloatUtils.interpolate(viewportRectWidth, to.viewportRectWidth, t),
-            (int)FloatUtils.interpolate(viewportRectHeight, to.viewportRectHeight, t),
-            FloatUtils.interpolate(zoomFactor, to.zoomFactor, t));
-    }
-
     public ImmutableViewportMetrics setViewportSize(int width, int height) {
         if (width == viewportRectWidth && height == viewportRectHeight) {
             return this;
         }
 
         return new ImmutableViewportMetrics(
-            pageRectLeft, pageRectTop, pageRectRight, pageRectBottom,
-            cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom,
             viewportRectLeft, viewportRectTop, width, height,
             zoomFactor);
     }
 
     public ImmutableViewportMetrics setViewportOrigin(float newOriginX, float newOriginY) {
         return new ImmutableViewportMetrics(
-            pageRectLeft, pageRectTop, pageRectRight, pageRectBottom,
-            cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom,
             newOriginX, newOriginY, viewportRectWidth, viewportRectHeight,
             zoomFactor);
     }
 
     public ImmutableViewportMetrics setZoomFactor(float newZoomFactor) {
         return new ImmutableViewportMetrics(
-            pageRectLeft, pageRectTop, pageRectRight, pageRectBottom,
-            cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom,
             viewportRectLeft, viewportRectTop, viewportRectWidth, viewportRectHeight,
             newZoomFactor);
     }
 
-    public ImmutableViewportMetrics offsetViewportBy(float dx, float dy) {
-        return setViewportOrigin(viewportRectLeft + dx, viewportRectTop + dy);
-    }
-
-    public ImmutableViewportMetrics offsetViewportByAndClamp(float dx, float dy) {
-        return setViewportOrigin(
-            Math.max(pageRectLeft, Math.min(viewportRectLeft + dx, pageRectRight - getWidth())),
-            Math.max(pageRectTop, Math.min(viewportRectTop + dy, pageRectBottom - getHeight())));
-    }
-
-    public ImmutableViewportMetrics setPageRect(RectF pageRect, RectF cssPageRect) {
-        return new ImmutableViewportMetrics(
-            pageRect.left, pageRect.top, pageRect.right, pageRect.bottom,
-            cssPageRect.left, cssPageRect.top, cssPageRect.right, cssPageRect.bottom,
-            viewportRectLeft, viewportRectTop, viewportRectWidth, viewportRectHeight,
-            zoomFactor);
-    }
-
-    public ImmutableViewportMetrics setPageRectFrom(ImmutableViewportMetrics aMetrics) {
-        if (aMetrics.cssPageRectLeft == cssPageRectLeft &&
-            aMetrics.cssPageRectTop == cssPageRectTop &&
-            aMetrics.cssPageRectRight == cssPageRectRight &&
-            aMetrics.cssPageRectBottom == cssPageRectBottom) {
-            return this;
-        }
-        RectF css = aMetrics.getCssPageRect();
-        return setPageRect(RectUtils.scale(css, zoomFactor), css);
-    }
-
-    /* This will set the zoom factor and re-scale page-size and viewport offset
-     * accordingly. The given focus will remain at the same point on the screen
-     * after scaling.
-     */
-    public ImmutableViewportMetrics scaleTo(float newZoomFactor, PointF focus) {
-        // cssPageRect* is invariant, since we're setting the scale factor
-        // here. The page rect is based on the CSS page rect.
-        float newPageRectLeft = cssPageRectLeft * newZoomFactor;
-        float newPageRectTop = cssPageRectTop * newZoomFactor;
-        float newPageRectRight = cssPageRectLeft + ((cssPageRectRight - cssPageRectLeft) * newZoomFactor);
-        float newPageRectBottom = cssPageRectTop + ((cssPageRectBottom - cssPageRectTop) * newZoomFactor);
-
-        PointF origin = getOrigin();
-        origin.offset(focus.x, focus.y);
-        origin = PointUtils.scale(origin, newZoomFactor / zoomFactor);
-        origin.offset(-focus.x, -focus.y);
-
-        return new ImmutableViewportMetrics(
-            newPageRectLeft, newPageRectTop, newPageRectRight, newPageRectBottom,
-            cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom,
-            origin.x, origin.y, viewportRectWidth, viewportRectHeight,
-            newZoomFactor);
-    }
-
-    /** Clamps the viewport to remain within the page rect. */
-    public ImmutableViewportMetrics clamp() {
-        RectF newViewport = getViewport();
-
-        // The viewport bounds ought to never exceed the page bounds.
-        if (newViewport.right > pageRectRight)
-            newViewport.offset((pageRectRight) - newViewport.right, 0);
-        if (newViewport.left < pageRectLeft)
-            newViewport.offset(pageRectLeft - newViewport.left, 0);
-
-        if (newViewport.bottom > pageRectBottom)
-            newViewport.offset(0, (pageRectBottom) - newViewport.bottom);
-        if (newViewport.top < pageRectTop)
-            newViewport.offset(0, pageRectTop - newViewport.top);
-
-        // Note that since newViewport is only translated around, the viewport's
-        // width and height are unchanged.
-        return new ImmutableViewportMetrics(
-            pageRectLeft, pageRectTop, pageRectRight, pageRectBottom,
-            cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom,
-            newViewport.left, newViewport.top, viewportRectWidth, viewportRectHeight,
-            zoomFactor);
-    }
-
-    public boolean fuzzyEquals(ImmutableViewportMetrics other) {
-        // Don't bother checking the pageRectXXX values because they are a product
-        // of the cssPageRectXXX values and the zoomFactor, except with more rounding
-        // error. Checking those is both inefficient and can lead to false negatives.
-        return FloatUtils.fuzzyEquals(cssPageRectLeft, other.cssPageRectLeft)
-            && FloatUtils.fuzzyEquals(cssPageRectTop, other.cssPageRectTop)
-            && FloatUtils.fuzzyEquals(cssPageRectRight, other.cssPageRectRight)
-            && FloatUtils.fuzzyEquals(cssPageRectBottom, other.cssPageRectBottom)
-            && FloatUtils.fuzzyEquals(viewportRectLeft, other.viewportRectLeft)
-            && FloatUtils.fuzzyEquals(viewportRectTop, other.viewportRectTop)
-            && viewportRectWidth == other.viewportRectWidth
-            && viewportRectHeight == other.viewportRectHeight
-            && FloatUtils.fuzzyEquals(zoomFactor, other.zoomFactor);
-    }
-
     @Override
     public String toString() {
         return "ImmutableViewportMetrics v=(" + viewportRectLeft + "," + viewportRectTop + ","
-                + viewportRectWidth + "x" + viewportRectHeight + ") p=(" + pageRectLeft + ","
-                + pageRectTop + "," + pageRectRight + "," + pageRectBottom + ") c=("
-                + cssPageRectLeft + "," + cssPageRectTop + "," + cssPageRectRight + ","
-                + cssPageRectBottom + ") z=" + zoomFactor;
+                + viewportRectWidth + "x" + viewportRectHeight + ") z=" + zoomFactor;
     }
 }
deleted file mode 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/RectUtils.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
- * 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/. */
-
-package org.mozilla.gecko.gfx;
-
-import org.mozilla.gecko.util.FloatUtils;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import android.graphics.Point;
-import android.graphics.PointF;
-import android.graphics.Rect;
-import android.graphics.RectF;
-
-public final class RectUtils {
-    private RectUtils() {}
-
-    public static Rect create(JSONObject json) {
-        try {
-            int x = json.getInt("x");
-            int y = json.getInt("y");
-            int width = json.getInt("width");
-            int height = json.getInt("height");
-            return new Rect(x, y, x + width, y + height);
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static String toJSON(RectF rect) {
-        StringBuilder sb = new StringBuilder(256);
-        sb.append("{ \"left\": ").append(rect.left)
-          .append(", \"top\": ").append(rect.top)
-          .append(", \"right\": ").append(rect.right)
-          .append(", \"bottom\": ").append(rect.bottom)
-          .append('}');
-        return sb.toString();
-    }
-
-    public static RectF expand(RectF rect, float moreWidth, float moreHeight) {
-        float halfMoreWidth = moreWidth / 2;
-        float halfMoreHeight = moreHeight / 2;
-        return new RectF(rect.left - halfMoreWidth,
-                         rect.top - halfMoreHeight,
-                         rect.right + halfMoreWidth,
-                         rect.bottom + halfMoreHeight);
-    }
-
-    public static RectF contract(RectF rect, float lessWidth, float lessHeight) {
-        float halfLessWidth = lessWidth / 2.0f;
-        float halfLessHeight = lessHeight / 2.0f;
-        return new RectF(rect.left + halfLessWidth,
-                         rect.top + halfLessHeight,
-                         rect.right - halfLessWidth,
-                         rect.bottom - halfLessHeight);
-    }
-
-    public static RectF intersect(RectF one, RectF two) {
-        float left = Math.max(one.left, two.left);
-        float top = Math.max(one.top, two.top);
-        float right = Math.min(one.right, two.right);
-        float bottom = Math.min(one.bottom, two.bottom);
-        return new RectF(left, top, Math.max(right, left), Math.max(bottom, top));
-    }
-
-    public static RectF scale(RectF rect, float scale) {
-        float x = rect.left * scale;
-        float y = rect.top * scale;
-        return new RectF(x, y,
-                         x + (rect.width() * scale),
-                         y + (rect.height() * scale));
-    }
-
-    public static RectF scaleAndRound(RectF rect, float scale) {
-        float left = rect.left * scale;
-        float top = rect.top * scale;
-        return new RectF(Math.round(left),
-                         Math.round(top),
-                         Math.round(left + (rect.width() * scale)),
-                         Math.round(top + (rect.height() * scale)));
-    }
-
-    /** Returns the nearest integer rect of the given rect. */
-    public static Rect round(RectF rect) {
-        Rect r = new Rect();
-        round(rect, r);
-        return r;
-    }
-
-    public static void round(RectF rect, Rect dest) {
-        dest.set(Math.round(rect.left), Math.round(rect.top),
-                 Math.round(rect.right), Math.round(rect.bottom));
-    }
-
-    public static Rect roundIn(RectF rect) {
-        return new Rect((int)Math.ceil(rect.left), (int)Math.ceil(rect.top),
-                        (int)Math.floor(rect.right), (int)Math.floor(rect.bottom));
-    }
-
-    public static IntSize getSize(Rect rect) {
-        return new IntSize(rect.width(), rect.height());
-    }
-
-    public static Point getOrigin(Rect rect) {
-        return new Point(rect.left, rect.top);
-    }
-
-    public static PointF getOrigin(RectF rect) {
-        return new PointF(rect.left, rect.top);
-    }
-
-    public static boolean fuzzyEquals(RectF a, RectF b) {
-        if (a == null && b == null)
-            return true;
-        else if ((a == null && b != null) || (a != null && b == null))
-            return false;
-        else
-            return FloatUtils.fuzzyEquals(a.top, b.top)
-                && FloatUtils.fuzzyEquals(a.left, b.left)
-                && FloatUtils.fuzzyEquals(a.right, b.right)
-                && FloatUtils.fuzzyEquals(a.bottom, b.bottom);
-    }
-}
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/FloatUtils.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/FloatUtils.java
@@ -1,43 +1,16 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
  * 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/. */
 
 package org.mozilla.gecko.util;
 
-import android.graphics.PointF;
-
 import java.lang.IllegalArgumentException;
 
 public final class FloatUtils {
     private FloatUtils() {}
 
     public static boolean fuzzyEquals(float a, float b) {
         return (Math.abs(a - b) < 1e-6);
     }
-
-    public static boolean fuzzyEquals(PointF a, PointF b) {
-        return fuzzyEquals(a.x, b.x) && fuzzyEquals(a.y, b.y);
-    }
-
-    /*
-     * Returns the value that represents a linear transition between `from` and `to` at time `t`,
-     * which is on the scale [0, 1). Thus with t = 0.0f, this returns `from`; with t = 1.0f, this
-     * returns `to`; with t = 0.5f, this returns the value halfway from `from` to `to`.
-     */
-    public static float interpolate(float from, float to, float t) {
-        return from + (to - from) * t;
-    }
-
-    /**
-     * Returns 'value', clamped so that it isn't any lower than 'low', and it
-     * isn't any higher than 'high'.
-     */
-    public static float clamp(float value, float low, float high) {
-        if (high < low) {
-          throw new IllegalArgumentException(
-              "clamp called with invalid parameters (" + high + " < " + low + ")" );
-        }
-        return Math.max(low, Math.min(high, value));
-    }
 }
--- a/mobile/android/installer/package-manifest.in
+++ b/mobile/android/installer/package-manifest.in
@@ -390,18 +390,16 @@
 
 @BINPATH@/components/nsAsyncShutdown.manifest
 @BINPATH@/components/nsAsyncShutdown.js
 
 @BINPATH@/components/Downloads.manifest
 @BINPATH@/components/DownloadLegacy.js
 
 #ifndef MOZ_GECKOVIEW_JAR
-@BINPATH@/components/PresentationDeviceInfoManager.manifest
-@BINPATH@/components/PresentationDeviceInfoManager.js
 @BINPATH@/components/BuiltinProviders.manifest
 @BINPATH@/components/PresentationControlService.js
 @BINPATH@/components/PresentationNetworkHelper.js
 @BINPATH@/components/PresentationNetworkHelper.manifest
 @BINPATH@/components/PresentationDataChannelSessionTransport.js
 @BINPATH@/components/PresentationDataChannelSessionTransport.manifest
 @BINPATH@/components/AndroidCastDeviceProvider.manifest
 @BINPATH@/components/AndroidCastDeviceProvider.js
--- a/mobile/android/locales/en-US/chrome/aboutAddons.dtd
+++ b/mobile/android/locales/en-US/chrome/aboutAddons.dtd
@@ -1,15 +1,14 @@
 <!-- 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/. -->
 
 <!ENTITY aboutAddons.title2                     "Add-ons">
 <!ENTITY aboutAddons.header2                    "Your Add-ons">
-<!ENTITY aboutAddons.options                    "Options">
 
 <!ENTITY addonAction.enable                     "Enable">
 <!ENTITY addonAction.disable                    "Disable">
 <!ENTITY addonAction.uninstall                  "Uninstall">
 <!ENTITY addonAction.undo                       "Undo">
 
 <!ENTITY addonUnsigned.message                  "This add-on could not be verified by &brandShortName;.">
 <!ENTITY addonUnsigned.learnMore                "Learn more">
--- a/mobile/android/tests/background/junit4/src/org/mozilla/gecko/util/TestFloatUtils.java
+++ b/mobile/android/tests/background/junit4/src/org/mozilla/gecko/util/TestFloatUtils.java
@@ -46,31 +46,9 @@ public class TestFloatUtils {
     public void testEqualSuccessIfPromoted() {
         assertTrue(FloatUtils.fuzzyEquals(5, 5));
     }
 
     @Test
     public void testEqualSuccessIfUnPromoted() {
         assertTrue(FloatUtils.fuzzyEquals(5.6f, 5.6f));
     }
-
-    @Test
-    public void testClampSuccess() {
-        assertEquals(3, FloatUtils.clamp(3, 1, 5), 0);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testClampFail() {
-        FloatUtils.clamp(3, 5, 1);
-    }
-
-    @Test
-    public void testInterpolateSuccess() {
-        assertEquals(4f ,FloatUtils.interpolate(1, 2, 3), 0f);
-    }
-
-    @Test
-    public void testInterpolateFail() {
-        assertNotEquals(3f ,FloatUtils.interpolate(1, 2, 3), 0f);
-    }
-
-
 }
--- a/mobile/android/tests/browser/chrome/test_session_scroll_position.html
+++ b/mobile/android/tests/browser/chrome/test_session_scroll_position.html
@@ -206,17 +206,17 @@ https://bugzilla.mozilla.org/show_bug.cg
     pageshow = promiseBrowserEvent(browser, "pageshow");
     scroll = promiseBrowserEvent(browser, "scroll");
     browser.goBack();
     yield pageshow;
     yield scroll;
 
     utils.getResolution(zoom);
     utils.getScrollXY(false, scrollX, scrollY);
-    todo(fuzzyEquals(zoom.value, ZOOM), "zoom restored correctly"); // Bug 1312605
+    ok(fuzzyEquals(zoom.value, ZOOM), "zoom restored correctly");
     is(scrollX.value, SCROLL_X, "scrollX restored correctly");
     is(scrollY.value, SCROLL_Y, "scrollY restored correctly");
 
     // Remove the tab.
     BrowserApp.closeTab(BrowserApp.getTabForBrowser(browser));
   });
 
   add_task(function* test_sessionStoreZoomLevelRecalc() {
--- a/mobile/android/themes/core/aboutAddons.css
+++ b/mobile/android/themes/core/aboutAddons.css
@@ -3,16 +3,22 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 @import "defines.css";
 
 html[details] {
   background-color: var(--color_about_item);
 }
 
+iframe {
+  padding: 0;
+  margin: 0;
+  border:none;
+}
+
 a {
   text-decoration: none;
   color: #0096DD;
 }
 
 a:active {
   color: #0082C6;
 }
@@ -20,16 +26,20 @@ a:active {
 .details {
   width: 100%;
 }
 
 .details > div {
   display: inline;
 }
 
+.hidden {
+  display: none;
+}
+
 .version {
   /* title is not localized, so keep the margin on the left side */
   margin-left: .67em;
 }
 
 .description {
   width: 100%;
   overflow: hidden;
@@ -54,22 +64,16 @@ a:active {
 
 .status {
   border-top: 1px solid var(--color_about_item_border);
   font-weight: bold;
   padding: 0.5em;
   width: 100%;
 }
 
-.options-header {
-  font-weight: bold;
-  text-transform: uppercase;
-  margin-top: 1em;
-}
-
 .addon-item[isDisabled="true"] .options-header,
 .addon-item[optionsURL=""] .options-header,
 .addon-item[isDisabled="true"] .options-box,
 .addon-item[optionsURL=""] .options-box {
   display: none;
 }
 
 #addons-details > .list-item {
@@ -322,17 +326,13 @@ div[opType="needs-restart"] .hide-on-res
 div[opType="needs-uninstall"] .hide-on-uninstall,
 div[isDisabled="true"][opType="needs-uninstall"],
 div[opType="needs-install"] .hide-on-install,
 div[opType="needs-enable"] .hide-on-enable,
 div[opType="needs-disable"] .hide-on-disable {
   display: none;
 }
 
-#addons-list, #addons-details {
-  display: none;
-}
-
 #browse-title:dir(rtl) {
   background-position: left;
   background-image: url("chrome://browser/skin/images/chevron-rtl.png");
 }
 
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -690,23 +690,25 @@ pref("apz.fling_curve_function_x1", "0.0
 pref("apz.fling_curve_function_y1", "0.0");
 pref("apz.fling_curve_function_x2", "1.0");
 pref("apz.fling_curve_function_y2", "1.0");
 pref("apz.fling_curve_threshold_inches_per_ms", "-1.0");
 pref("apz.fling_friction", "0.002");
 pref("apz.fling_min_velocity_threshold", "0.5");
 pref("apz.fling_stop_on_tap_threshold", "0.05");
 pref("apz.fling_stopped_threshold", "0.01");
+pref("apz.frame_delay.enabled", false);
 pref("apz.highlight_checkerboarded_areas", false);
 pref("apz.keyboard.enabled", false);
 pref("apz.max_velocity_inches_per_ms", "-1.0");
 pref("apz.max_velocity_queue_size", 5);
 pref("apz.min_skate_speed", "1.0");
 pref("apz.minimap.enabled", false);
 pref("apz.minimap.visibility.enabled", false);
+pref("apz.one_touch_pinch.enabled", true);
 pref("apz.overscroll.enabled", false);
 pref("apz.overscroll.min_pan_distance_ratio", "1.0");
 pref("apz.overscroll.spring_friction", "0.015");
 pref("apz.overscroll.spring_stiffness", "0.0018");
 pref("apz.overscroll.stop_distance_threshold", "5.0");
 pref("apz.overscroll.stop_velocity_threshold", "0.01");
 pref("apz.overscroll.stretch_factor", "0.35");
 pref("apz.paint_skipping.enabled", true);
--- a/netwerk/cache2/CacheFileInputStream.h
+++ b/netwerk/cache2/CacheFileInputStream.h
@@ -35,17 +35,17 @@ public:
                               CacheFileChunk *aChunk) override;
   NS_IMETHOD OnChunkUpdated(CacheFileChunk *aChunk) override;
 
   // Memory reporting
   size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const;
 
   uint32_t GetPosition() const { return mPos; };
   bool IsAlternativeData() const { return mAlternativeData; };
-  int64_t GetChunkIdx() const { return mChunk ? mChunk->Index() : -1; };
+  int64_t GetChunkIdx() const { return mChunk ? static_cast<int64_t>(mChunk->Index()) : -1; };
 
 private:
   virtual ~CacheFileInputStream();
 
   nsresult CloseWithStatusLocked(nsresult aStatus);
   void CleanUp();
   void ReleaseChunk();
   void EnsureCorrectChunk(bool aReleaseOnly);
--- a/netwerk/protocol/http/nsHttpChannel.cpp
+++ b/netwerk/protocol/http/nsHttpChannel.cpp
@@ -7439,17 +7439,17 @@ nsHttpChannel::OnStopRequest(nsIRequest 
             nsresult rv = FinalizeCacheEntry();
             if (NS_FAILED(rv)) {
                 LOG(("FinalizeCacheEntry failed (%08x)",
                      static_cast<uint32_t>(rv)));
             }
         }
     }
 
-    ReportRcwnStats(request, isFromNet);
+    ReportRcwnStats(isFromNet);
 
     // Register entry to the Performance resource timing
     mozilla::dom::Performance* documentPerformance = GetPerformance();
     if (documentPerformance) {
         documentPerformance->AddEntry(this, this);
     }
 
     if (mListener) {
@@ -8969,59 +8969,51 @@ nsHttpChannel::SetDoNotTrack()
       mRequestHead.SetHeader(nsHttp::DoNotTrack,
                              NS_LITERAL_CSTRING("1"),
                              false);
     MOZ_ASSERT(NS_SUCCEEDED(rv));
   }
 }
 
 void
-nsHttpChannel::ReportRcwnStats(nsIRequest* firstResponseRequest, bool isFromNet)
+nsHttpChannel::ReportRcwnStats(bool isFromNet)
 {
     if (!sRCWNEnabled) {
         return;
     }
-    enum RaceCacheAndNetStatus
-    {
-        kDidNotRaceUsedNetwork = 0,
-        kDidNotRaceUsedCache = 1,
-        kRaceUsedNetwork = 2,
-        kRaceUsedCache = 3,
-        kDelayedRaceUsedNetwork = 4,
-        kDelayedRaceUsedCache = 5
-    };
-    static const Telemetry::HistogramID kRcwnTelemetry[6] = {
-        Telemetry::NETWORK_RACE_CACHE_BANDWIDTH_NOT_RACE,
-        Telemetry::NETWORK_RACE_CACHE_BANDWIDTH_NOT_RACE,
-        Telemetry::NETWORK_RACE_CACHE_BANDWIDTH_RACE_NETWORK_WIN,
-        Telemetry::NETWORK_RACE_CACHE_BANDWIDTH_RACE_CACHE_WIN,
-        Telemetry::NETWORK_RACE_CACHE_BANDWIDTH_RACE_NETWORK_WIN,
-        Telemetry::NETWORK_RACE_CACHE_BANDWIDTH_RACE_CACHE_WIN
-    };
-
-    RaceCacheAndNetStatus rcwnStatus = kDidNotRaceUsedNetwork;
+
     if (isFromNet) {
-        rcwnStatus = mRaceCacheWithNetwork ?
-            (mRaceDelay ? kDelayedRaceUsedNetwork : kRaceUsedNetwork) :
-            kDidNotRaceUsedNetwork;
-    } else if (firstResponseRequest == mCachePump) {
-        rcwnStatus = mRaceCacheWithNetwork ?
-            (mRaceDelay ? kDelayedRaceUsedCache : kRaceUsedCache) :
-            kDidNotRaceUsedCache;
-    }
-    Telemetry::Accumulate(Telemetry::NETWORK_RACE_CACHE_WITH_NETWORK_USAGE,
-                          rcwnStatus);
-    Telemetry::Accumulate(kRcwnTelemetry[rcwnStatus], mTransferSize);
+        if (mRaceCacheWithNetwork) {
+            gIOService->IncrementNetWonRequestNumber();
+            Telemetry::Accumulate(Telemetry::NETWORK_RACE_CACHE_BANDWIDTH_RACE_NETWORK_WIN, mTransferSize);
+            if (mRaceDelay) {
+                AccumulateCategorical(Telemetry::LABELS_NETWORK_RACE_CACHE_WITH_NETWORK_USAGE_2::NetworkDelayedRace);
+            } else {
+                AccumulateCategorical(Telemetry::LABELS_NETWORK_RACE_CACHE_WITH_NETWORK_USAGE_2::NetworkRace);
+            }
+        } else {
+            Telemetry::Accumulate(Telemetry::NETWORK_RACE_CACHE_BANDWIDTH_NOT_RACE, mTransferSize);
+            AccumulateCategorical(Telemetry::LABELS_NETWORK_RACE_CACHE_WITH_NETWORK_USAGE_2::NetworkNoRace);
+        }
+    } else {
+        if (mRaceCacheWithNetwork) {
+            gIOService->IncrementCacheWonRequestNumber();
+            Telemetry::Accumulate(Telemetry::NETWORK_RACE_CACHE_BANDWIDTH_RACE_CACHE_WIN, mTransferSize);
+            if (mRaceDelay) {
+                AccumulateCategorical(Telemetry::LABELS_NETWORK_RACE_CACHE_WITH_NETWORK_USAGE_2::CacheDelayedRace);
+            } else {
+                AccumulateCategorical(Telemetry::LABELS_NETWORK_RACE_CACHE_WITH_NETWORK_USAGE_2::CacheRace);
+            }
+        } else {
+            Telemetry::Accumulate(Telemetry::NETWORK_RACE_CACHE_BANDWIDTH_NOT_RACE, mTransferSize);
+            AccumulateCategorical(Telemetry::LABELS_NETWORK_RACE_CACHE_WITH_NETWORK_USAGE_2::CacheNoRace);
+        }
+    }
 
     gIOService->IncrementRequestNumber();
-    if (rcwnStatus == kRaceUsedCache || rcwnStatus == kDelayedRaceUsedCache) {
-        gIOService->IncrementCacheWonRequestNumber();
-    } else if (rcwnStatus == kRaceUsedNetwork || rcwnStatus == kDelayedRaceUsedNetwork) {
-        gIOService->IncrementNetWonRequestNumber();
-    }
 }
 
 static const size_t kPositiveBucketNumbers = 34;
 static const int64_t kPositiveBucketLevels[kPositiveBucketNumbers] =
 {
 	0, 10, 20, 30, 40, 50, 60, 70, 80, 90,
 	100, 200, 300, 400, 500, 600, 700, 800, 900, 1000,
 	2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000,
--- a/netwerk/protocol/http/nsHttpChannel.h
+++ b/netwerk/protocol/http/nsHttpChannel.h
@@ -474,17 +474,17 @@ private:
                rv == NS_ERROR_MALFORMED_URI;
     }
 
     // Report net vs cache time telemetry
     void ReportNetVSCacheTelemetry();
     int64_t ComputeTelemetryBucketNumber(int64_t difftime_ms);
 
     // Report telemetry and stats to about:networking
-    void ReportRcwnStats(nsIRequest* firstResponseRequest, bool isFromNet);
+    void ReportRcwnStats(bool isFromNet);
 
     // Create a aggregate set of the current notification callbacks
     // and ensure the transaction is updated to use it.
     void UpdateAggregateCallbacks();
 
     static bool HasQueryString(nsHttpRequestHead::ParsedMethodType method, nsIURI * uri);
     bool ResponseWouldVary(nsICacheEntry* entry);
     bool IsResumable(int64_t partialLen, int64_t contentLength,
--- a/old-configure.in
+++ b/old-configure.in
@@ -862,19 +862,22 @@ case "$target" in
         MOZ_SYNTH_PICO=1
     else
         if test "$COMPILE_ENVIRONMENT"; then
             MOZ_LINKER=1
         fi
     fi
 
     MOZ_GFX_OPTIMIZE_MOBILE=1
-    MOZ_OPTIMIZE_FLAGS="-Os"
     if test -z "$CLANG_CC"; then
-       MOZ_OPTIMIZE_FLAGS="-freorder-blocks -fno-reorder-functions $MOZ_OPTIMIZE_FLAGS"
+        MOZ_OPTIMIZE_FLAGS="-freorder-blocks -fno-reorder-functions -Os"
+    else
+        # From https://github.com/android-ndk/ndk/issues/133#issuecomment-308549264
+        # -Oz is smaller than -Os on clang.
+        MOZ_OPTIMIZE_FLAGS="-Oz"
     fi
     ;;
 
 *-*linux*)
     if test "$GNU_CC" -o "$GNU_CXX"; then
         MOZ_PGO_OPTIMIZE_FLAGS="-O3"
         if test -n "$MOZ_DEBUG"; then
             MOZ_OPTIMIZE_FLAGS="-Os"
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1144,9 +1144,9 @@ static const TransportSecurityPreload kP
   { "za.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "zh.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
 };
 
 // Pinning Preload List Length = 480;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1507909999524000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1508083184197000);
--- a/security/manager/ssl/nsSTSPreloadList.errors
+++ b/security/manager/ssl/nsSTSPreloadList.errors
@@ -44,32 +44,34 @@ 1years.cc: could not connect to host
 206rc.net: max-age too low: 2592000
 21.co.uk: did not receive HSTS header
 21lg.co: could not connect to host
 247loan.com: max-age too low: 0
 24hourpaint.com: could not connect to host
 24sihu.com: could not connect to host
 25daysof.io: could not connect to host
 2859cc.com: could not connect to host
+2bizi.ru: could not connect to host
 2brokegirls.org: could not connect to host
 2intermediate.co.uk: did not receive HSTS header
 2or3.tk: could not connect to host
 2programmers.net: could not connect to host
-2ss.jp: did not receive HSTS header
+2ss.jp: could not connect to host
 300651.ru: did not receive HSTS header
 300m.com: did not receive HSTS header
 300mbmovies4u.cc: could not connect to host
 301.website: could not connect to host
 302.nyc: could not connect to host
 33drugstore.com: did not receive HSTS header
 360gradus.com: did not receive HSTS header
 365.or.jp: could not connect to host
 368mibn.com: could not connect to host
 38sihu.com: could not connect to host
 39sihu.com: could not connect to host
+3ags.de: did not receive HSTS header
 3chit.cf: could not connect to host
 3click-loan.com: could not connect to host
 3delivered.com: could not connect to host
 3dprintsondemand.eu: did not receive HSTS header
 3dproteinimaging.com: did not receive HSTS header
 3sreporting.com: did not receive HSTS header
 3yearloans.com: could not connect to host
 404.sh: max-age too low: 0
@@ -165,17 +167,16 @@ adamkostecki.de: could not connect to ho
 adamradocz.com: could not connect to host
 adamricheimer.com: could not connect to host
 adams.net: max-age too low: 0
 adamwk.com: did not receive HSTS header
 adboos.com: could not connect to host
 addaxpetroleum.com: could not connect to host
 addvocate.com: could not connect to host
 adelevie.com: could not connect to host
-adelinlydia-coach.com: did not receive HSTS header
 adequatetechnology.com: could not connect to host
 aderal.io: could not connect to host
 adfa-1.com: could not connect to host
 adhs-chaoten.net: did not receive HSTS header
 adindexr.com: could not connect to host
 admin.google.com: did not receive HSTS header (error ignored - included regardless)
 admiral.dp.ua: did not receive HSTS header
 admitcard.co.in: did not receive HSTS header
@@ -195,36 +196,37 @@ aduedu.de: did not receive HSTS header
 adunanza.net: did not receive HSTS header
 advancedstudio.ro: did not receive HSTS header
 adver.top: could not connect to host
 adviespuntklokkenluiders.nl: could not connect to host
 aemoria.com: could not connect to host
 aerialmediapro.net: could not connect to host
 aes256.ru: could not connect to host
 aether.pw: could not connect to host
+aevpn.net: could not connect to host
 aeyoun.com: did not receive HSTS header
 af-fotografie.net: did not receive HSTS header
 affilie.de: did not receive HSTS header
 aficotroceni.ro: did not receive HSTS header
 afiru.net: could not connect to host
 afp548.tk: could not connect to host
 afvallendoeje.nu: could not connect to host
 afyou.co.kr: could not connect to host
 agalaxyfarfaraway.co.uk: could not connect to host
 agate.pw: did not receive HSTS header
 agatheetraphael.fr: could not connect to host
 agbremen.de: did not receive HSTS header
 agentseeker.ca: did not receive HSTS header
 agevio.com: could not connect to host
 agrimap.com: did not receive HSTS header
-agrios.de: did not receive HSTS header
 agro-id.gov.ua: did not receive HSTS header
 ahabingo.com: did not receive HSTS header
 ahoynetwork.com: did not receive HSTS header
 ahri.ovh: could not connect to host
+ahxxm.com: could not connect to host
 aidanwoods.com: did not receive HSTS header
 aids.gov: did not receive HSTS header
 aircomms.com: did not receive HSTS header
 airlea.com: could not connect to host
 airlinecheckins.com: did not receive HSTS header
 airproto.com: could not connect to host
 aishnair.com: could not connect to host
 aiticon.de: did not receive HSTS header
@@ -233,29 +235,31 @@ ajmahal.com: could not connect to host
 aka.my: did not receive HSTS header
 akboy.pw: could not connect to host
 akclinics.org: did not receive HSTS header
 akerek.hu: could not connect to host
 akgundemirbas.com: could not connect to host
 akkadia.cc: could not connect to host
 akombakom.net: did not receive HSTS header
 akostecki.de: could not connect to host
+akpwebdesign.com: could not connect to host
 akselimedia.fi: did not receive HSTS header
 aktivist.in: did not receive HSTS header
 al-shami.net: could not connect to host
 aladdin.ie: did not receive HSTS header
 alainwolf.net: could not connect to host
 alanlee.net: could not connect to host
 alanrickmanflipstable.com: could not connect to host
 alariel.de: did not receive HSTS header
 alarmsystemreviews.com: did not receive HSTS header
 alberguecimballa.es: could not connect to host
 albertbogdanowicz.pl: did not receive HSTS header
 albertopimienta.com: did not receive HSTS header
 alcazaar.com: could not connect to host
+alcnutrition.com: could not connect to host
 alecvannoten.be: did not receive HSTS header
 alenan.org: could not connect to host
 alessandro.pw: did not receive HSTS header
 alethearose.com: did not receive HSTS header
 alexandre.sh: did not receive HSTS header
 alfa24.pro: could not connect to host
 alittlebitcheeky.com: did not receive HSTS header
 aljmz.com: did not receive HSTS header
@@ -302,16 +306,18 @@ amimoto-ami.com: max-age too low: 315360
 amishsecurity.com: could not connect to host
 amitube.com: could not connect to host
 amlvfs.net: could not connect to host
 amoory.com: did not receive HSTS header
 amri.nl: did not receive HSTS header
 anadoluefessporkulubu.org: could not connect to host
 anagra.ms: could not connect to host
 analytic-s.ml: did not receive HSTS header
+analyticum.at: could not connect to host
+analyticum.com: could not connect to host
 ancientkarma.com: could not connect to host
 andere-gedanken.net: max-age too low: 10
 anderslind.dk: could not connect to host
 andiplusben.com: could not connect to host
 andreasbreitenlohner.de: did not receive HSTS header
 andreasfritz-fotografie.de: could not connect to host
 andreastoneman.com: could not connect to host
 andreigec.net: did not receive HSTS header
@@ -384,17 +390,16 @@ appengine.google.com: did not receive HS
 apple-watch-zubehoer.de: could not connect to host
 apple.ax: could not connect to host
 applez.xyz: could not connect to host
 applic8.com: did not receive HSTS header
 appraisal-comps.com: could not connect to host
 appreciationkards.com: could not connect to host
 approlys.fr: did not receive HSTS header
 apps-for-fishing.com: could not connect to host
-apps.facebook.com: max-age too low: 0
 appsbystudio.co.uk: could not connect to host
 appsdash.io: could not connect to host
 aqilacademy.com.au: could not connect to host
 aquilalab.com: could not connect to host
 arabdigitalexpression.org: did not receive HSTS header
 aradulconteaza.ro: could not connect to host
 aran.me.uk: could not connect to host
 arboineuropa.nl: did not receive HSTS header
@@ -477,50 +482,53 @@ aurainfosec.com.au: could not connect to
 auraredeye.com: could not connect to host
 auraredshield.com: did not receive HSTS header
 auroratownshipfd.org: could not connect to host
 ausnah.me: could not connect to host
 ausoptic.com.au: max-age too low: 2592000
 aussiecable.org: did not receive HSTS header
 auth.mail.ru: did not receive HSTS header
 authentication.io: could not connect to host
+authint.com: could not connect to host
 authoritynutrition.com: did not receive HSTS header
 auto-serwis.zgorzelec.pl: did not receive HSTS header
 auto4trade.nl: could not connect to host
 autodeploy.it: could not connect to host
 autoeet.cz: did not receive HSTS header
-autoepc.ro: did not receive HSTS header
+autoepc.ro: could not connect to host
 autojuhos.sk: could not connect to host
 autokovrik-diskont.ru: did not receive HSTS header
 automobiles5.com: could not connect to host
 autotsum.com: could not connect to host
 autumnwindsagility.com: could not connect to host
 auverbox.ovh: could not connect to host
 aux-arts-de-la-table.com: did not receive HSTS header
 auxiliumincrementum.co.uk: could not connect to host
 av.de: did not receive HSTS header
 avadatravel.com: did not receive HSTS header
 avantmfg.com: did not receive HSTS header
 avec-ou-sans-ordonnance.fr: could not connect to host
 avepol.cz: did not receive HSTS header
 avepol.eu: did not receive HSTS header
+avi9526.pp.ua: could not connect to host
 aviacao.pt: did not receive HSTS header
 avinet.com: max-age too low: 0
 aviodeals.com: could not connect to host
 avqueen.cn: did not receive HSTS header
 avus-automobile.com: did not receive HSTS header
 awanderlustadventure.com: did not receive HSTS header
 awg-mode.de: did not receive HSTS header
 aww.moe: did not receive HSTS header
 awxg.com: could not connect to host
 axado.com.br: did not receive HSTS header
 axeny.com: did not receive HSTS header
 ayuru.info: could not connect to host
 az.search.yahoo.com: did not receive HSTS header
 azino777.ru: did not receive HSTS header
+azort.com: did not receive HSTS header
 azprep.us: could not connect to host
 b-landia.net: could not connect to host
 b-space.de: did not receive HSTS header
 b303.me: did not receive HSTS header
 b3orion.com: max-age too low: 0
 baby-click.de: could not connect to host
 babybee.ie: could not connect to host
 babybic.hu: did not receive HSTS header
@@ -552,25 +560,25 @@ bandrcrafts.com: could not connect to ho
 banqingdiao.com: could not connect to host
 barely.sexy: did not receive HSTS header
 barrelhead.org: could not connect to host
 barss.io: could not connect to host
 barunisystems.com: could not connect to host
 bashcode.ninja: could not connect to host
 basicsolutionsus.com: did not receive HSTS header
 basilisk.io: could not connect to host
-basnieuwenhuizen.nl: could not connect to host
-bassh.net: did not receive HSTS header
+bassh.net: could not connect to host
 battleofthegridiron.com: could not connect to host
 baud.ninja: could not connect to host
 baum.ga: did not receive HSTS header
 baumstark.ca: could not connect to host
 baysse.eu: could not connect to host
 bazarstupava.sk: could not connect to host
 bbb1991.me: could not connect to host
+bbdos.ru: could not connect to host
 bblovess.cn: could not connect to host
 bbrinck.eu: did not receive HSTS header
 bbwdom.xyz: could not connect to host
 bbwfacesitting.xyz: could not connect to host
 bbwfight.xyz: could not connect to host
 bcbsmagentprofile.com: could not connect to host
 bcchack.com: could not connect to host
 bccx.com: could not connect to host
@@ -593,16 +601,17 @@ beautyconcept.co: did not receive HSTS h
 beavers.io: could not connect to host
 bebeefy.uk: could not connect to host
 bebesurdoue.com: could not connect to host
 bedabox.com: max-age too low: 0
 bedeta.de: could not connect to host
 bedreid.dk: did not receive HSTS header
 bedrijvenadministratie.nl: did not receive HSTS header
 beetleroadstories.com: could not connect to host
+beetman.net: could not connect to host
 befundup.com: could not connect to host
 behere.be: could not connect to host
 beholdthehurricane.com: could not connect to host
 beier.io: could not connect to host
 beikeil.de: did not receive HSTS header
 belairsewvac.com: could not connect to host
 belics.com: did not receive HSTS header
 belltower.io: could not connect to host
@@ -616,17 +625,16 @@ benzkosmetik.de: did not receive HSTS he
 beourvictim.com: max-age too low: 2678400
 berger.work: could not connect to host
 berlatih.com: could not connect to host
 berlinleaks.com: could not connect to host
 berna.fr: could not connect to host
 berrymark.be: max-age too low: 0
 besixdouze.world: could not connect to host
 besola.de: did not receive HSTS header
-best-wallpaper.net: max-age too low: 10368000
 bestbeards.ca: could not connect to host
 bestcellular.com: did not receive HSTS header
 besthost.cz: did not receive HSTS header
 bestlashesandbrows.com: did not receive HSTS header
 bestmodels.su: did not receive HSTS header
 betaclean.fr: did not receive HSTS header
 betafive.net: could not connect to host
 betcafearena.ro: could not connect to host
@@ -636,17 +644,16 @@ betplanning.it: did not receive HSTS hea
 bets.de: did not receive HSTS header
 betshoot.com: did not receive HSTS header
 bettween.com: could not connect to host
 betz.ro: did not receive HSTS header
 beulahtabernacle.com: could not connect to host
 bevapehappy.com: did not receive HSTS header
 bewerbungsfibel.de: did not receive HSTS header
 beyond-edge.com: could not connect to host
-beyours.be: did not receive HSTS header
 beyuna.co.uk: did not receive HSTS header
 beyuna.eu: did not receive HSTS header
 beyuna.nl: did not receive HSTS header
 bezorg.ninja: could not connect to host
 bf.am: max-age too low: 0
 bfelob.gov: max-age too low: 86400
 bffm.biz: max-age too low: 0
 bgcparkstad.nl: did not receive HSTS header
@@ -654,24 +661,24 @@ bgmn.net: could not connect to host
 bhatia.at: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118"  data: no]
 bi.search.yahoo.com: did not receive HSTS header
 biblerhymes.com: did not receive HSTS header
 bidon.ca: did not receive HSTS header
 bieberium.de: could not connect to host
 bienenblog.cc: could not connect to host
 bierbringer.at: could not connect to host
 bierochs.org: could not connect to host
-big-andy.co.uk: did not receive HSTS header
 big-black.de: did not receive HSTS header
 bigbbqbrush.bid: could not connect to host
 bigbrownpromotions.com.au: did not receive HSTS header
 bigshinylock.minazo.net: could not connect to host
 biguixhe.net: did not receive HSTS header
 bildiri.ci: did not receive HSTS header
 bildschirmflackern.de: did not receive HSTS header
+billaud.eu.org: could not connect to host
 billin.net: did not receive HSTS header
 billkiss.com: could not connect to host
 billninja.com: did not receive HSTS header
 billrusling.com: could not connect to host
 bimbo.com: did not receive HSTS header
 binaryfigments.com: could not connect to host
 binderapp.net: could not connect to host
 biofam.ru: did not receive HSTS header
@@ -802,18 +809,17 @@ bremensaki.com: max-age too low: 2592000
 brickoo.com: could not connect to host
 brickyardbuffalo.com: did not receive HSTS header
 bridholm.se: could not connect to host
 brightstarkids.com.au: did not receive HSTS header
 britzer-toner.de: did not receive HSTS header
 brks.xyz: could not connect to host
 brockmeyer.org: could not connect to host
 broken-oak.com: could not connect to host
-brokenhands.io: could not connect to host
-brooke-fan.com: could not connect to host
+brokenhands.io: did not receive HSTS header
 brookechase.com: did not receive HSTS header
 browserid.org: could not connect to host
 brunix.net: did not receive HSTS header
 brunoonline.co.uk: could not connect to host
 brunosouza.org: could not connect to host
 bryn.xyz: could not connect to host
 brztec.com: could not connect to host
 bsagan.fr: could not connect to host
@@ -830,33 +836,30 @@ bugginslab.co.uk: could not connect to h
 bugtrack.io: could not connect to host
 buhler.pro: did not receive HSTS header
 build.chromium.org: did not receive HSTS header (error ignored - included regardless)
 buildci.asia: could not connect to host
 buildify.co.za: could not connect to host
 buildsaver.co.za: did not receive HSTS header
 built.by: did not receive HSTS header
 bukatv.cz: could not connect to host
-bul3seas.eu: could not connect to host
 bulkbuy.tech: could not connect to host
-bullbits.com: could not connect to host
 bulletpoint.cz: could not connect to host
 bullterrier.me: could not connect to host
 bulmafox.com: could not connect to host
 bumarkamoda.com: did not receive HSTS header
 bunaken.asia: did not receive HSTS header
 bunbomenu.de: could not connect to host
 bunsenlabs.org: max-age too low: 259200
 burian-server.cz: could not connect to host
 burningcrash.de: max-age too low: 600000
 burpsuite.site: could not connect to host
 burrow.ovh: could not connect to host
 burtrum.me: could not connect to host
 burtrum.top: could not connect to host
-business.facebook.com: max-age too low: 0
 business.lookout.com: could not connect to host
 businesshosting.nl: did not receive HSTS header
 businessimmigration-eu.com: did not receive HSTS header
 businessimmigration-eu.ru: did not receive HSTS header
 businessloanconnection.org: did not receive HSTS header
 businessloanstoday.com: max-age too low: 0
 busold.ws: could not connect to host
 bustimes.org: could not connect to host
@@ -865,16 +868,17 @@ buttercoin.com: could not connect to hos
 butterfieldstraining.com: did not receive HSTS header
 buyaccessible.gov: did not receive HSTS header
 buybaby.eu: did not receive HSTS header
 buyfox.de: did not receive HSTS header
 bw81.xyz: could not connect to host
 bwear4all.de: could not connect to host
 by4cqb.cn: could not connect to host
 bydisk.com: could not connect to host
+bymark.co: could not connect to host
 bypassed.bid: did not receive HSTS header
 bypassed.cc: did not receive HSTS header
 bypassed.club: did not receive HSTS header
 bypassed.date: did not receive HSTS header
 bypassed.download: did not receive HSTS header
 bypassed.faith: did not receive HSTS header
 bypassed.host: did not receive HSTS header
 bypassed.me: did not receive HSTS header
@@ -942,22 +946,23 @@ capecycles.co.za: did not receive HSTS h
 capeyorkfire.com.au: did not receive HSTS header
 capitaltg.com: could not connect to host
 captchatheprize.com: could not connect to host
 captianseb.de: could not connect to host
 captivatedbytabrett.com: could not connect to host
 car-navi.ph: did not receive HSTS header
 carano-service.de: did not receive HSTS header
 caraudio69.cz: could not connect to host
+carck.co.uk: could not connect to host
+carck.uk: could not connect to host
 card-toka.jp: did not receive HSTS header
 cardoni.net: did not receive HSTS header
 cardstream.com: did not receive HSTS header
 cardurl.com: did not receive HSTS header
 caringladies.org: could not connect to host
-carlandfaith.com: could not connect to host
 carlo.mx: did not receive HSTS header
 carlolly.co.uk: could not connect to host
 carlosalves.info: could not connect to host
 carpliyz.com: could not connect to host
 carroarmato0.be: could not connect to host
 carsforbackpackers.com: could not connect to host
 carwashvapeur.be: could not connect to host
 casc.cz: did not receive HSTS header
@@ -1003,26 +1008,25 @@ cesal.net: could not connect to host
 cesidianroot.eu: could not connect to host
 cevrimici.com: could not connect to host
 cfcproperties.com: did not receive HSTS header
 cfetengineering.com: could not connect to host
 cfoitplaybook.com: could not connect to host
 cg.search.yahoo.com: did not receive HSTS header
 cganx.org: could not connect to host
 cgsshelper.tk: could not connect to host
+ch-sc.de: could not connect to host
 chainmonitor.com: could not connect to host
 championsofregnum.com: did not receive HSTS header
-champserver.net: could not connect to host
 chandlerredding.com: did not receive HSTS header
 changetip.com: did not receive HSTS header
 chaos.fail: did not receive HSTS header
 chaoswebs.net: did not receive HSTS header
 charityclear.com: did not receive HSTS header
 charitystreet.co.uk: could not connect to host
-charmyadesara.com: did not receive HSTS header
 charnleyhouse.co.uk: max-age too low: 604800
 chartpen.com: did not receive HSTS header
 chartstoffarm.de: did not receive HSTS header
 chatbot.me: did not receive HSTS header
 chateauconstellation.ch: did not receive HSTS header
 chatup.cf: could not connect to host
 chcemvediet.sk: max-age too low: 1555200
 cheazey.net: could not connect to host
@@ -1071,16 +1075,17 @@ cidr.ml: could not connect to host
 cig-dem.com: could not connect to host
 cigarblogs.net: could not connect to host
 cigi.site: could not connect to host
 cim2b.de: could not connect to host
 cimalando.eu: could not connect to host
 cintdirect.com: could not connect to host
 cioconference.co.nz: could not connect to host
 ciplanutrition.com: did not receive HSTS header
+cirrohost.com: did not receive HSTS header
 ciscommerce.net: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118"  data: no]
 citiagent.cz: could not connect to host
 cityoflaurel.org: did not receive HSTS header
 ciuciucadou.ro: could not connect to host
 cium.ru: could not connect to host
 cjcaron.org: could not connect to host
 clara-baumert.de: could not connect to host
 claralabs.com: did not receive HSTS header
@@ -1140,29 +1145,28 @@ cnwage.com: could not connect to host
 cobrasystems.nl: max-age too low: 0
 cocktailfuture.fr: could not connect to host
 cocolovesdaddy.com: could not connect to host
 codabix.com: did not receive HSTS header
 codabix.de: could not connect to host
 codabix.net: could not connect to host
 code-35.com: could not connect to host
 code-digsite.com: could not connect to host
-code.facebook.com: max-age too low: 0
 code.google.com: did not receive HSTS header (error ignored - included regardless)
 codealkemy.co: could not connect to host
 codeco.pw: could not connect to host
 codecontrollers.de: could not connect to host
 codeforce.io: could not connect to host
 codeforhakodate.org: did not receive HSTS header
 codelayer.ca: could not connect to host
 codelitmus.com: did not receive HSTS header
 codemonkeyrawks.net: did not receive HSTS header
 codepoet.de: could not connect to host
-codepult.com: could not connect to host
 codepx.com: did not receive HSTS header
+codera.co.uk: could not connect to host
 codewild.de: could not connect to host
 codiva.io: max-age too low: 2592000
 codymoniz.com: did not receive HSTS header
 coffeeetc.co.uk: did not receive HSTS header
 coffeestrategies.com: max-age too low: 0
 cohesive.io: could not connect to host
 coiffeurschnittstelle.ch: did not receive HSTS header
 coindam.com: could not connect to host
@@ -1212,17 +1216,16 @@ consciousbranding.org.au: could not conn
 consciousbrands.net.au: could not connect to host
 console.python.org: did not receive HSTS header
 console.support: did not receive HSTS header
 constructionjobs.com: did not receive HSTS header
 contactbig.com: did not receive HSTS header
 contactsingapore.sg: did not receive HSTS header
 containerstatistics.com: could not connect to host
 contarkos.xyz: could not connect to host
-content-api-dev.azurewebsites.net: could not connect to host
 continuumgaming.com: could not connect to host
 controlcenter.gigahost.dk: did not receive HSTS header
 convert.zone: could not connect to host
 cooink.net: could not connect to host
 coolaj86.com: did not receive HSTS header
 coolchevy.org.ua: did not receive HSTS header
 coole-meister.de: could not connect to host
 cooxa.com: could not connect to host
@@ -1239,17 +1242,16 @@ corgicloud.com: could not connect to hos
 corkyoga.site: could not connect to host
 cormactagging.ie: could not connect to host
 cormilu.com.br: did not receive HSTS header
 corporateencryption.com: could not connect to host
 correctpaardbatterijnietje.nl: did not receive HSTS header
 corruption-mc.net: could not connect to host
 corruption-rsps.net: could not connect to host
 corruption-server.net: could not connect to host
-cosplayer.com: could not connect to host
 costow.club: could not connect to host
 count.sh: could not connect to host
 couragewhispers.ca: did not receive HSTS header
 coursdeprogrammation.com: could not connect to host
 coursella.com: did not receive HSTS header
 covenantbank.net: could not connect to host
 coverduck.ru: could not connect to host
 cpuvinf.eu.org: could not connect to host
@@ -1272,16 +1274,18 @@ crbug.com: did not receive HSTS header (
 create-test-publish.co.uk: could not connect to host
 creativephysics.ml: could not connect to host
 creativeplayuk.com: did not receive HSTS header
 crecket.me: could not connect to host
 crendontech.com: could not connect to host
 crestoncottage.com: could not connect to host
 criena.net: did not receive HSTS header
 crimewatch.net.za: could not connect to host
+cristianhares.com: could not connect to host
+criticalaim.com: could not connect to host
 crizk.com: could not connect to host
 croome.no-ip.org: could not connect to host
 crosbug.com: did not receive HSTS header (error ignored - included regardless)
 crosscom.ch: could not connect to host
 crosssec.com: did not receive HSTS header
 crowd.supply: did not receive HSTS header
 crowdcurity.com: did not receive HSTS header
 crowdjuris.com: could not connect to host
@@ -1289,16 +1293,17 @@ crrev.com: did not receive HSTS header (
 crtvmgmt.com: could not connect to host
 crudysql.com: could not connect to host
 crufad.org: did not receive HSTS header
 cruzr.xyz: could not connect to host
 crypt.guru: could not connect to host
 crypticshell.co.uk: could not connect to host
 cryptify.eu: could not connect to host
 cryptobin.org: could not connect to host
+cryptodash.net: could not connect to host
 cryptojar.io: did not receive HSTS header
 cryptolab.pro: could not connect to host
 cryptolab.tk: could not connect to host
 cryptonit.net: did not receive HSTS header
 cryptopartyatx.org: could not connect to host
 cryptophobia.nl: did not receive HSTS header
 cryptopush.com: did not receive HSTS header
 crysadm.com: max-age too low: 1
@@ -1340,30 +1345,28 @@ cuvva.insure: did not receive HSTS heade
 cuvva.io: did not receive HSTS header
 cuvva.it: did not receive HSTS header
 cuvva.me: did not receive HSTS header
 cuvva.net: did not receive HSTS header
 cuvva.org: did not receive HSTS header
 cuvva.uk: did not receive HSTS header
 cuvva.us: did not receive HSTS header
 cviip.com: could not connect to host
-cvsoftub.com: could not connect to host
 cyanogenmod.xxx: could not connect to host
 cyberlab.kiev.ua: did not receive HSTS header
 cyberpunk.ca: could not connect to host
 cybershambles.com: could not connect to host
 cybersins.com: did not receive HSTS header
 cybersmart.co.uk: did not receive HSTS header
 cycleluxembourg.lu: did not receive HSTS header
 cydia-search.io: could not connect to host
 cyhour.com: did not receive HSTS header
 cynoshair.com: could not connect to host
 cyphertite.com: could not connect to host
 cytadel.fr: did not receive HSTS header
-d0xq.net: could not connect to host
 dabbot.org: did not receive HSTS header
 dad256.tk: could not connect to host
 dadtheimpaler.com: could not connect to host
 dah5.com: did not receive HSTS header
 dai-rin.co.jp: could not connect to host
 dailybits.be: did not receive HSTS header
 dailystormerpodcasts.com: could not connect to host
 daimadi.com: could not connect to host
@@ -1452,16 +1455,17 @@ dedicatutiempo.es: could not connect to 
 deepcovelabs.net: could not connect to host
 deepearth.uk: did not receive HSTS header
 deeprecce.tech: could not connect to host
 deetzen.de: did not receive HSTS header
 defcon.org: did not receive HSTS header
 defiler.tk: could not connect to host
 degroetenvanrosaline.nl: did not receive HSTS header
 deight.co: could not connect to host
+deinserverhost.de: did not receive HSTS header
 dekasan.ru: could not connect to host
 delayrefunds.co.uk: could not connect to host
 deliverance.co.uk: could not connect to host
 deltaconcepts.de: did not receive HSTS header
 deltanet-production.de: max-age too low: 0
 deltasmart.ch: did not receive HSTS header
 delvj.org: could not connect to host
 demdis.org: could not connect to host
@@ -1492,17 +1496,16 @@ destinationbijoux.fr: could not connect 
 destom.be: could not connect to host
 detector.exposed: could not connect to host
 detest.org: could not connect to host
 detutorial.com: max-age too low: 0
 deuxvia.com: could not connect to host
 devafterdark.com: could not connect to host
 devcu.com: could not connect to host
 devcu.net: could not connect to host
-developers.facebook.com: max-age too low: 0
 devincrow.me: could not connect to host
 devmsg.com: did not receive HSTS header
 devnsec.com: could not connect to host
 devnull.team: could not connect to host
 devopps.me: did not receive HSTS header
 devopsconnected.com: could not connect to host
 devtub.com: did not receive HSTS header
 devuan.org: did not receive HSTS header
@@ -1554,17 +1557,16 @@ dj4et.de: could not connect to host
 djxmmx.net: max-age too low: 0
 djz4music.com: did not receive HSTS header
 dkniss.de: could not connect to host
 dl.google.com: did not receive HSTS header (error ignored - included regardless)
 dlc.viasinc.com: could not connect to host
 dlemper.de: did not receive HSTS header
 dlscomputers.com.au: did not receive HSTS header
 dmcibulldog.com: did not receive HSTS header
-dmfd.net: could not connect to host
 dmix.ca: could not connect to host
 dmtry.me: did not receive HSTS header
 dmz.ninja: could not connect to host
 dns.google.com: did not receive HSTS header (error ignored - included regardless)
 dnsknowledge.com: did not receive HSTS header
 do-do.tk: could not connect to host
 do.search.yahoo.com: did not receive HSTS header
 dobet.in: could not connect to host
@@ -1581,61 +1583,60 @@ doggieholic.net: could not connect to ho
 dogoodbehappyllc.com: could not connect to host
 dohosting.ru: could not connect to host
 dokan.online: did not receive HSTS header
 doked.io: could not connect to host
 dolevik.com: could not connect to host
 dollarstore24.com: could not connect to host
 dollywiki.co.uk: could not connect to host
 dolphin-cloud.com: could not connect to host
-dolphincorp.co.uk: did not receive HSTS header
+dolphincorp.co.uk: could not connect to host
 domaine-aigoual-cevennes.com: did not receive HSTS header
+domainstaff.com: max-age too low: 2592000
 domaris.de: could not connect to host
 domenicocatelli.com: could not connect to host
 dominioanimal.com: could not connect to host
 dominique-mueller.de: did not receive HSTS header
 donmez.uk: could not connect to host
 donmez.ws: could not connect to host
 donttrustrobots.nl: could not connect to host
 donzelot.co.uk: max-age too low: 3600
 doodledraw.ninja: did not receive HSTS header
 dooku.cz: could not connect to host
 doomleika.com: could not connect to host
 doooonoooob.com: could not connect to host
 doridian.com: could not connect to host
 doridian.de: could not connect to host
 doridian.org: could not connect to host
 dosenbierrepublik.com: did not receive HSTS header
+dostavkakurierom.ru: could not connect to host
 dot42.no: could not connect to host
 dotacni-parazit.cz: did not receive HSTS header
 dotadata.me: could not connect to host
 dotspaperie.com: could not connect to host
 dovecotadmin.org: could not connect to host
 dovetailnow.com: could not connect to host
 download.jitsi.org: did not receive HSTS header
 downsouthweddings.com.au: did not receive HSTS header
 doxcelerate.com: did not receive HSTS header
 doyoucheck.com: did not receive HSTS header
-dpratt.de: did not receive HSTS header
 dragonisles.net: could not connect to host
 dragons-of-highlands.cz: could not connect to host
 dragonsmoke.cloud: could not connect to host
 dragonteam.ninja: could not connect to host
 dragontrainingmobilezoo.com.au: max-age too low: 0
-drahcro.uk: could not connect to host
 drakefortreasurer.sexy: could not connect to host
 draw.uy: could not connect to host
 drdevil.ru: could not connect to host
 dreadbyte.com: could not connect to host
 dreamcatcherblog.de: could not connect to host
 dreamlighteyeserum.com: could not connect to host
 dreamsforabetterworld.com.au: did not receive HSTS header
 dredgepress.com: could not connect to host
 dreid.org: did not receive HSTS header
-dreizwosechs.de: could not connect to host
 drewgle.net: could not connect to host
 drhopeson.com: could not connect to host
 drishti.guru: could not connect to host
 droidboss.com: did not receive HSTS header
 droncentrum.pl: could not connect to host
 droomhuis-in-zuid-holland-kopen.nl: did not receive HSTS header
 dropcam.com: did not receive HSTS header
 drtroyhendrickson.com: could not connect to host
@@ -1646,16 +1647,17 @@ dtub.co: did not receive HSTS header
 dualias.xyz: could not connect to host
 dubrovskiy.net: could not connect to host
 dubrovskiy.pro: could not connect to host
 duerls.de: did not receive HSTS header
 duesee.org: could not connect to host
 dullsir.com: did not receive HSTS header
 dungi.org: could not connect to host
 duskopy.top: could not connect to host
+dutch1.nl: could not connect to host
 dutchessuganda.com: did not receive HSTS header
 dutchrank.com: did not receive HSTS header
 duuu.ch: could not connect to host
 dycontrol.de: could not connect to host
 dyktig.as: did not receive HSTS header
 dylanscott.com.au: did not receive HSTS header
 dynamic-innovations.net: could not connect to host
 dynamize.solutions: could not connect to host
@@ -1665,17 +1667,16 @@ dzlibs.io: could not connect to host
 dzyabchenko.com: could not connect to host
 e-aut.net: could not connect to host
 e-biografias.net: did not receive HSTS header
 e-deca2.org: did not receive HSTS header
 e-isfa.eu: did not receive HSTS header
 e-pokupki.eu: did not receive HSTS header
 e-sa.com: did not receive HSTS header
 e3amn2l.com: could not connect to host
-eagleridgecampground.com: could not connect to host
 earga.sm: could not connect to host
 earlybirdsnacks.com: could not connect to host
 earthrise16.com: could not connect to host
 earvinkayonga.com: could not connect to host
 easez.net: did not receive HSTS header
 eason-yang.com: could not connect to host
 easychiller.org: could not connect to host
 easyocm.hu: did not receive HSTS header
@@ -1725,16 +1726,17 @@ egbert.net: could not connect to host
 egit.co: could not connect to host
 eglek.com: did not receive HSTS header
 ego-world.org: could not connect to host
 ehealthcounselor.com: could not connect to host
 ehipaadev.com: could not connect to host
 ehito.ovh: could not connect to host
 ehrenamt-skpfcw.de: could not connect to host
 eicfood.com: could not connect to host
+eidolonhost.com: did not receive HSTS header
 einhorn.space: could not connect to host
 ekbanden.nl: could not connect to host
 ekostecki.de: could not connect to host
 eksik.com: could not connect to host
 elaintehtaat.fi: did not receive HSTS header
 elan-organics.com: did not receive HSTS header
 elanguest.pl: could not connect to host
 elanguest.ro: could not connect to host
@@ -1803,31 +1805,35 @@ enteente.xyz: could not connect to host
 enterdev.co: did not receive HSTS header
 enterprise-threat-monitor.com: max-age too low: 0
 enterprisecarclub.co.uk: did not receive HSTS header
 entersynapse.com: did not receive HSTS header
 entourneebeetle.com: could not connect to host
 entrepreneur.or.id: did not receive HSTS header
 enum.eu.org: could not connect to host
 enumify.com: could not connect to host
+envygeeks.com: could not connect to host
+envygeeks.io: could not connect to host
 eol34.com: did not receive HSTS header
 epanurse.com: could not connect to host
 ephry.com: could not connect to host
 epichouse.net: could not connect to host
 epicpages.com: could not connect to host
 epoxate.com: could not connect to host
+epsorting.cz: could not connect to host
 eq8.net.au: could not connect to host
 eqim.me: could not connect to host
 equilibre-yoga-jennifer-will.com: could not connect to host
 erawanarifnugroho.com: did not receive HSTS header
 eressea.xyz: could not connect to host
 ericbond.net: could not connect to host
 erichalv.com: could not connect to host
 ericyl.com: could not connect to host
 eridanus.uk: did not receive HSTS header
+eriser.fr: could not connect to host
 ernaehrungsberatung-zurich.ch: could not connect to host
 ernesto.at: could not connect to host
 eromixx.com: did not receive HSTS header
 erotalia.es: could not connect to host
 erotic4me.ch: did not receive HSTS header
 eroticen.com: did not receive HSTS header
 erotische-aanbiedingen.nl: could not connect to host
 errolz.com: could not connect to host
@@ -1874,18 +1880,18 @@ etula.me: could not connect to host
 euanbaines.com: did not receive HSTS header
 eucl3d.com: did not receive HSTS header
 euclideanpostulates.xyz: could not connect to host
 eucollegetours.com: could not connect to host
 eupho.me: could not connect to host
 euren.se: could not connect to host
 eurocamping.se: could not connect to host
 euroshop24.net: could not connect to host
-eurovision.ie: did not receive HSTS header
 evafojtova.cz: did not receive HSTS header
+evalesc.com: could not connect to host
 evdenevenakliyatankara.pw: did not receive HSTS header
 events12.com: did not receive HSTS header
 everybooks.com: could not connect to host
 everylab.org: could not connect to host
 everything.place: could not connect to host
 evi.be: did not receive HSTS header
 evilnerd.de: did not receive HSTS header
 evilsay.com: could not connect to host
@@ -1942,16 +1948,17 @@ falconfrag.com: could not connect to hos
 falkhusemann.de: did not receive HSTS header
 falkp.no: did not receive HSTS header
 fallenangelspirits.uk: could not connect to host
 familie-sprink.de: could not connect to host
 familie-zimmermann.at: could not connect to host
 famio.cn: could not connect to host
 fantasyfootballpundit.com: did not receive HSTS header
 fanyl.cn: could not connect to host
+farhadexchange.com: did not receive HSTS header
 fashioncare.cz: did not receive HSTS header
 fasset.jp: could not connect to host
 fastcomcorp.com: did not receive HSTS header
 fastcomcorp.net: did not receive HSTS header
 fastdigitizing.com: max-age too low: 300
 fastograph.com: could not connect to host
 fastopen.ml: could not connect to host
 fastworx.com: could not connect to host
@@ -1963,17 +1970,17 @@ fawkex.me: did not receive HSTS header
 fayolle.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118"  data: no]
 fbox.li: could not connect to host
 fdj.im: could not connect to host
 feard.space: could not connect to host
 feastr.de: did not receive HSTS header
 fedo.moe: could not connect to host
 feezmodo.com: did not receive HSTS header
 felisslovakia.sk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118"  data: no]
-feliwyn.fr: did not receive HSTS header
+feliwyn.fr: could not connect to host
 femaledom.xyz: could not connect to host
 feminists.co: could not connect to host
 fenno.net: could not connect to host
 fenteo.com: could not connect to host
 feriahuamantla.com: max-age too low: 0
 fernseher-kauf.de: could not connect to host
 ferrolatino.com: could not connect to host
 festember.com: did not receive HSTS header
@@ -2167,21 +2174,21 @@ gaelleetarnaud.com: did not receive HSTS
 gafachi.com: could not connect to host
 gagstempel.de: max-age too low: 86400
 gaite.me: could not connect to host
 gakkainavi-epsilon.net: did not receive HSTS header
 gakkainavi.jp: did not receive HSTS header
 gakkainavi4.com: could not connect to host
 gakkainavi4.net: did not receive HSTS header
 galardi.org: could not connect to host
-galena.io: did not receive HSTS header
+galena.io: could not connect to host
 galenskap.eu: could not connect to host
 gallery44.org: did not receive HSTS header
 galoisvpn.xyz: could not connect to host
-game-files.net: did not receive HSTS header
+game-files.net: could not connect to host
 game.yt: could not connect to host
 gamecave.de: could not connect to host
 gamechasm.com: could not connect to host
 gamefund.me: did not receive HSTS header
 gamehacks.me: could not connect to host
 gameink.net: max-age too low: 0
 gamek.es: did not receive HSTS header
 gamenected.com: could not connect to host
@@ -2190,19 +2197,20 @@ gameofpwnz.com: did not receive HSTS hea
 gamepad.vg: could not connect to host
 gameparade.de: could not connect to host
 gamepiece.com: could not connect to host
 gamers-life.fr: could not connect to host
 gamerslair.org: did not receive HSTS header
 gamerz-point.de: could not connect to host
 gamesdepartment.co.uk: did not receive HSTS header
 gameserver-sponsor.de: could not connect to host
-gamingmedia.eu: could not connect to host
+gamingmedia.eu: did not receive HSTS header
 gampenhof.de: did not receive HSTS header
 gaptek.id: did not receive HSTS header
+garagemhermetica.org: did not receive HSTS header
 garageon.net: did not receive HSTS header
 garciamartin.me: could not connect to host
 garden.trade: max-age too low: 0
 garfieldairlines.net: did not receive HSTS header
 gatapro.net: could not connect to host
 gatorsa.es: did not receive HSTS header
 gaussorgues.me: could not connect to host
 gdegem.org: did not receive HSTS header
@@ -2210,35 +2218,37 @@ gdpventure.com: max-age too low: 0
 gebn.co.uk: did not receive HSTS header
 gedankenbude.info: could not connect to host
 geekcast.co.uk: did not receive HSTS header
 geeks.berlin: could not connect to host
 geeky.software: could not connect to host
 geemo.top: could not connect to host
 geeq.ch: could not connect to host
 geli-graphics.com: did not receive HSTS header
+gem-indonesia.net: max-age too low: 0
 genuu.com: could not connect to host
 genuxation.com: could not connect to host
 genyaa.com: could not connect to host
 genyhitch.com: did not receive HSTS header
 geofox.org: did not receive HSTS header
 georgesonarthurs.com.au: did not receive HSTS header
 gerencianet.com.br: did not receive HSTS header
+gernert-server.de: could not connect to host
 gersting.net: could not connect to host
 gesiwista.net: could not connect to host
 gesunde-smoothies.de: did not receive HSTS header
 get-cctv.com: could not connect to host
 get.zenpayroll.com: did not receive HSTS header
 getable.com: did not receive HSTS header
 getblys.com.au: did not receive HSTS header
 getbooks.co.il: did not receive HSTS header
 getcarefirst.com: did not receive HSTS header
 getcarina.com: could not connect to host
 getcolor.com: did not receive HSTS header
-getfestify.com: could not connect to host
+getfestify.com: did not receive HSTS header
 getfirepress.com: could not connect to host
 getgeek.dk: did not receive HSTS header
 getgeek.eu: did not receive HSTS header
 getgeek.fi: did not receive HSTS header
 getgeek.io: did not receive HSTS header
 getgeek.no: did not receive HSTS header
 getgeek.nu: did not receive HSTS header
 getgeek.se: did not receive HSTS header
@@ -2276,32 +2286,32 @@ gilly.berlin: did not receive HSTS heade
 gilroywestwood.org: could not connect to host
 gingali.de: did not receive HSTS header
 gintenreiter-photography.com: did not receive HSTS header
 giogadesign.com: did not receive HSTS header
 gipsamsfashion.com: could not connect to host
 gipsic.com: did not receive HSTS header
 gis3m.org: did not receive HSTS header
 gistfy.com: could not connect to host
-github.party: could not connect to host
 givemyanswer.com: could not connect to host
 gizzo.sk: could not connect to host
 gl.search.yahoo.com: did not receive HSTS header
 glass.google.com: did not receive HSTS header (error ignored - included regardless)
 glasschmuck-millefiori.de: did not receive HSTS header
 glentakahashi.com: max-age too low: 0
 glitzmirror.com: could not connect to host
 global-adult-webcams.com: did not receive HSTS header
 globalado.com: could not connect to host
 globalbridge-japan.com: did not receive HSTS header
 globalexpert.co.nz: could not connect to host
 globalittech.com: could not connect to host
 globalmusic.ga: could not connect to host
 globalsites.nl: did not receive HSTS header
 gloucesterphotographer.com: did not receive HSTS header
+glws.org: did not receive HSTS header
 gm-assicurazioni.it: could not connect to host
 gm.search.yahoo.com: did not receive HSTS header
 gmail.com: did not receive HSTS header (error ignored - included regardless)
 gmoes.at: max-age too low: 600000
 gnom.me: could not connect to host
 go.ax: did not receive HSTS header
 go2sh.de: did not receive HSTS header
 goabonga.com: could not connect to host
@@ -2378,16 +2388,17 @@ greenesting.ch: could not connect to hos
 greenhillantiques.co.uk: did not receive HSTS header
 greenvines.com.tw: did not receive HSTS header
 greg.red: could not connect to host
 gregorytlee.me: could not connect to host
 gremots.com: could not connect to host
 greplin.com: could not connect to host
 gresb.com: did not receive HSTS header
 gretchelizartistry.com: did not receive HSTS header
+greybit.net: could not connect to host
 greyline.se: could not connect to host
 gribani.com: could not connect to host
 grid2osm.org: could not connect to host
 grigalanzsoftware.com: could not connect to host
 gripopgriep.net: could not connect to host
 groenemeijer.frl: max-age too low: 2628000
 groenewoud.run: did not receive HSTS header
 groetzner.net: did not receive HSTS header
@@ -2396,17 +2407,17 @@ groupe-cassous.com: did not receive HSTS
 groups.google.com: did not receive HSTS header (error ignored - included regardless)
 grozip.com: did not receive HSTS header
 grunex.com: did not receive HSTS header
 grupopgn.com.br: could not connect to host
 gryffin.ga: could not connect to host
 gryffin.ml: could not connect to host
 gryffin.tk: could not connect to host
 gsm-map.com: could not connect to host
-gsnort.com: could not connect to host
+gsnort.com: did not receive HSTS header
 gswtech.eu: max-age too low: 0
 gtamodshop.org: could not connect to host
 gtanda.tk: could not connect to host
 gtdgo.com: could not connect to host
 gtech.work: did not receive HSTS header
 gtldna.com: could not connect to host
 gtlfsonlinepay.com: did not receive HSTS header
 gtraxapp.com: could not connect to host
@@ -2417,16 +2428,17 @@ guenthernoack.de: could not connect to h
 guffrits.com: could not connect to host
 guge.gq: could not connect to host
 gugga.dk: did not receive HSTS header
 guguke.net: did not receive HSTS header
 guilde-vindicta.fr: could not connect to host
 guineafruitcorp.com: could not connect to host
 gulch.in.ua: could not connect to host
 gulenet.com: could not connect to host
+gulfcoast-sandbox.com: could not connect to host
 gunnarhafdal.com: did not receive HSTS header
 gunnaro.com: could not connect to host
 guntbert.net: could not connect to host
 guoqiang.info: could not connect to host
 gurom.lv: could not connect to host
 gurusupe.com: could not connect to host
 guso.gq: could not connect to host
 guso.ml: could not connect to host
@@ -2542,24 +2554,25 @@ hebriff.com: could not connect to host
 heidilein.info: did not receive HSTS header
 heijblok.com: could not connect to host
 heimnetze.org: could not connect to host
 helencrump.co.uk: did not receive HSTS header
 helloworldhost.com: did not receive HSTS header
 helpadmin.net: could not connect to host
 helpium.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118"  data: no]
 helpmebuild.com: did not receive HSTS header
+helup.com: did not receive HSTS header
 hemdal.se: could not connect to host
 hencagon.com: could not connect to host
+heppler.net: could not connect to host
 hepteract.us: did not receive HSTS header
 herbert.io: could not connect to host
 heritagedentistry.ca: did not receive HSTS header
 herrenfahrt.com: did not receive HSTS header
 herzbotschaft.de: did not receive HSTS header
-hetmer.com: did not receive HSTS header
 heutger.net: did not receive HSTS header
 heyguevara.com: could not connect to host
 heywoodtown.co.uk: could not connect to host
 hfi.me: did not receive HSTS header
 hibilog.com: could not connect to host
 hicn.gq: could not connect to host
 hiddendepth.ie: max-age too low: 0
 hiddenmail.xyz: could not connect to host
@@ -2583,17 +2596,17 @@ hirefitness.co.uk: did not receive HSTS 
 hititgunesi-tr.com: did not receive HSTS header
 hitoy.org: did not receive HSTS header
 hittipps.com: did not receive HSTS header
 hiv.gov: did not receive HSTS header
 hjw-kunstwerk.de: could not connect to host
 hlyue.com: did not receive HSTS header
 hmm.nyc: could not connect to host
 hn.search.yahoo.com: did not receive HSTS header
-hobaugh.social: could not connect to host
+hobbyspeed.com: could not connect to host
 hodne.io: could not connect to host
 hoerbuecher-und-hoerspiele.de: could not connect to host
 hofiprojekt.cz: did not receive HSTS header
 hogar123.es: could not connect to host
 hoiku-map.tokyo: could not connect to host
 holifestival-freyung.de: could not connect to host
 holymoly.lu: could not connect to host
 homa.website: could not connect to host
@@ -2651,16 +2664,17 @@ hu.search.yahoo.com: did not receive HST
 huangh.com: could not connect to host
 huangzenghao.cn: could not connect to host
 huarongdao.com: did not receive HSTS header
 hugocollignon.fr: could not connect to host
 hugosleep.com.au: did not receive HSTS header
 humankode.com: did not receive HSTS header
 humblefinances.com: could not connect to host
 humeurs.net: could not connect to host
+humortuga.pt: could not connect to host
 humpi.at: could not connect to host
 humpteedumptee.in: did not receive HSTS header
 hup.blue: could not connect to host
 hurricanelabs.com: did not receive HSTS header
 huskybutt.dog: could not connect to host
 hxying.com: could not connect to host
 hycken.com: did not receive HSTS header
 hydra.ws: could not connect to host
@@ -2695,16 +2709,17 @@ icloud.net: could not connect to host
 icntorrent.download: could not connect to host
 icpc2016.in.th: could not connect to host
 icq-project.net: could not connect to host
 icreative.nl: did not receive HSTS header
 ictual.com: max-age too low: 0
 id-co.in: could not connect to host
 id-conf.com: did not receive HSTS header
 idacmedia.com: max-age too low: 5184000
+idcrane.com: could not connect to host
 ideadozz.hu: could not connect to host
 ideal-envelopes.co.uk: did not receive HSTS header
 idealmykonos.com: did not receive HSTS header
 ideasmeetingpoint.com: could not connect to host
 ideation-inc.co.jp: could not connect to host
 idecode.net: could not connect to host
 idedr.com: could not connect to host
 identitylabs.uk: could not connect to host
@@ -2817,31 +2832,33 @@ inspire-av.com: did not receive HSTS hea
 inspiroinc.com: could not connect to host
 inspy.me: max-age too low: 0
 instacart.com: did not receive HSTS header
 instantdev.io: could not connect to host
 instinctiveads.com: did not receive HSTS header
 institutoflordelavida.com: could not connect to host
 instruktor.io: could not connect to host
 intarweb.ca: could not connect to host
+integraelchen.de: could not connect to host
 intel.li: could not connect to host
 intelevo.com: max-age too low: 0
 interference.io: could not connect to host
 interhosts.co.za: could not connect to host
 interim-cto.de: could not connect to host
 interleucina.org: did not receive HSTS header
 interlun.com: could not connect to host
 internetcasinos.de: could not connect to host