Merge mozilla-central to mozilla-inbound
authorarthur.iakab <aiakab@mozilla.com>
Thu, 22 Mar 2018 02:02:06 +0200
changeset 409413 17c6a17df94a52888a467a1e23d939174e21c37b
parent 409412 ff30955a00d2f6cbba9288b3ba2b7b749a577628 (current diff)
parent 409343 b41c7c1ff91f49b1500b087ff23c288dd88f1fde (diff)
child 409414 689d9921beb532f06bca6e53599baa0ed2fed616
push id33687
push userapavel@mozilla.com
push dateThu, 22 Mar 2018 09:31:48 +0000
treeherdermozilla-central@7771df14ea18 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone61.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to mozilla-inbound
config/expandlibs.py
config/expandlibs_config.py
config/expandlibs_exec.py
config/expandlibs_gen.py
config/tests/unit-expandlibs.py
netwerk/base/nsIURIWithBlobImpl.idl
third_party/rust/parking_lot/src/stable.rs
third_party/rust/thread-id/.appveyor.yml
third_party/rust/thread-id/.cargo-checksum.json
third_party/rust/thread-id/.travis.yml
third_party/rust/thread-id/Cargo.toml
third_party/rust/thread-id/changelog.md
third_party/rust/thread-id/license-apache
third_party/rust/thread-id/license-mit
third_party/rust/thread-id/readme.md
third_party/rust/thread-id/src/lib.rs
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -689,17 +689,17 @@ dependencies = [
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "cstr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "nsstring 0.1.0",
- "parking_lot 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "servo_arc 0.1.1",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "style_traits 0.0.1",
 ]
 
 [[package]]
@@ -1250,22 +1250,21 @@ name = "owning_ref"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "parking_lot"
-version = "0.4.4"
+version = "0.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot_core 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
- "thread-id 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "parking_lot_core"
 version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1645,17 +1644,17 @@ dependencies = [
  "malloc_size_of_derive 0.0.1",
  "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "nsstring 0.1.0",
  "num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)",
  "num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "parking_lot 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "servo_arc 0.1.1",
  "smallbitvec 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "style_derive 0.0.1",
@@ -1776,25 +1775,16 @@ name = "textwrap"
 version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
-name = "thread-id"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
 name = "thread_local"
 version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -2299,17 +2289,17 @@ dependencies = [
 "checksum num 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "a311b77ebdc5dd4cf6449d81e4135d9f0e3b153839ac90e648a8ef538f923525"
 "checksum num-integer 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "d1452e8b06e448a07f0e6ebb0bb1d92b8890eea63288c0b627331d53514d0fba"
 "checksum num-iter 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)" = "7485fcc84f85b4ecd0ea527b14189281cf27d60e583ae65ebc9c088b13dffe01"
 "checksum num-traits 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cacfcab5eb48250ee7d0c7896b51a2c5eec99c1feea5f32025635f5ae4b00070"
 "checksum num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7de20f146db9d920c45ee8ed8f71681fd9ade71909b48c3acbd766aa504cf10"
 "checksum num_cpus 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "514f0d73e64be53ff320680ca671b64fe3fb91da01e1ae2ddc99eb51d453b20d"
 "checksum ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da12c96037889ae0be29dd2bdd260e5a62a7df24e6466d5a15bb8131c1c200a8"
 "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37"
-"checksum parking_lot 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "37f364e2ce5efa24c7d0b6646d5bb61145551a0112f107ffd7499f1a3e322fbd"
+"checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd"
 "checksum parking_lot_core 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6c677d78851950b3aec390e681a411f78cc250cba277d4f578758a377f727970"
 "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
 "checksum percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de154f638187706bde41d9b4738748933d64e6b37bdbffc0b47a97d16a6ae356"
 "checksum phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "cb325642290f28ee14d8c6201159949a872f220c62af6e110a56ea914fbe42fc"
 "checksum phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d62594c0bb54c464f633175d502038177e90309daf2e0158be42ed5f023ce88f"
 "checksum phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "6b07ffcc532ccc85e3afc45865469bf5d9e4ef5bfcf9622e3cfe80c2d275ec03"
 "checksum phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "07e24b0ca9643bdecd0632f2b3da6b1b89bbb0030e0b992afc1113b23a7bc2f2"
 "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
@@ -2348,17 +2338,16 @@ dependencies = [
 "checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"
 "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
 "checksum syn 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9e1c669ed757c0ebd04337f6a5bb972d05e0c08fe2540dd3ee3dd9e4daf1604c"
 "checksum synom 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "27e31aa4b09b9f4cb12dff3c30ba503e17b1a624413d764d32dab76e3920e5bc"
 "checksum synstructure 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "010366096045d8250555904c58da03377289e7f4b2ce7a5b1027e2b532f41000"
 "checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6"
 "checksum term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b6b55df3198cc93372e85dd2ed817f0e38ce8cc0f22eb32391bfad9c4bf209"
 "checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693"
-"checksum thread-id 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8df7875b676fddfadffd96deea3b1124e5ede707d4884248931077518cf1f773"
 "checksum thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1697c4b57aeeb7a536b647165a2825faddffb1d3bad386d507709bd51a90bb14"
 "checksum thread_profiler 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf947d192a9be60ef5131cc7a4648886ba89d712f16700ebbf80c8a69d05d48f"
 "checksum time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)" = "d5d788d3aa77bc0ef3e9621256885555368b47bd495c13dd2e7413c89f845520"
 "checksum tokio-core 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "febd81b3e2ef615c6c8077347b33f3f3deec3d708ecd08194c9707b7a1eccfc9"
 "checksum tokio-io 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b4ab83e7adb5677e42e405fa4ceff75659d93c4d7d7dd22f52fcec59ee9f02af"
 "checksum tokio-uds 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "65ae5d255ce739e8537221ed2942e0445f4b3b813daebac1c0050ddaaa3587f9"
 "checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e"
 "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079"
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -162,17 +162,17 @@
     <broadcaster id="isFrameImage"/>
     <broadcaster id="singleFeedMenuitemState" disabled="true"/>
     <broadcaster id="multipleFeedsMenuState" hidden="true"/>
 
     <!-- Sync broadcasters -->
     <!-- A broadcaster of a number of attributes suitable for "sync now" UI -
         A 'syncstatus' attribute is set while actively syncing, and the label
         attribute which changes from "sync now" to "syncing" etc. -->
-    <broadcaster id="sync-status"/>
+    <broadcaster id="sync-status" onmouseover="gSync.refreshSyncButtonsTooltip();"/>
     <!-- broadcasters of the "hidden" attribute to reflect setup state for
          menus -->
     <broadcaster id="sync-setup-state" hidden="true"/>
     <broadcaster id="sync-unverified-state" hidden="true"/>
     <broadcaster id="sync-syncnow-state" hidden="true"/>
     <broadcaster id="sync-reauth-state" hidden="true"/>
     <broadcaster id="viewTabsSidebar" autoCheck="false" sidebartitle="&syncedTabs.sidebar.label;"
                  type="checkbox" group="sidebar"
--- a/browser/base/content/browser-sync.js
+++ b/browser/base/content/browser-sync.js
@@ -383,17 +383,17 @@ var gSync = {
       targetDevice.setAttribute("label", name);
       fragment.appendChild(targetDevice);
     }
 
     const clients = this.remoteClients;
     for (let client of clients) {
       const type = client.formfactor && client.formfactor.includes("tablet") ?
                    "tablet" : client.type;
-      addTargetDevice(client.id, client.name, type, client.serverLastModified * 1000);
+      addTargetDevice(client.id, client.name, type, new Date(client.serverLastModified * 1000));
     }
 
     // "Send to All Devices" menu item
     if (clients.length > 1) {
       const separator = createDeviceNodeFn();
       separator.classList.add("sync-menuitem");
       fragment.appendChild(separator);
       const allDevicesLabel = this.fxaStrings.GetStringFromName("sendToAllDevices.menuitem");
@@ -586,16 +586,21 @@ var gSync = {
         PanelUI.showSubView("PanelUI-remotetabs", anchor);
       }, Cu.reportError);
     } else {
       // It is placed somewhere else - just try and show it.
       PanelUI.showSubView("PanelUI-remotetabs", anchor);
     }
   },
 
+  refreshSyncButtonsTooltip() {
+    const state = UIState.get();
+    this.updateSyncButtonsTooltip(state);
+  },
+
   /* Update the tooltip for the sync-status broadcaster (which will update the
      Sync Toolbar button and the Sync spinner in the FxA hamburger area.)
      If Sync is configured, the tooltip is when the last sync occurred,
      otherwise the tooltip reflects the fact that Sync needs to be
      (re-)configured.
   */
   updateSyncButtonsTooltip(state) {
     const status = state.status;
@@ -623,42 +628,27 @@ var gSync = {
       if (tooltiptext) {
         broadcaster.setAttribute("tooltiptext", tooltiptext);
       } else {
         broadcaster.removeAttribute("tooltiptext");
       }
     }
   },
 
-  get withinLastWeekFormat() {
-    delete this.withinLastWeekFormat;
-    return this.withinLastWeekFormat = new Intl.DateTimeFormat(undefined,
-      {weekday: "long", hour: "numeric", minute: "numeric"});
-  },
-
-  get oneWeekOrOlderFormat() {
-    delete this.oneWeekOrOlderFormat;
-    return this.oneWeekOrOlderFormat = new Intl.DateTimeFormat(undefined,
-      {month: "long", day: "numeric"});
+  get relativeTimeFormat() {
+    delete this.relativeTimeFormat;
+    return this.relativeTimeFormat = new Services.intl.RelativeTimeFormat(undefined, {style: "short"});
   },
 
   formatLastSyncDate(date) {
-    let sixDaysAgo = (() => {
-      let tempDate = new Date();
-      tempDate.setDate(tempDate.getDate() - 6);
-      tempDate.setHours(0, 0, 0, 0);
-      return tempDate;
-    })();
-
-    // It may be confusing for the user to see "Last Sync: Monday" when the last
-    // sync was indeed a Monday, but 3 weeks ago.
-    let dateFormat = date < sixDaysAgo ? this.oneWeekOrOlderFormat : this.withinLastWeekFormat;
-
-    let lastSyncDateString = dateFormat.format(date);
-    return this.syncStrings.formatStringFromName("lastSync2.label", [lastSyncDateString], 1);
+    if (!date) { // Date can be null before the first sync!
+      return null;
+    }
+    const relativeDateStr = this.relativeTimeFormat.formatBestUnit(date);
+    return this.syncStrings.formatStringFromName("lastSync2.label", [relativeDateStr], 1);
   },
 
   onClientsSynced() {
     let broadcaster = document.getElementById("sync-syncnow-state");
     if (broadcaster) {
       if (Weave.Service.clientsEngine.stats.numClients > 1) {
         broadcaster.setAttribute("devices-status", "multi");
       } else {
--- a/browser/base/content/test/sync/browser_fxa_badge.js
+++ b/browser/base/content/test/sync/browser_fxa_badge.js
@@ -17,16 +17,17 @@ add_task(async function test_unconfigure
   UIState.get = oldUIState;
 });
 
 add_task(async function test_signedin_no_badge() {
   const oldUIState = UIState.get;
 
   UIState.get = () => ({
     status: UIState.STATUS_SIGNED_IN,
+    lastSync: new Date(),
     email: "foo@bar.com"
   });
   Services.obs.notifyObservers(null, UIState.ON_UPDATE);
   checkFxABadge(false);
 
   UIState.get = oldUIState;
 });
 
--- a/browser/base/content/test/sync/browser_sync.js
+++ b/browser/base/content/test/sync/browser_sync.js
@@ -129,31 +129,16 @@ add_task(async function test_ui_state_lo
     avatarURL: null,
     syncing: false,
     syncNowTooltip: tooltipText
   });
   checkRemoteTabsPanel("PanelUI-remotetabs-reauthsync", false);
   checkMenuBarItem("sync-reauthitem");
 });
 
-add_task(async function test_FormatLastSyncDateNow() {
-  let now = new Date();
-  let nowString = gSync.formatLastSyncDate(now);
-  is(nowString, "Last sync: " + now.toLocaleDateString(undefined, {weekday: "long", hour: "numeric", minute: "numeric"}),
-     "The date is correctly formatted");
-});
-
-add_task(async function test_FormatLastSyncDateMonthAgo() {
-  let monthAgo = new Date();
-  monthAgo.setMonth(monthAgo.getMonth() - 1);
-  let monthAgoString = gSync.formatLastSyncDate(monthAgo);
-  is(monthAgoString, "Last sync: " + monthAgo.toLocaleDateString(undefined, {month: "long", day: "numeric"}),
-     "The date is correctly formatted");
-});
-
 function checkPanelUIStatusBar({label, tooltip, fxastatus, avatarURL, syncing, syncNowTooltip}) {
   let labelNode = document.getElementById("appMenu-fxa-label");
   let tooltipNode = document.getElementById("appMenu-fxa-status");
   let statusNode = document.getElementById("appMenu-fxa-container");
   let avatar = document.getElementById("appMenu-fxa-avatar");
 
   is(labelNode.getAttribute("label"), label, "fxa label has the right value");
   is(tooltipNode.getAttribute("tooltiptext"), tooltip, "fxa tooltip has the right value");
--- a/browser/base/content/test/urlbar/browser_page_action_menu.js
+++ b/browser/base/content/test/urlbar/browser_page_action_menu.js
@@ -323,17 +323,17 @@ add_task(async function sendToDevice_syn
           },
         ];
         for (let client of mockRemoteClients) {
           expectedItems.push({
             attrs: {
               clientId: client.id,
               label: client.name,
               clientType: client.type,
-              tooltiptext: gSync.formatLastSyncDate(lastModifiedFixture * 1000)
+              tooltiptext: gSync.formatLastSyncDate(new Date(lastModifiedFixture * 1000))
             },
           });
         }
         expectedItems.push(
           null,
           {
             attrs: {
               label: "Send to All Devices"
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -560,36 +560,17 @@ if (Services.prefs.getBoolPref("identity
     deckIndices: {
       DECKINDEX_TABS: 0,
       DECKINDEX_TABSDISABLED: 1,
       DECKINDEX_FETCHING: 2,
       DECKINDEX_NOCLIENTS: 3,
     },
     TABS_PER_PAGE: 25,
     NEXT_PAGE_MIN_TABS: 5, // Minimum number of tabs displayed when we click "Show All"
-    onCreated(aNode) {
-      this._initialize(aNode);
-    },
-    _initialize(aNode) {
-      if (this._initialized) {
-        return;
-      }
-      // Add an observer to the button so we get the animation during sync.
-      // (Note the observer sets many attributes, including label and
-      // tooltiptext, but we only want the 'syncstatus' attribute for the
-      // animation)
-      let doc = aNode.ownerDocument;
-      let obnode = doc.createElementNS(kNSXUL, "observes");
-      obnode.setAttribute("element", "sync-status");
-      obnode.setAttribute("attribute", "syncstatus");
-      aNode.appendChild(obnode);
-      this._initialized = true;
-    },
     onViewShowing(aEvent) {
-      this._initialize(aEvent.target);
       let doc = aEvent.target.ownerDocument;
       this._tabsList = doc.getElementById("PanelUI-remotetabs-tabslist");
       Services.obs.addObserver(this, SyncedTabs.TOPIC_TABS_CHANGED);
 
       if (SyncedTabs.isConfiguredToSyncTabs) {
         if (SyncedTabs.hasSyncedThisSession) {
           this.setDeckIndex(this.deckIndices.DECKINDEX_TABS);
         } else {
--- a/browser/components/customizableui/content/panelUI.inc.xul
+++ b/browser/components/customizableui/content/panelUI.inc.xul
@@ -194,16 +194,17 @@
           </hbox>
           <toolbarseparator orient="vertical"/>
           <toolbarbutton id="appMenu-fxa-icon"
                          class="subviewbutton subviewbutton-iconic"
                          oncommand="gSync.doSync();"
                          closemenu="none">
             <observes element="sync-status" attribute="syncstatus"/>
             <observes element="sync-status" attribute="tooltiptext"/>
+            <observes element="sync-status" attribute="onmouseover"/>
           </toolbarbutton>
         </toolbaritem>
         <toolbarseparator class="sync-ui-item"/>
         <toolbarbutton id="appMenu-new-window-button"
                        class="subviewbutton subviewbutton-iconic"
                        label="&newNavigatorCmd.label;"
                        key="key_newNavigator"
                        command="cmd_newNavigator"/>
--- a/browser/components/customizableui/test/browser_remote_tabs_button.js
+++ b/browser/components/customizableui/test/browser_remote_tabs_button.js
@@ -65,16 +65,17 @@ add_task(async function asyncCleanup() {
 
   restoreValues();
 });
 
 function mockFunctions() {
   // mock UIState.get()
   UIState.get = () => ({
     status: UIState.STATUS_SIGNED_IN,
+    lastSync: new Date(),
     email: "user@mozilla.com"
   });
 
   service.sync = mocked_sync;
 }
 
 function mocked_sync() {
   syncWasCalled = true;
--- a/browser/components/customizableui/test/browser_synced_tabs_menu.js
+++ b/browser/components/customizableui/test/browser_synced_tabs_menu.js
@@ -154,17 +154,18 @@ add_task(asyncCleanup);
 // When Sync is configured in a "needs reauthentication" state.
 add_task(async function() {
   gSync.updateAllUI({ status: UIState.STATUS_LOGIN_FAILED, email: "foo@bar.com" });
   await openPrefsFromMenuPanel("PanelUI-remotetabs-reauthsync", "synced-tabs");
 });
 
 // Test the Connect Another Device button
 add_task(async function() {
-  gSync.updateAllUI({ status: UIState.STATUS_SIGNED_IN, email: "foo@bar.com" });
+  gSync.updateAllUI({ status: UIState.STATUS_SIGNED_IN, email: "foo@bar.com",
+                      lastSync: new Date() });
 
   let button = document.getElementById("PanelUI-remotetabs-connect-device-button");
   ok(button, "found the button");
 
   await document.getElementById("nav-bar").overflowable.show();
   let expectedUrl = "https://example.com/connect_another_device?service=sync&context=" +
                     "fx_desktop_v3&entrypoint=synced-tabs&uid=uid&email=foo%40bar.com";
   let promiseTabOpened = BrowserTestUtils.waitForNewTab(gBrowser, expectedUrl);
@@ -173,17 +174,18 @@ add_task(async function() {
   ok(!isOverflowOpen(), "click closed the panel");
   await promiseTabOpened;
 
   gBrowser.removeTab(gBrowser.selectedTab);
 });
 
 // Test the "Sync Now" button
 add_task(async function() {
-  gSync.updateAllUI({ status: UIState.STATUS_SIGNED_IN, email: "foo@bar.com" });
+  gSync.updateAllUI({ status: UIState.STATUS_SIGNED_IN, email: "foo@bar.com",
+                      lastSync: new Date() });
 
   await document.getElementById("nav-bar").overflowable.show();
   let tabsUpdatedPromise = promiseObserverNotified("synced-tabs-menu:test:tabs-updated");
   let syncPanel = document.getElementById("PanelUI-remotetabs");
   let viewShownPromise = BrowserTestUtils.waitForEvent(syncPanel, "ViewShown");
   let syncButton = document.getElementById("sync-button");
   syncButton.click();
   await Promise.all([tabsUpdatedPromise, viewShownPromise]);
@@ -336,17 +338,18 @@ add_task(async function() {
             allTabsDesktop.push({ title: "Tab #" + i });
           }
           return allTabsDesktop;
         }(),
       }
     ]);
   };
 
-  gSync.updateAllUI({ status: UIState.STATUS_SIGNED_IN, email: "foo@bar.com" });
+  gSync.updateAllUI({ status: UIState.STATUS_SIGNED_IN, lastSync: new Date(),
+                      email: "foo@bar.com" });
 
   await document.getElementById("nav-bar").overflowable.show();
   let tabsUpdatedPromise = promiseObserverNotified("synced-tabs-menu:test:tabs-updated");
   let syncPanel = document.getElementById("PanelUI-remotetabs");
   let viewShownPromise = BrowserTestUtils.waitForEvent(syncPanel, "ViewShown");
   let syncButton = document.getElementById("sync-button");
   syncButton.click();
   await Promise.all([tabsUpdatedPromise, viewShownPromise]);
--- a/browser/components/enterprisepolicies/Policies.jsm
+++ b/browser/components/enterprisepolicies/Policies.jsm
@@ -261,22 +261,27 @@ var Policies = {
   "DontCheckDefaultBrowser": {
     onBeforeUIStartup(manager, param) {
       setAndLockPref("browser.shell.checkDefaultBrowser", false);
     }
   },
 
   "EnableTrackingProtection": {
     onBeforeUIStartup(manager, param) {
-      if (param.Locked) {
-        setAndLockPref("privacy.trackingprotection.enabled", param.Value);
-        setAndLockPref("privacy.trackingprotection.pbmode.enabled", param.Value);
+      if (param.Value) {
+        if (param.Locked) {
+          setAndLockPref("privacy.trackingprotection.enabled", true);
+          setAndLockPref("privacy.trackingprotection.pbmode.enabled", true);
+        } else {
+          setDefaultPref("privacy.trackingprotection.enabled", true);
+          setDefaultPref("privacy.trackingprotection.pbmode.enabled", true);
+        }
       } else {
-        setDefaultPref("privacy.trackingprotection.enabled", param.Value);
-        setDefaultPref("privacy.trackingprotection.pbmode.enabled", param.Value);
+        setAndLockPref("privacy.trackingprotection.enabled", false);
+        setAndLockPref("privacy.trackingprotection.pbmode.enabled", false);
       }
     }
   },
 
   "FlashPlugin": {
     onBeforeUIStartup(manager, param) {
       addAllowDenyPermissions("plugin:flash", param.Allow, param.Block);
     }
--- a/browser/components/syncedtabs/TabListView.js
+++ b/browser/components/syncedtabs/TabListView.js
@@ -126,21 +126,30 @@ TabListView.prototype = {
   // Client rows are hidden when the list is filtered
   _renderFilteredClient(client, filter) {
     client.tabs.forEach((tab, index) => {
       let node = this._renderTab(client, tab, index);
       this.list.appendChild(node);
     });
   },
 
+  _updateLastSyncTitle(lastModified, itemNode) {
+    let lastSync = new Date(lastModified);
+    let lastSyncTitle = getChromeWindow(this._window).gSync.formatLastSyncDate(lastSync);
+    itemNode.setAttribute("title", lastSyncTitle);
+  },
+
   _renderClient(client) {
     let itemNode = client.tabs.length ?
                     this._createClient(client) :
                     this._createEmptyClient(client);
 
+    itemNode.addEventListener("mouseover", () =>
+      this._updateLastSyncTitle(client.lastModified, itemNode));
+
     this._updateClient(client, itemNode);
 
     let tabsList = itemNode.querySelector(".item-tabs-list");
     client.tabs.forEach((tab, index) => {
       let node = this._renderTab(client, tab, index);
       tabsList.appendChild(node);
     });
 
@@ -149,25 +158,25 @@ TabListView.prototype = {
   },
 
   _renderTab(client, tab, index) {
     let itemNode = this._createTab(tab);
     this._updateTab(tab, itemNode, index);
     return itemNode;
   },
 
-  _createClient(item) {
+  _createClient() {
     return this._doc.importNode(this._clientTemplate.content, true).firstElementChild;
   },
 
-  _createEmptyClient(item) {
+  _createEmptyClient() {
     return this._doc.importNode(this._emptyClientTemplate.content, true).firstElementChild;
   },
 
-  _createTab(item) {
+  _createTab() {
     return this._doc.importNode(this._tabTemplate.content, true).firstElementChild;
   },
 
   _clearChilden(node) {
     let parent = node || this.container;
     while (parent.firstChild) {
       parent.firstChild.remove();
     }
@@ -206,19 +215,17 @@ TabListView.prototype = {
   /**
    * Update the element representing an item, ensuring it's in sync with the
    * underlying data.
    * @param {client} item - Item to use as a source.
    * @param {Element} itemNode - Element to update.
    */
   _updateClient(item, itemNode) {
     itemNode.setAttribute("id", "item-" + item.id);
-    let lastSync = new Date(item.lastModified);
-    let lastSyncTitle = getChromeWindow(this._window).gSync.formatLastSyncDate(lastSync);
-    itemNode.setAttribute("title", lastSyncTitle);
+    this._updateLastSyncTitle(item.lastModified, itemNode);
     if (item.closed) {
       itemNode.classList.add("closed");
     } else {
       itemNode.classList.remove("closed");
     }
     if (item.selected) {
       itemNode.classList.add("selected");
     } else {
--- a/browser/components/uitour/test/browser_fxa.js
+++ b/browser/components/uitour/test/browser_fxa.js
@@ -31,17 +31,17 @@ var tests = [
     let highlight = document.getElementById("UITourHighlightContainer");
     is(highlight.getAttribute("targetName"), "accountStatus", "Correct highlight target");
   }),
 
   taskify(async function test_highlight_accountStatus_loggedIn() {
     await setSignedInUser();
     let userData = await fxAccounts.getSignedInUser();
     isnot(userData, null, "Logged in now");
-    gSync.updateAllUI({ status: UIState.STATUS_SIGNED_IN, email: "foo@example.com" });
+    gSync.updateAllUI({ status: UIState.STATUS_SIGNED_IN, lastSync: new Date(), email: "foo@example.com" });
     await showMenuPromise("appMenu");
     await showHighlightPromise("accountStatus");
     let highlight = document.getElementById("UITourHighlightContainer");
     let expectedTarget = "appMenu-fxa-avatar";
     is(highlight.popupBoxObject.anchorNode.id, expectedTarget, "Anchored on avatar");
     is(highlight.getAttribute("targetName"), "accountStatus", "Correct highlight target");
   }),
 ];
--- a/browser/modules/AsyncTabSwitcher.jsm
+++ b/browser/modules/AsyncTabSwitcher.jsm
@@ -102,20 +102,18 @@ class AsyncTabSwitcher {
 
     // Set of tabs that might be visible right now. We maintain
     // this set because we can't be sure when a tab is actually
     // drawn. A tab is added to this set when we ask to make it
     // visible. All tabs but the most recently shown tab are
     // removed from the set upon MozAfterPaint.
     this.maybeVisibleTabs = new Set([tabbrowser.selectedTab]);
 
-    // This holds onto the set of tabs that we've been asked to warm up.
-    // This is used only for Telemetry and logging, and (in order to not
-    // over-complicate the async tab switcher any further) has nothing to do
-    // with how warmed tabs are loaded and unloaded.
+    // This holds onto the set of tabs that we've been asked to warm up,
+    // and tabs are evicted once they're done loading or are unloaded.
     this.warmingTabs = new WeakSet();
 
     this.STATE_UNLOADED = 0;
     this.STATE_LOADING = 1;
     this.STATE_LOADED = 2;
     this.STATE_UNLOADING = 3;
 
     // re-entrancy guard:
@@ -837,34 +835,39 @@ class AsyncTabSwitcher {
     if (this.minimizedOrFullyOccluded ||
         !tab.linkedPanel ||
         tab.closing ||
         !tab.linkedBrowser.isRemoteBrowser ||
         !tab.linkedBrowser.frameLoader.tabParent) {
       return false;
     }
 
-    // Similarly, if the tab is already in STATE_LOADING or
-    // STATE_LOADED somehow, there's no point in trying to
-    // warm it up.
-    let state = this.getTabState(tab);
-    if (state === this.STATE_LOADING ||
-      state === this.STATE_LOADED) {
-      return false;
+    return true;
+  }
+
+  shouldWarmTab(tab) {
+    if (this.canWarmTab(tab)) {
+      // Tabs that are already in STATE_LOADING or STATE_LOADED
+      // have no need to be warmed up.
+      let state = this.getTabState(tab);
+      if (state === this.STATE_UNLOADING ||
+          state === this.STATE_UNLOADED) {
+        return true;
+      }
     }
 
-    return true;
+    return false;
   }
 
   unwarmTab(tab) {
     this.warmingTabs.delete(tab);
   }
 
   warmupTab(tab) {
-    if (!this.canWarmTab(tab)) {
+    if (!this.shouldWarmTab(tab)) {
       return;
     }
 
     this.logState("warmupTab " + this.tinfo(tab));
 
     this.warmingTabs.add(tab);
     this.setTabState(tab, this.STATE_LOADING);
     this.suppressDisplayPortAndQueueUnload(tab,
@@ -875,25 +878,31 @@ class AsyncTabSwitcher {
   requestTab(tab) {
     if (tab === this.requestedTab) {
       return;
     }
 
     if (this.tabbrowser.tabWarmingEnabled) {
       let warmingState = "disqualified";
 
-      if (this.warmingTabs.has(tab)) {
+      if (this.canWarmTab(tab)) {
         let tabState = this.getTabState(tab);
         if (tabState == this.STATE_LOADING) {
           warmingState = "stillLoading";
         } else if (tabState == this.STATE_LOADED) {
           warmingState = "loaded";
+        } else if (tabState == this.STATE_UNLOADING ||
+                   tabState == this.STATE_UNLOADED) {
+          // At this point, if the tab's browser was being inserted
+          // lazily, we never had a chance to warm it up, and unfortunately
+          // there's no great way to detect that case. Those cases will
+          // end up in the "notWarmed" bucket, along with legitimate cases
+          // where tabs could have been warmed but weren't.
+          warmingState = "notWarmed";
         }
-      } else if (this.canWarmTab(tab)) {
-        warmingState = "notWarmed";
       }
 
       Services.telemetry
         .getHistogramById("FX_TAB_SWITCH_REQUEST_TAB_WARMING_STATE")
         .add(warmingState);
     }
 
     this._requestingTab = true;
--- a/build/clang-plugin/Makefile.in
+++ b/build/clang-plugin/Makefile.in
@@ -8,20 +8,16 @@ include $(topsrcdir)/config/config.mk
 # variable to limit ourselves to what we need to build the clang plugin.
 ifneq ($(HOST_OS_ARCH),WINNT)
 DSO_LDOPTS := -shared
 endif
 
 ifeq ($(HOST_OS_ARCH)_$(OS_ARCH),Linux_Darwin)
 # Use the host compiler instead of the target compiler.
 CXX := $(HOST_CXX)
-# expandlibs doesn't know the distinction between host and target toolchains,
-# and on cross linux/darwin builds, the options to give to the linker for file
-# lists differ between both, so don't use file lists.
-EXPAND_MKSHLIB_ARGS :=
 endif
 
 # Use the default OS X deployment target to enable using the libc++ headers
 # correctly.  Note that the binary produced here is a host tool and doesn't need
 # to be distributed.
 MACOSX_DEPLOYMENT_TARGET :=
 
 # Temporarily relax the requirements for libstdc++ symbol versions on static
--- a/config/config.mk
+++ b/config/config.mk
@@ -413,28 +413,16 @@ ifdef MOZ_DEBUG
 JAVAC_FLAGS += -g
 endif
 
 CREATE_PRECOMPLETE_CMD = $(PYTHON) $(abspath $(MOZILLA_DIR)/config/createprecomplete.py)
 
 # MDDEPDIR is the subdirectory where dependency files are stored
 MDDEPDIR := .deps
 
-EXPAND_LIBS_EXEC = $(PYTHON) $(MOZILLA_DIR)/config/expandlibs_exec.py
-EXPAND_LIBS_GEN = $(PYTHON) $(MOZILLA_DIR)/config/expandlibs_gen.py
-EXPAND_AR = $(EXPAND_LIBS_EXEC) --extract -- $(AR)
-EXPAND_CC = $(EXPAND_LIBS_EXEC) --uselist -- $(CC)
-EXPAND_CCC = $(EXPAND_LIBS_EXEC) --uselist -- $(CCC)
-EXPAND_LINK = $(EXPAND_LIBS_EXEC) --uselist -- $(LINKER)
-EXPAND_MKSHLIB_ARGS = --uselist
-ifdef SYMBOL_ORDER
-EXPAND_MKSHLIB_ARGS += --symbol-order $(SYMBOL_ORDER)
-endif
-EXPAND_MKSHLIB = $(EXPAND_LIBS_EXEC) $(EXPAND_MKSHLIB_ARGS) -- $(MKSHLIB)
-
 # $(call CHECK_SYMBOLS,lib,PREFIX,dep_name,test)
 # Checks that the given `lib` doesn't contain dependency on symbols with a
 # version starting with `PREFIX`_ and matching the `test`. `dep_name` is only
 # used for the error message.
 # `test` is an awk expression using the information in the variable `v` which
 # contains a list of version items ([major, minor, ...]).
 define CHECK_SYMBOLS
 @$(TOOLCHAIN_PREFIX)readelf -sW $(1) | \
@@ -481,25 +469,28 @@ define CHECK_BINARY
 $(call LOCAL_CHECKS,$(1))
 $(call CHECK_MOZGLUE_ORDER,$(1))
 endef
 
 # autoconf.mk sets OBJ_SUFFIX to an error to avoid use before including
 # this file
 OBJ_SUFFIX := $(_OBJ_SUFFIX)
 
+OBJS_VAR_SUFFIX := OBJS
+
 # PGO builds with GCC build objects with instrumentation in a first pass,
 # then objects optimized, without instrumentation, in a second pass. If
 # we overwrite the objects from the first pass with those from the second,
 # we end up not getting instrumentation data for better optimization on
 # incremental builds. As a consequence, we use a different object suffix
 # for the first pass.
-ifndef NO_PROFILE_GUIDED_OPTIMIZE
 ifdef MOZ_PROFILE_GENERATE
 ifdef GNU_CC
+OBJS_VAR_SUFFIX := PGO_OBJS
+ifndef NO_PROFILE_GUIDED_OPTIMIZE
 OBJ_SUFFIX := i_o
 endif
 endif
 endif
 
 PLY_INCLUDE = -I$(MOZILLA_DIR)/other-licenses/ply
 
 export CL_INCLUDES_PREFIX
deleted file mode 100644
--- a/config/expandlibs.py
+++ /dev/null
@@ -1,143 +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/.
-
-'''Expandlibs is a system that allows to replace some libraries with a
-descriptor file containing some linking information about them.
-
-The descriptor file format is as follows:
----8<-----
-OBJS = a.o b.o ...
-LIBS = libfoo.a libbar.a ...
---->8-----
-
-(In the example above, OBJ_SUFFIX is o and LIB_SUFFIX is a).
-
-Expandlibs also canonicalizes how to pass libraries to the linker, such
-that only the ${LIB_PREFIX}${ROOT}.${LIB_SUFFIX} form needs to be used:
-given a list of files, expandlibs will replace items with the form
-${LIB_PREFIX}${ROOT}.${LIB_SUFFIX} following these rules:
-
-- If a ${DLL_PREFIX}${ROOT}.${DLL_SUFFIX} or
-  ${DLL_PREFIX}${ROOT}.${IMPORT_LIB_SUFFIX} file exists, use that instead
-- If the ${LIB_PREFIX}${ROOT}.${LIB_SUFFIX} file exists, use it
-- If a ${LIB_PREFIX}${ROOT}.${LIB_SUFFIX}.${LIB_DESC_SUFFIX} file exists,
-  replace ${LIB_PREFIX}${ROOT}.${LIB_SUFFIX} with the OBJS and LIBS the
-  descriptor contains. And for each of these LIBS, also apply the same
-  rules.
-'''
-from __future__ import with_statement
-import sys, os, errno
-import expandlibs_config as conf
-
-def ensureParentDir(file):
-    '''Ensures the directory parent to the given file exists'''
-    dir = os.path.dirname(file)
-    if dir and not os.path.exists(dir):
-        try:
-            os.makedirs(dir)
-        except OSError, error:
-            if error.errno != errno.EEXIST:
-                raise
-
-def relativize(path):
-    '''Returns a path relative to the current working directory, if it is
-    shorter than the given path'''
-    def splitpath(path):
-        dir, file = os.path.split(path)
-        if os.path.splitdrive(dir)[1] == os.sep:
-            return [file]
-        return splitpath(dir) + [file]
-
-    if not os.path.exists(path):
-        return path
-    curdir = splitpath(os.path.abspath(os.curdir))
-    abspath = splitpath(os.path.abspath(path))
-    while curdir and abspath and curdir[0] == abspath[0]:
-        del curdir[0]
-        del abspath[0]
-    if not curdir and not abspath:
-        return '.'
-    relpath = os.path.join(*[os.pardir for i in curdir] + abspath)
-    if len(path) > len(relpath):
-        return relpath
-    return path
-
-def isObject(path):
-    '''Returns whether the given path points to an object file, that is,
-    ends with OBJ_SUFFIX or .i_o'''
-    return os.path.splitext(path)[1] in [conf.OBJ_SUFFIX, '.i_o']
-
-def isDynamicLib(path):
-    '''Returns whether the given path points to a dynamic library, that is,
-    ends with DLL_SUFFIX.'''
-    # On mac, the xul library is named XUL, instead of libxul.dylib. Assume any
-    # file by that name is a dynamic library.
-    return os.path.splitext(path)[1] == conf.DLL_SUFFIX or os.path.basename(path) == 'XUL'
-
-class LibDescriptor(dict):
-    KEYS = ['OBJS', 'LIBS']
-
-    def __init__(self, content=None):
-        '''Creates an instance of a lib descriptor, initialized with contents
-        from a list of strings when given. This is intended for use with
-        file.readlines()'''
-        if isinstance(content, list) and all([isinstance(item, str) for item in content]):
-            pass
-        elif content is not None:
-            raise TypeError("LibDescriptor() arg 1 must be None or a list of strings")
-        super(LibDescriptor, self).__init__()
-        for key in self.KEYS:
-            self[key] = []
-        if not content:
-            return
-        for key, value in [(s.strip() for s in item.split('=', 2)) for item in content if item.find('=') >= 0]:
-            if key in self.KEYS:
-                self[key] = value.split()
-
-    def __str__(self):
-        '''Serializes the lib descriptor'''
-        return '\n'.join('%s = %s' % (k, ' '.join(self[k])) for k in self.KEYS if len(self[k]))
-
-class ExpandArgs(list):
-    def __init__(self, args):
-        '''Creates a clone of the |args| list and performs file expansion on
-        each item it contains'''
-        super(ExpandArgs, self).__init__()
-        self._descs = set()
-        for arg in args:
-            self += self._expand(arg)
-
-    def _expand(self, arg):
-        '''Internal function doing the actual work'''
-        (root, ext) = os.path.splitext(arg)
-        if ext != conf.LIB_SUFFIX or not os.path.basename(root).startswith(conf.LIB_PREFIX):
-            return [relativize(arg)]
-        if conf.LIB_PREFIX:
-            dll = root.replace(conf.LIB_PREFIX, conf.DLL_PREFIX, 1) + conf.DLL_SUFFIX
-        else:
-            dll = root + conf.DLL_SUFFIX
-        if os.path.exists(dll):
-            if conf.IMPORT_LIB_SUFFIX:
-                return [relativize(root + conf.IMPORT_LIB_SUFFIX)]
-            else:
-                return [relativize(dll)]
-        return self._expand_desc(arg)
-
-    def _expand_desc(self, arg):
-        '''Internal function taking care of lib descriptor expansion only'''
-        desc = os.path.abspath(arg + conf.LIBS_DESC_SUFFIX)
-        if os.path.exists(desc):
-            if desc in self._descs:
-                return []
-            self._descs.add(desc)
-            with open(desc, 'r') as f:
-                desc = LibDescriptor(f.readlines())
-            objs = [relativize(o) for o in desc['OBJS']]
-            for lib in desc['LIBS']:
-                objs += self._expand(lib)
-            return objs
-        return [relativize(arg)]
-
-if __name__ == '__main__':
-    print " ".join(ExpandArgs(sys.argv[1:]))
deleted file mode 100644
--- a/config/expandlibs_config.py
+++ /dev/null
@@ -1,29 +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/.
-
-from buildconfig import substs
-
-def normalize_suffix(suffix):
-    '''Returns a normalized suffix, i.e. ensures it starts with a dot and
-    doesn't starts or ends with whitespace characters'''
-    value = suffix.strip()
-    if len(value) and not value.startswith('.'):
-        value = '.' + value
-    return value
-
-# Variables from the build system
-AR = substs['AR']
-AR_EXTRACT = substs['AR_EXTRACT'].replace('$(AR)', AR)
-DLL_PREFIX = substs['DLL_PREFIX']
-LIB_PREFIX = substs['LIB_PREFIX']
-RUST_LIB_PREFIX = substs['RUST_LIB_PREFIX']
-OBJ_SUFFIX = normalize_suffix(substs['OBJ_SUFFIX'])
-LIB_SUFFIX = normalize_suffix(substs['LIB_SUFFIX'])
-RUST_LIB_SUFFIX = normalize_suffix(substs['RUST_LIB_SUFFIX'])
-DLL_SUFFIX = normalize_suffix(substs['DLL_SUFFIX'])
-IMPORT_LIB_SUFFIX = normalize_suffix(substs['IMPORT_LIB_SUFFIX'])
-LIBS_DESC_SUFFIX = normalize_suffix(substs['LIBS_DESC_SUFFIX'])
-EXPAND_LIBS_LIST_STYLE = substs['EXPAND_LIBS_LIST_STYLE']
-EXPAND_LIBS_ORDER_STYLE = substs['EXPAND_LIBS_ORDER_STYLE']
-LD_PRINT_ICF_SECTIONS = substs['LD_PRINT_ICF_SECTIONS']
deleted file mode 100644
--- a/config/expandlibs_exec.py
+++ /dev/null
@@ -1,354 +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/.
-
-'''expandlibs-exec.py applies expandlibs rules, and some more (see below) to
-a given command line, and executes that command line with the expanded
-arguments.
-
-With the --extract argument (useful for e.g. $(AR)), it extracts object files
-from static libraries (or use those listed in library descriptors directly).
-
-With the --uselist argument (useful for e.g. $(CC)), it replaces all object
-files with a list file. This can be used to avoid limitations in the length
-of a command line. The kind of list file format used depends on the
-EXPAND_LIBS_LIST_STYLE variable: 'list' for MSVC style lists (@file.list)
-or 'linkerscript' for GNU ld linker scripts.
-See https://bugzilla.mozilla.org/show_bug.cgi?id=584474#c59 for more details.
-
-With the --symbol-order argument, followed by a file name, it will add the
-relevant linker options to change the order in which the linker puts the
-symbols appear in the resulting binary. Only works for ELF targets.
-'''
-from __future__ import with_statement
-import sys
-import os
-from expandlibs import (
-    ExpandArgs,
-    relativize,
-    isDynamicLib,
-    isObject,
-)
-import expandlibs_config as conf
-from optparse import OptionParser
-import subprocess
-import tempfile
-import shutil
-import subprocess
-import re
-from mozbuild.makeutil import Makefile
-
-# The are the insert points for a GNU ld linker script, assuming a more
-# or less "standard" default linker script. This is not a dict because
-# order is important.
-SECTION_INSERT_BEFORE = [
-  ('.text', '.fini'),
-  ('.rodata', '.rodata1'),
-  ('.data.rel.ro', '.dynamic'),
-  ('.data', '.data1'),
-]
-
-class ExpandArgsMore(ExpandArgs):
-    ''' Meant to be used as 'with ExpandArgsMore(args) as ...: '''
-    def __enter__(self):
-        self.tmp = []
-        return self
-        
-    def __exit__(self, type, value, tb):
-        '''Automatically remove temporary files'''
-        for tmp in self.tmp:
-            if os.path.isdir(tmp):
-                shutil.rmtree(tmp, True)
-            else:
-                os.remove(tmp)
-
-    def extract(self):
-        self[0:] = self._extract(self)
-
-    def _extract(self, args):
-        '''When a static library name is found, either extract its contents
-        in a temporary directory or use the information found in the
-        corresponding lib descriptor.
-        '''
-        ar_extract = conf.AR_EXTRACT.split()
-        newlist = []
-
-        def lookup(base, f):
-            for root, dirs, files in os.walk(base):
-                if f in files:
-                    return os.path.join(root, f)
-
-        for arg in args:
-            if os.path.splitext(arg)[1] == conf.LIB_SUFFIX:
-                if os.path.exists(arg + conf.LIBS_DESC_SUFFIX):
-                    newlist += self._extract(self._expand_desc(arg))
-                    continue
-                elif os.path.exists(arg) and (len(ar_extract) or conf.AR == 'lib'):
-                    tmp = tempfile.mkdtemp(dir=os.curdir)
-                    self.tmp.append(tmp)
-                    if conf.AR == 'lib':
-                        out = subprocess.check_output([conf.AR, '-NOLOGO', '-LIST', arg])
-                        files = out.splitlines()
-                        # If lib -list returns a list full of dlls, it's an
-                        # import lib.
-                        if all(isDynamicLib(f) for f in files):
-                            newlist += [arg]
-                            continue
-                        for f in files:
-                            subprocess.call([conf.AR, '-NOLOGO', '-EXTRACT:%s' % f, os.path.abspath(arg)], cwd=tmp)
-                    else:
-                        subprocess.call(ar_extract + [os.path.abspath(arg)], cwd=tmp)
-                    objs = []
-                    basedir = os.path.dirname(arg)
-                    for root, dirs, files in os.walk(tmp):
-                        for f in files:
-                            if isObject(f):
-                                # If the file extracted from the library also
-                                # exists in the directory containing the
-                                # library, or one of its subdirectories, use
-                                # that instead.
-                                maybe_obj = lookup(os.path.join(basedir, os.path.relpath(root, tmp)), f)
-                                if maybe_obj:
-                                    objs.append(relativize(maybe_obj))
-                                else:
-                                    objs.append(relativize(os.path.join(root, f)))
-                    newlist += sorted(objs)
-                    continue
-            newlist += [arg]
-        return newlist
-
-    def makelist(self):
-        '''Replaces object file names with a temporary list file, using a
-        list format depending on the EXPAND_LIBS_LIST_STYLE variable
-        '''
-        objs = [o for o in self if isObject(o)]
-        if not len(objs): return
-        fd, tmp = tempfile.mkstemp(suffix=".list",dir=os.curdir)
-        if conf.EXPAND_LIBS_LIST_STYLE == "linkerscript":
-            content = ['INPUT("%s")\n' % obj for obj in objs]
-            ref = tmp
-        elif conf.EXPAND_LIBS_LIST_STYLE == "filelist":
-            content = ["%s\n" % obj for obj in objs]
-            ref = "-Wl,-filelist," + tmp
-        elif conf.EXPAND_LIBS_LIST_STYLE == "list":
-            content = ["%s\n" % obj for obj in objs]
-            ref = "@" + tmp
-        else:
-            os.close(fd)
-            os.remove(tmp)
-            return
-        self.tmp.append(tmp)
-        f = os.fdopen(fd, "w")
-        f.writelines(content)
-        f.close()
-        idx = self.index(objs[0])
-        newlist = self[0:idx] + [ref] + [os.path.normpath(item) for item in self[idx:] if item not in objs]
-        self[0:] = newlist
-
-    def _getFoldedSections(self):
-        '''Returns a dict about folded sections.
-        When section A and B are folded into section C, the dict contains:
-        { 'A': 'C',
-          'B': 'C',
-          'C': ['A', 'B'] }'''
-        if not conf.LD_PRINT_ICF_SECTIONS:
-            return {}
-
-        proc = subprocess.Popen(self + [conf.LD_PRINT_ICF_SECTIONS], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
-        (stdout, stderr) = proc.communicate()
-        result = {}
-        # gold's --print-icf-sections output looks like the following:
-        # ld: ICF folding section '.section' in file 'file.o'into '.section' in file 'file.o'
-        # In terms of words, chances are this will change in the future,
-        # especially considering "into" is misplaced. Splitting on quotes
-        # seems safer.
-        for l in stderr.split('\n'):
-            quoted = l.split("'")
-            if len(quoted) > 5 and quoted[1] != quoted[5]:
-                result[quoted[1]] = [quoted[5]]
-                if quoted[5] in result:
-                    result[quoted[5]].append(quoted[1])
-                else:
-                    result[quoted[5]] = [quoted[1]]
-        return result
-
-    def _getOrderedSections(self, ordered_symbols):
-        '''Given an ordered list of symbols, returns the corresponding list
-        of sections following the order.'''
-        if not conf.EXPAND_LIBS_ORDER_STYLE in ['linkerscript', 'section-ordering-file']:
-            raise Exception('EXPAND_LIBS_ORDER_STYLE "%s" is not supported' % conf.EXPAND_LIBS_ORDER_STYLE)
-        finder = SectionFinder([arg for arg in self if isObject(arg) or os.path.splitext(arg)[1] == conf.LIB_SUFFIX])
-        folded = self._getFoldedSections()
-        sections = set()
-        ordered_sections = []
-        for symbol in ordered_symbols:
-            symbol_sections = finder.getSections(symbol)
-            all_symbol_sections = []
-            for section in symbol_sections:
-                if section in folded:
-                    if isinstance(folded[section], str):
-                        section = folded[section]
-                    all_symbol_sections.append(section)
-                    all_symbol_sections.extend(folded[section])
-                else:
-                    all_symbol_sections.append(section)
-            for section in all_symbol_sections:
-                if not section in sections:
-                    ordered_sections.append(section)
-                    sections.add(section)
-        return ordered_sections
-
-    def orderSymbols(self, order):
-        '''Given a file containing a list of symbols, adds the appropriate
-        argument to make the linker put the symbols in that order.'''
-        with open(order) as file:
-            sections = self._getOrderedSections([l.strip() for l in file.readlines() if l.strip()])
-        split_sections = {}
-        linked_sections = [s[0] for s in SECTION_INSERT_BEFORE]
-        for s in sections:
-            for linked_section in linked_sections:
-                if s.startswith(linked_section):
-                    if linked_section in split_sections:
-                        split_sections[linked_section].append(s)
-                    else:
-                        split_sections[linked_section] = [s]
-                    break
-        content = []
-        # Order is important
-        linked_sections = [s for s in linked_sections if s in split_sections]
-
-        if conf.EXPAND_LIBS_ORDER_STYLE == 'section-ordering-file':
-            option = '-Wl,--section-ordering-file,%s'
-            content = sections
-            for linked_section in linked_sections:
-                content.extend(split_sections[linked_section])
-                content.append('%s.*' % linked_section)
-                content.append(linked_section)
-
-        elif conf.EXPAND_LIBS_ORDER_STYLE == 'linkerscript':
-            option = '-Wl,-T,%s'
-            section_insert_before = dict(SECTION_INSERT_BEFORE)
-            for linked_section in linked_sections:
-                content.append('SECTIONS {')
-                content.append('  %s : {' % linked_section)
-                content.extend('    *(%s)' % s for s in split_sections[linked_section])
-                content.append('  }')
-                content.append('}')
-                content.append('INSERT BEFORE %s' % section_insert_before[linked_section])
-        else:
-            raise Exception('EXPAND_LIBS_ORDER_STYLE "%s" is not supported' % conf.EXPAND_LIBS_ORDER_STYLE)
-
-        fd, tmp = tempfile.mkstemp(dir=os.curdir)
-        f = os.fdopen(fd, "w")
-        f.write('\n'.join(content)+'\n')
-        f.close()
-        self.tmp.append(tmp)
-        self.append(option % tmp)
-
-class SectionFinder(object):
-    '''Instances of this class allow to map symbol names to sections in
-    object files.'''
-
-    def __init__(self, objs):
-        '''Creates an instance, given a list of object files.'''
-        if not conf.EXPAND_LIBS_ORDER_STYLE in ['linkerscript', 'section-ordering-file']:
-            raise Exception('EXPAND_LIBS_ORDER_STYLE "%s" is not supported' % conf.EXPAND_LIBS_ORDER_STYLE)
-        self.mapping = {}
-        for obj in objs:
-            if not isObject(obj) and os.path.splitext(obj)[1] != conf.LIB_SUFFIX:
-                raise Exception('%s is not an object nor a static library' % obj)
-            for symbol, section in SectionFinder._getSymbols(obj):
-                sym = SectionFinder._normalize(symbol)
-                if sym in self.mapping:
-                    if not section in self.mapping[sym]:
-                        self.mapping[sym].append(section)
-                else:
-                    self.mapping[sym] = [section]
-
-    def getSections(self, symbol):
-        '''Given a symbol, returns a list of sections containing it or the
-        corresponding thunks. When the given symbol is a thunk, returns the
-        list of sections containing its corresponding normal symbol and the
-        other thunks for that symbol.'''
-        sym = SectionFinder._normalize(symbol)
-        if sym in self.mapping:
-            return self.mapping[sym]
-        return []
-
-    @staticmethod
-    def _normalize(symbol):
-        '''For normal symbols, return the given symbol. For thunks, return
-        the corresponding normal symbol.'''
-        if re.match('^_ZThn[0-9]+_', symbol):
-            return re.sub('^_ZThn[0-9]+_', '_Z', symbol)
-        return symbol
-
-    @staticmethod
-    def _getSymbols(obj):
-        '''Returns a list of (symbol, section) contained in the given object
-        file.'''
-        proc = subprocess.Popen(['objdump', '-t', obj], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
-        (stdout, stderr) = proc.communicate()
-        syms = []
-        for line in stdout.splitlines():
-            # Each line has the following format:
-            # <addr> [lgu!][w ][C ][W ][Ii ][dD ][FfO ] <section>\t<length> <symbol>
-            tmp = line.split(' ',1)
-            # This gives us ["<addr>", "[lgu!][w ][C ][W ][Ii ][dD ][FfO ] <section>\t<length> <symbol>"]
-            # We only need to consider cases where "<section>\t<length> <symbol>" is present,
-            # and where the [FfO] flag is either F (function) or O (object).
-            if len(tmp) > 1 and len(tmp[1]) > 6 and tmp[1][6] in ['O', 'F']:
-                tmp = tmp[1][8:].split()
-                # That gives us ["<section>","<length>", "<symbol>"]
-                syms.append((tmp[-1], tmp[0]))
-        return syms
-
-def print_command(out, args):
-    print >>out, "Executing: " + " ".join(args)
-    for tmp in [f for f in args.tmp if os.path.isfile(f)]:
-        print >>out, tmp + ":"
-        with open(tmp) as file:
-            print >>out, "".join(["    " + l for l in file.readlines()])
-    out.flush()
-
-def main(args, proc_callback=None):
-    parser = OptionParser()
-    parser.add_option("--extract", action="store_true", dest="extract",
-        help="when a library has no descriptor file, extract it first, when possible")
-    parser.add_option("--uselist", action="store_true", dest="uselist",
-        help="use a list file for objects when executing a command")
-    parser.add_option("--verbose", action="store_true", dest="verbose",
-        help="display executed command and temporary files content")
-    parser.add_option("--symbol-order", dest="symbol_order", metavar="FILE",
-        help="use the given list of symbols to order symbols in the resulting binary when using with a linker")
-
-    (options, args) = parser.parse_args(args)
-
-    with ExpandArgsMore(args) as args:
-        if options.extract:
-            args.extract()
-        if options.symbol_order:
-            args.orderSymbols(options.symbol_order)
-        if options.uselist:
-            args.makelist()
-
-        if options.verbose:
-            print_command(sys.stderr, args)
-        try:
-            proc = subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
-            if proc_callback:
-                proc_callback(proc)
-        except Exception, e:
-            print >>sys.stderr, 'error: Launching', args, ':', e
-            raise e
-        (stdout, stderr) = proc.communicate()
-        if proc.returncode and not options.verbose:
-            print_command(sys.stderr, args)
-        sys.stderr.write(stdout)
-        sys.stderr.flush()
-        if proc.returncode:
-            return proc.returncode
-        return 0
-
-if __name__ == '__main__':
-    exit(main(sys.argv[1:]))
deleted file mode 100644
--- a/config/expandlibs_gen.py
+++ /dev/null
@@ -1,41 +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/.
-
-'''Given a list of object files and library names, prints a library
-descriptor to standard output'''
-
-from __future__ import with_statement
-import sys
-import os
-import expandlibs_config as conf
-from expandlibs import LibDescriptor, isObject, ensureParentDir
-from optparse import OptionParser
-
-def generate(args):
-    desc = LibDescriptor()
-    for arg in args:
-        if isObject(arg):
-            if os.path.exists(arg):
-                desc['OBJS'].append(os.path.abspath(arg))
-            else:
-                raise Exception("File not found: %s" % arg)
-        elif os.path.splitext(arg)[1] == conf.LIB_SUFFIX:
-            if os.path.exists(arg) or os.path.exists(arg + conf.LIBS_DESC_SUFFIX):
-                desc['LIBS'].append(os.path.abspath(arg))
-            else:
-                raise Exception("File not found: %s" % arg)
-    return desc
-
-if __name__ == '__main__':
-    parser = OptionParser()
-    parser.add_option("-o", dest="output", metavar="FILE",
-        help="send output to the given file")
-
-    (options, args) = parser.parse_args()
-    if not options.output:
-        raise Exception("Missing option: -o")
-
-    ensureParentDir(options.output)
-    with open(options.output, 'w') as outfile:
-        print >>outfile, generate(args)
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -95,38 +95,22 @@ endif # ENABLE_TESTS
 # Library rules
 #
 # If FORCE_STATIC_LIB is set, build a static library.
 # Otherwise, build a shared library.
 #
 
 ifndef LIBRARY
 ifdef REAL_LIBRARY
-# Don't build actual static library if a shared library is also built
-ifdef FORCE_SHARED_LIB
-# ... except when we really want one
 ifdef NO_EXPAND_LIBS
+# Only build actual library if it is requested.
 LIBRARY			:= $(REAL_LIBRARY)
-else
-LIBRARY			:= $(REAL_LIBRARY).$(LIBS_DESC_SUFFIX)
-endif
-else
-# Only build actual library if it is installed in DIST/lib
-ifeq (,$(DIST_INSTALL)$(NO_EXPAND_LIBS))
-LIBRARY			:= $(REAL_LIBRARY).$(LIBS_DESC_SUFFIX)
-else
-ifdef NO_EXPAND_LIBS
-LIBRARY			:= $(REAL_LIBRARY)
-else
-LIBRARY			:= $(REAL_LIBRARY) $(REAL_LIBRARY).$(LIBS_DESC_SUFFIX)
 endif
 endif
 endif
-endif # REAL_LIBRARY
-endif # LIBRARY
 
 ifndef HOST_LIBRARY
 ifdef HOST_LIBRARY_NAME
 HOST_LIBRARY		:= $(LIB_PREFIX)$(HOST_LIBRARY_NAME).$(LIB_SUFFIX)
 endif
 endif
 
 ifdef FORCE_SHARED_LIB
@@ -441,32 +425,35 @@ ECHO := true
 QUIET := -q
 endif
 
 # Do everything from scratch
 everything::
 	$(MAKE) clean
 	$(MAKE) all
 
-STATIC_LIB_DEP = $(if $(wildcard $(1).$(LIBS_DESC_SUFFIX)),$(1).$(LIBS_DESC_SUFFIX),$(1))
-STATIC_LIBS_DEPS := $(foreach l,$(STATIC_LIBS),$(call STATIC_LIB_DEP,$(l)))
-
 # Dependencies which, if modified, should cause everything to rebuild
 GLOBAL_DEPS += Makefile $(addprefix $(DEPTH)/config/,$(INCLUDED_AUTOCONF_MK)) $(MOZILLA_DIR)/config/config.mk
 
 ##############################################
 ifdef COMPILE_ENVIRONMENT
 OBJ_TARGETS = $(OBJS) $(PROGOBJS) $(HOST_OBJS) $(HOST_PROGOBJS)
 
 compile:: host target
 
 host:: $(HOST_LIBRARY) $(HOST_PROGRAM) $(HOST_SIMPLE_PROGRAMS) $(HOST_RUST_PROGRAMS) $(HOST_RUST_LIBRARY_FILE)
 
 target:: $(LIBRARY) $(SHARED_LIBRARY) $(PROGRAM) $(SIMPLE_PROGRAMS) $(RUST_LIBRARY_FILE) $(RUST_PROGRAMS)
 
+ifndef LIBRARY
+ifdef OBJS
+target:: $(OBJS)
+endif
+endif
+
 syms::
 
 include $(MOZILLA_DIR)/config/makefiles/target_binaries.mk
 endif
 
 ##############################################
 ifneq (1,$(NO_PROFILE_GUIDED_OPTIMIZE))
 ifdef MOZ_PROFILE_USE
@@ -540,28 +527,28 @@ distclean::
 	$(wildcard *.$(LIB_SUFFIX)) $(wildcard *$(DLL_SUFFIX)) \
 	$(wildcard *.$(IMPORT_LIB_SUFFIX))
 
 alltags:
 	$(RM) TAGS
 	find $(topsrcdir) -name dist -prune -o \( -name '*.[hc]' -o -name '*.cp' -o -name '*.cpp' -o -name '*.idl' \) -print | $(TAG_PROGRAM)
 
 define EXPAND_CC_OR_CXX
-$(if $(PROG_IS_C_ONLY_$(1)),$(EXPAND_CC),$(EXPAND_CCC))
+$(if $(PROG_IS_C_ONLY_$(1)),$(CC),$(CCC))
 endef
 
 #
 # PROGRAM = Foo
 # creates OBJS, links with LIBS to create Foo
 #
-$(PROGRAM): $(PROGOBJS) $(STATIC_LIBS_DEPS) $(EXTRA_DEPS) $(RESFILE) $(GLOBAL_DEPS) $(call mkdir_deps,$(FINAL_TARGET))
+$(PROGRAM): $(PROGOBJS) $(STATIC_LIBS) $(EXTRA_DEPS) $(RESFILE) $(GLOBAL_DEPS) $(call mkdir_deps,$(FINAL_TARGET))
 	$(REPORT_BUILD)
 	@$(RM) $@.manifest
 ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
-	$(EXPAND_LINK) -NOLOGO -OUT:$@ -PDB:$(LINK_PDBFILE) -IMPLIB:$(basename $(@F)).lib $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_PROGRAM_LDFLAGS) $(PROGOBJS) $(RESFILE) $(STATIC_LIBS) $(SHARED_LIBS) $(OS_LIBS)
+	$(LINKER) -NOLOGO -OUT:$@ -PDB:$(LINK_PDBFILE) -IMPLIB:$(basename $(@F)).lib $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_PROGRAM_LDFLAGS) $($(notdir $@)_$(OBJS_VAR_SUFFIX)) $(RESFILE) $(STATIC_LIBS) $(SHARED_LIBS) $(OS_LIBS)
 ifdef MSMANIFEST_TOOL
 	@if test -f $@.manifest; then \
 		if test -f '$(srcdir)/$(notdir $@).manifest'; then \
 			echo 'Embedding manifest from $(srcdir)/$(notdir $@).manifest and $@.manifest'; \
 			$(MT) -NOLOGO -MANIFEST '$(win_srcdir)/$(notdir $@).manifest' $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		else \
 			echo 'Embedding manifest from $@.manifest'; \
 			$(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
@@ -572,140 +559,133 @@ ifdef MSMANIFEST_TOOL
 	fi
 endif	# MSVC with manifest tool
 ifdef MOZ_PROFILE_GENERATE
 # touch it a few seconds into the future to work around FAT's
 # 2-second granularity
 	touch -t `date +%Y%m%d%H%M.%S -d 'now+5seconds'` pgo.relink
 endif
 else # !WINNT || GNU_CC
-	$(call EXPAND_CC_OR_CXX,$@) -o $@ $(COMPUTED_CXX_LDFLAGS) $(PGO_CFLAGS) $(PROGOBJS) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(STATIC_LIBS) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(OS_LIBS)
+	$(call EXPAND_CC_OR_CXX,$@) -o $@ $(COMPUTED_CXX_LDFLAGS) $(PGO_CFLAGS) $($(notdir $@)_$(OBJS_VAR_SUFFIX)) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(STATIC_LIBS) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(OS_LIBS)
 	$(call CHECK_BINARY,$@)
 endif # WINNT && !GNU_CC
 
 ifdef ENABLE_STRIP
 	$(STRIP) $(STRIP_FLAGS) $@
 endif
 ifdef MOZ_POST_PROGRAM_COMMAND
 	$(MOZ_POST_PROGRAM_COMMAND) $@
 endif
 
 $(HOST_PROGRAM): $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_DEPS) $(GLOBAL_DEPS)
 	$(REPORT_BUILD)
 ifeq (_WINNT,$(GNU_CC)_$(HOST_OS_ARCH))
-	$(EXPAND_LIBS_EXEC) -- $(LINKER) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $(HOST_OBJS) $(WIN32_EXE_LDFLAGS) $(HOST_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+	$(LINKER) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $(HOST_OBJS) $(WIN32_EXE_LDFLAGS) $(HOST_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 ifdef MSMANIFEST_TOOL
 	@if test -f $@.manifest; then \
 		if test -f '$(srcdir)/$@.manifest'; then \
 			echo 'Embedding manifest from $(srcdir)/$@.manifest and $@.manifest'; \
 			$(MT) -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		else \
 			echo 'Embedding manifest from $@.manifest'; \
 			$(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		fi; \
 	elif test -f '$(srcdir)/$@.manifest'; then \
 		echo 'Embedding manifest from $(srcdir)/$@.manifest'; \
 		$(MT) -NOLOGO -MANIFEST '$(win_srcdir)/$@.manifest' -OUTPUTRESOURCE:$@\;1; \
 	fi
 endif	# MSVC with manifest tool
 else
 ifeq ($(HOST_CPP_PROG_LINK),1)
-	$(EXPAND_LIBS_EXEC) -- $(HOST_CXX) -o $@ $(HOST_CXX_LDFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+	$(HOST_CXX) -o $@ $(HOST_CXX_LDFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 else
-	$(EXPAND_LIBS_EXEC) -- $(HOST_CC) -o $@ $(HOST_C_LDFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+	$(HOST_CC) -o $@ $(HOST_C_LDFLAGS) $(HOST_LDFLAGS) $(HOST_PROGOBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 endif # HOST_CPP_PROG_LINK
 endif
 ifndef CROSS_COMPILE
 	$(call CHECK_STDCXX,$@)
 endif
 
 #
 # This is an attempt to support generation of multiple binaries
 # in one directory, it assumes everything to compile Foo is in
 # Foo.o (from either Foo.c or Foo.cpp).
 #
 # SIMPLE_PROGRAMS = Foo Bar
 # creates Foo.o Bar.o, links with LIBS to create Foo, Bar.
 #
-$(SIMPLE_PROGRAMS): %$(BIN_SUFFIX): %.$(OBJ_SUFFIX) $(STATIC_LIBS_DEPS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
+$(SIMPLE_PROGRAMS): %$(BIN_SUFFIX): %.$(OBJ_SUFFIX) $(STATIC_LIBS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
 	$(REPORT_BUILD)
 ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
-	$(EXPAND_LINK) -nologo -out:$@ -pdb:$(LINK_PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_PROGRAM_LDFLAGS) $(STATIC_LIBS) $(SHARED_LIBS) $(OS_LIBS)
+	$(LINKER) -nologo -out:$@ -pdb:$(LINK_PDBFILE) $($@_$(OBJS_VAR_SUFFIX)) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(MOZ_PROGRAM_LDFLAGS) $(STATIC_LIBS) $(SHARED_LIBS) $(OS_LIBS)
 ifdef MSMANIFEST_TOOL
 	@if test -f $@.manifest; then \
 		$(MT) -NOLOGO -MANIFEST $@.manifest -OUTPUTRESOURCE:$@\;1; \
 		rm -f $@.manifest; \
 	fi
 endif	# MSVC with manifest tool
 else
-	$(call EXPAND_CC_OR_CXX,$@) $(COMPUTED_CXX_LDFLAGS) $(PGO_CFLAGS) -o $@ $< $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(STATIC_LIBS) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(OS_LIBS)
+	$(call EXPAND_CC_OR_CXX,$@) $(COMPUTED_CXX_LDFLAGS) $(PGO_CFLAGS) -o $@ $($@_$(OBJS_VAR_SUFFIX)) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(STATIC_LIBS) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(OS_LIBS)
 	$(call CHECK_BINARY,$@)
 endif # WINNT && !GNU_CC
 
 ifdef ENABLE_STRIP
 	$(STRIP) $(STRIP_FLAGS) $@
 endif
 ifdef MOZ_POST_PROGRAM_COMMAND
 	$(MOZ_POST_PROGRAM_COMMAND) $@
 endif
 
 $(HOST_SIMPLE_PROGRAMS): host_%$(HOST_BIN_SUFFIX): host_%.$(OBJ_SUFFIX) $(HOST_LIBS) $(HOST_EXTRA_DEPS) $(GLOBAL_DEPS)
 	$(REPORT_BUILD)
 ifeq (WINNT_,$(HOST_OS_ARCH)_$(GNU_CC))
-	$(EXPAND_LIBS_EXEC) -- $(LINKER) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+	$(LINKER) -NOLOGO -OUT:$@ -PDB:$(HOST_PDBFILE) $< $(WIN32_EXE_LDFLAGS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 else
 ifneq (,$(HOST_CPPSRCS)$(USE_HOST_CXX))
-	$(EXPAND_LIBS_EXEC) -- $(HOST_CXX) $(HOST_OUTOPTION)$@ $(HOST_CXX_LDFLAGS) $< $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+	$(HOST_CXX) $(HOST_OUTOPTION)$@ $(HOST_CXX_LDFLAGS) $< $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 else
-	$(EXPAND_LIBS_EXEC) -- $(HOST_CC) $(HOST_OUTOPTION)$@ $(HOST_C_LDFLAGS) $< $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+	$(HOST_CC) $(HOST_OUTOPTION)$@ $(HOST_C_LDFLAGS) $< $(HOST_LIBS) $(HOST_EXTRA_LIBS)
 endif
 endif
 ifndef CROSS_COMPILE
 	$(call CHECK_STDCXX,$@)
 endif
 
-$(filter %.$(LIB_SUFFIX),$(LIBRARY)): $(OBJS) $(STATIC_LIBS_DEPS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
+$(LIBRARY): $(OBJS) $(STATIC_LIBS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
 	$(REPORT_BUILD)
-# Always remove both library and library descriptor
-	$(RM) $(REAL_LIBRARY) $(REAL_LIBRARY).$(LIBS_DESC_SUFFIX)
-	$(EXPAND_AR) $(AR_FLAGS) $(OBJS) $(STATIC_LIBS)
-
-$(filter-out %.$(LIB_SUFFIX),$(LIBRARY)): $(filter %.$(LIB_SUFFIX),$(LIBRARY)) $(OBJS) $(STATIC_LIBS_DEPS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
-# When we only build a library descriptor, blow out any existing library
-	$(REPORT_BUILD)
-	$(if $(filter %.$(LIB_SUFFIX),$(LIBRARY)),,$(RM) $(REAL_LIBRARY))
-	$(EXPAND_LIBS_GEN) -o $@ $(OBJS) $(STATIC_LIBS)
+	$(RM) $(REAL_LIBRARY)
+	$(AR) $(AR_FLAGS) $(OBJS) $($@_$(OBJS_VAR_SUFFIX))
 
 ifeq ($(OS_ARCH),WINNT)
 # Import libraries are created by the rules creating shared libraries.
 # The rules to copy them to $(DIST)/lib depend on $(IMPORT_LIBRARY),
 # but make will happily consider the import library before it is refreshed
 # when rebuilding the corresponding shared library. Defining an empty recipe
 # for import libraries forces make to wait for the shared library recipe to
 # have run before considering other targets that depend on the import library.
 # See bug 795204.
 $(IMPORT_LIBRARY): $(SHARED_LIBRARY) ;
 endif
 
 $(HOST_LIBRARY): $(HOST_OBJS) Makefile
 	$(REPORT_BUILD)
 	$(RM) $@
-	$(EXPAND_LIBS_EXEC) --extract -- $(HOST_AR) $(HOST_AR_FLAGS) $(HOST_OBJS)
+	$(HOST_AR) $(HOST_AR_FLAGS) $(HOST_OBJS)
 
 # On Darwin (Mac OS X), dwarf2 debugging uses debug info left in .o files,
 # so instead of deleting .o files after repacking them into a dylib, we make
 # symlinks back to the originals. The symlinks are a no-op for stabs debugging,
 # so no need to conditionalize on OS version or debugging format.
 
-$(SHARED_LIBRARY): $(OBJS) $(RESFILE) $(RUST_STATIC_LIB_FOR_SHARED_LIB) $(STATIC_LIBS_DEPS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
+$(SHARED_LIBRARY): $(OBJS) $(RESFILE) $(RUST_STATIC_LIB_FOR_SHARED_LIB) $(STATIC_LIBS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
 	$(REPORT_BUILD)
 ifndef INCREMENTAL_LINKER
 	$(RM) $@
 endif
-	$(EXPAND_MKSHLIB) $(OBJS) $(RESFILE) $(LDFLAGS) $(STATIC_LIBS) $(RUST_STATIC_LIB_FOR_SHARED_LIB) $(SHARED_LIBS) $(EXTRA_DSO_LDOPTS) $(MOZ_GLUE_LDFLAGS) $(OS_LIBS)
+	$(MKSHLIB) $($@_$(OBJS_VAR_SUFFIX)) $(RESFILE) $(LDFLAGS) $(STATIC_LIBS) $(RUST_STATIC_LIB_FOR_SHARED_LIB) $(SHARED_LIBS) $(EXTRA_DSO_LDOPTS) $(MOZ_GLUE_LDFLAGS) $(OS_LIBS)
 	$(call CHECK_BINARY,$@)
 
 ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
 ifdef MSMANIFEST_TOOL
 ifdef EMBED_MANIFEST_AT
 	@if test -f $@.manifest; then \
 		if test -f '$(srcdir)/$@.manifest'; then \
 			echo 'Embedding manifest from $(srcdir)/$@.manifest and $@.manifest'; \
--- a/config/tests/python.ini
+++ b/config/tests/python.ini
@@ -1,5 +1,4 @@
 [test_mozbuild_reading.py]
-[unit-expandlibs.py]
 [unit-mozunit.py]
 [unit-nsinstall.py]
 [unit-printprereleasesuffix.py]
deleted file mode 100644
--- a/config/tests/unit-expandlibs.py
+++ /dev/null
@@ -1,431 +0,0 @@
-import subprocess
-import unittest
-import sys
-import os
-import imp
-from tempfile import mkdtemp
-from shutil import rmtree
-import mozunit
-
-from UserString import UserString
-# Create a controlled configuration for use by expandlibs
-config_win = {
-    'AR': 'lib',
-    'AR_EXTRACT': '',
-    'DLL_PREFIX': '',
-    'LIB_PREFIX': '',
-    'OBJ_SUFFIX': '.obj',
-    'LIB_SUFFIX': '.lib',
-    'DLL_SUFFIX': '.dll',
-    'IMPORT_LIB_SUFFIX': '.lib',
-    'LIBS_DESC_SUFFIX': '.desc',
-    'EXPAND_LIBS_LIST_STYLE': 'list',
-}
-config_unix = {
-    'AR': 'ar',
-    'AR_EXTRACT': 'ar -x',
-    'DLL_PREFIX': 'lib',
-    'LIB_PREFIX': 'lib',
-    'OBJ_SUFFIX': '.o',
-    'LIB_SUFFIX': '.a',
-    'DLL_SUFFIX': '.so',
-    'IMPORT_LIB_SUFFIX': '',
-    'LIBS_DESC_SUFFIX': '.desc',
-    'EXPAND_LIBS_LIST_STYLE': 'linkerscript',
-}
-
-config = sys.modules['expandlibs_config'] = imp.new_module('expandlibs_config')
-
-from expandlibs import LibDescriptor, ExpandArgs, relativize
-from expandlibs_gen import generate
-from expandlibs_exec import ExpandArgsMore, SectionFinder
-
-def Lib(name):
-    return config.LIB_PREFIX + name + config.LIB_SUFFIX
-
-def Obj(name):
-    return name + config.OBJ_SUFFIX
-
-def Dll(name):
-    return config.DLL_PREFIX + name + config.DLL_SUFFIX
-
-def ImportLib(name):
-    if not len(config.IMPORT_LIB_SUFFIX): return Dll(name)
-    return config.LIB_PREFIX + name + config.IMPORT_LIB_SUFFIX
-
-class TestRelativize(unittest.TestCase):
-    def test_relativize(self):
-        '''Test relativize()'''
-        os_path_exists = os.path.exists
-        def exists(path):
-            return True
-        os.path.exists = exists
-        self.assertEqual(relativize(os.path.abspath(os.curdir)), os.curdir)
-        self.assertEqual(relativize(os.path.abspath(os.pardir)), os.pardir)
-        self.assertEqual(relativize(os.path.join(os.curdir, 'a')), 'a')
-        self.assertEqual(relativize(os.path.join(os.path.abspath(os.curdir), 'a')), 'a')
-        # relativize is expected to return the absolute path if it is shorter
-        self.assertEqual(relativize(os.sep), os.sep)
-        os.path.exists = os.path.exists
-
-class TestLibDescriptor(unittest.TestCase):
-    def test_serialize(self):
-        '''Test LibDescriptor's serialization'''
-        desc = LibDescriptor()
-        desc[LibDescriptor.KEYS[0]] = ['a', 'b']
-        self.assertEqual(str(desc), "{0} = a b".format(LibDescriptor.KEYS[0]))
-        desc['unsupported-key'] = ['a']
-        self.assertEqual(str(desc), "{0} = a b".format(LibDescriptor.KEYS[0]))
-        desc[LibDescriptor.KEYS[1]] = ['c', 'd', 'e']
-        self.assertEqual(str(desc),
-                         "{0} = a b\n{1} = c d e"
-                         .format(LibDescriptor.KEYS[0], LibDescriptor.KEYS[1]))
-        desc[LibDescriptor.KEYS[0]] = []
-        self.assertEqual(str(desc), "{0} = c d e".format(LibDescriptor.KEYS[1]))
-
-    def test_read(self):
-        '''Test LibDescriptor's initialization'''
-        desc_list = ["# Comment",
-                     "{0} = a b".format(LibDescriptor.KEYS[1]),
-                     "", # Empty line
-                     "foo = bar", # Should be discarded
-                     "{0} = c d e".format(LibDescriptor.KEYS[0])]
-        desc = LibDescriptor(desc_list)
-        self.assertEqual(desc[LibDescriptor.KEYS[1]], ['a', 'b'])
-        self.assertEqual(desc[LibDescriptor.KEYS[0]], ['c', 'd', 'e'])
-        self.assertEqual(False, 'foo' in desc)
-
-def wrap_method(conf, wrapped_method):
-    '''Wrapper used to call a test with a specific configuration'''
-    def _method(self):
-        for key in conf:
-            setattr(config, key, conf[key])
-        self.init()
-        try:
-            wrapped_method(self)
-        except:
-            raise
-        finally:
-            self.cleanup()
-    return _method
-
-class ReplicateTests(type):
-    '''Replicates tests for unix and windows variants'''
-    def __new__(cls, clsName, bases, dict):
-        for name in [key for key in dict if key.startswith('test_')]:
-            dict[name + '_unix'] = wrap_method(config_unix, dict[name])
-            dict[name + '_unix'].__doc__ = dict[name].__doc__ + ' (unix)'
-            dict[name + '_win'] = wrap_method(config_win, dict[name])
-            dict[name + '_win'].__doc__ = dict[name].__doc__ + ' (win)'
-            del dict[name]
-        return type.__new__(cls, clsName, bases, dict)
-
-class TestCaseWithTmpDir(unittest.TestCase):
-    __metaclass__ = ReplicateTests
-    def init(self):
-        self.tmpdir = os.path.abspath(mkdtemp(dir=os.curdir))
-
-    def cleanup(self):
-        rmtree(self.tmpdir)
-
-    def touch(self, files):
-        for f in files:
-            open(f, 'w').close()
-
-    def tmpfile(self, *args):
-        return os.path.join(self.tmpdir, *args)
-
-class TestExpandLibsGen(TestCaseWithTmpDir):
-    def test_generate(self):
-        '''Test library descriptor generation'''
-        files = [self.tmpfile(f) for f in
-                 [Lib('a'), Obj('b'), Lib('c'), Obj('d'), Obj('e'), Lib('f')]]
-        self.touch(files[:-1])
-        self.touch([files[-1] + config.LIBS_DESC_SUFFIX])
-
-        desc = generate(files)
-        self.assertEqual(desc['OBJS'], [self.tmpfile(Obj(s)) for s in ['b', 'd', 'e']])
-        self.assertEqual(desc['LIBS'], [self.tmpfile(Lib(s)) for s in ['a', 'c', 'f']])
-
-        self.assertRaises(Exception, generate, files + [self.tmpfile(Obj('z'))])
-        self.assertRaises(Exception, generate, files + [self.tmpfile(Lib('y'))])
-
-class TestExpandInit(TestCaseWithTmpDir):
-    def init(self):
-        ''' Initializes test environment for library expansion tests'''
-        super(TestExpandInit, self).init()
-        # Create 2 fake libraries, each containing 3 objects, and the second
-        # including the first one and another library.
-        os.mkdir(self.tmpfile('libx'))
-        os.mkdir(self.tmpfile('liby'))
-        self.libx_files = [self.tmpfile('libx', Obj(f)) for f in ['g', 'h', 'i']]
-        self.liby_files = [self.tmpfile('liby', Obj(f)) for f in ['j', 'k', 'l']] + [self.tmpfile('liby', Lib('z'))]
-        self.touch(self.libx_files + self.liby_files)
-        with open(self.tmpfile('libx', Lib('x') + config.LIBS_DESC_SUFFIX), 'w') as f:
-            f.write(str(generate(self.libx_files)))
-        with open(self.tmpfile('liby', Lib('y') + config.LIBS_DESC_SUFFIX), 'w') as f:
-            f.write(str(generate(self.liby_files + [self.tmpfile('libx', Lib('x'))])))
-
-        # Create various objects and libraries 
-        self.arg_files = [self.tmpfile(f) for f in [Lib('a'), Obj('b'), Obj('c'), Lib('d'), Obj('e')]]
-        # We always give library names (LIB_PREFIX/SUFFIX), even for
-        # dynamic/import libraries
-        self.files = self.arg_files + [self.tmpfile(ImportLib('f'))]
-        self.arg_files += [self.tmpfile(Lib('f'))]
-        self.touch(self.files)
-
-    def assertRelEqual(self, args1, args2):
-        self.assertEqual(args1, [relativize(a) for a in args2])
-
-class TestExpandArgs(TestExpandInit):
-    def test_expand(self):
-        '''Test library expansion'''
-        # Expanding arguments means libraries with a descriptor are expanded
-        # with the descriptor content, and import libraries are used when
-        # a library doesn't exist
-        args = ExpandArgs(['foo', '-bar'] + self.arg_files + [self.tmpfile('liby', Lib('y'))])
-        self.assertRelEqual(args, ['foo', '-bar'] + self.files + self.liby_files + self.libx_files) 
-
-        # When a library exists at the same time as a descriptor, we still use
-        # the descriptor.
-        self.touch([self.tmpfile('libx', Lib('x'))])
-        args = ExpandArgs(['foo', '-bar'] + self.arg_files + [self.tmpfile('liby', Lib('y'))])
-        self.assertRelEqual(args, ['foo', '-bar'] + self.files + self.liby_files + self.libx_files)
-
-        self.touch([self.tmpfile('liby', Lib('y'))])
-        args = ExpandArgs(['foo', '-bar'] + self.arg_files + [self.tmpfile('liby', Lib('y'))])
-        self.assertRelEqual(args, ['foo', '-bar'] + self.files + self.liby_files + self.libx_files)
-
-class TestExpandArgsMore(TestExpandInit):
-    def test_makelist(self):
-        '''Test grouping object files in lists'''
-        # ExpandArgsMore does the same as ExpandArgs
-        with ExpandArgsMore(['foo', '-bar'] + self.arg_files + [self.tmpfile('liby', Lib('y'))]) as args:
-            self.assertRelEqual(args, ['foo', '-bar'] + self.files + self.liby_files + self.libx_files) 
-
-            # But also has an extra method replacing object files with a list
-            args.makelist()
-            # self.files has objects at #1, #2, #4
-            self.assertRelEqual(args[:3], ['foo', '-bar'] + self.files[:1])
-            self.assertRelEqual(args[4:], [self.files[3]] + self.files[5:] + [self.tmpfile('liby', Lib('z'))])
-
-            # Check the list file content
-            objs = [f for f in self.files + self.liby_files + self.libx_files if f.endswith(config.OBJ_SUFFIX)]
-            if config.EXPAND_LIBS_LIST_STYLE == "linkerscript":
-                self.assertNotEqual(args[3][0], '@')
-                filename = args[3]
-                content = ['INPUT("{0}")'.format(relativize(f)) for f in objs]
-                with open(filename, 'r') as f:
-                    self.assertEqual([l.strip() for l in f.readlines() if len(l.strip())], content)
-            elif config.EXPAND_LIBS_LIST_STYLE == "list":
-                self.assertEqual(args[3][0], '@')
-                filename = args[3][1:]
-                content = objs
-                with open(filename, 'r') as f:
-                    self.assertRelEqual([l.strip() for l in f.readlines() if len(l.strip())], content)
-
-            tmp = args.tmp
-        # Check that all temporary files are properly removed
-        self.assertEqual(True, all([not os.path.exists(f) for f in tmp]))
-
-    def test_extract(self):
-        '''Test library extraction'''
-        # Divert subprocess.call
-        subprocess_call = subprocess.call
-        subprocess_check_output = subprocess.check_output
-        def call(args, **kargs):
-            if config.AR == 'lib':
-                self.assertEqual(args[:2], [config.AR, '-NOLOGO'])
-                self.assertTrue(args[2].startswith('-EXTRACT:'))
-                extract = [args[2][len('-EXTRACT:'):]]
-                self.assertTrue(extract)
-                args = args[3:]
-            else:
-                # The command called is always AR_EXTRACT
-                ar_extract = config.AR_EXTRACT.split()
-                self.assertEqual(args[:len(ar_extract)], ar_extract)
-                args = args[len(ar_extract):]
-            # Remaining argument is always one library
-            self.assertEqual(len(args), 1)
-            arg = args[0]
-            self.assertEqual(os.path.splitext(arg)[1], config.LIB_SUFFIX)
-            # Simulate file extraction
-            lib = os.path.splitext(os.path.basename(arg))[0]
-            if config.AR != 'lib':
-                extract = [lib, lib + '2']
-            extract = [os.path.join(kargs['cwd'], f) for f in extract]
-            if config.AR != 'lib':
-                extract = [Obj(f) for f in extract]
-            if not lib in extracted:
-                extracted[lib] = []
-            extracted[lib].extend(extract)
-            self.touch(extract)
-        subprocess.call = call
-
-        def check_output(args, **kargs):
-            # The command called is always AR
-            ar = config.AR
-            self.assertEqual(args[0:3], [ar, '-NOLOGO', '-LIST'])
-            # Remaining argument is always one library
-            self.assertRelEqual([os.path.splitext(arg)[1] for arg in args[3:]],
-[config.LIB_SUFFIX])
-            # Simulate LIB -NOLOGO -LIST
-            lib = os.path.splitext(os.path.basename(args[3]))[0]
-            return '%s\n%s\n' % (Obj(lib), Obj(lib + '2'))
-        subprocess.check_output = check_output
-
-        # ExpandArgsMore does the same as ExpandArgs
-        self.touch([self.tmpfile('liby', Lib('y'))])
-        for iteration in (1, 2):
-            with ExpandArgsMore(['foo', '-bar'] + self.arg_files + [self.tmpfile('liby', Lib('y'))]) as args:
-                files = self.files + self.liby_files + self.libx_files
-
-                self.assertRelEqual(args, ['foo', '-bar'] + files)
-
-                extracted = {}
-                # ExpandArgsMore also has an extra method extracting static libraries
-                # when possible
-                args.extract()
-
-                # With AR_EXTRACT, it uses the descriptors when there are, and
-                # actually
-                # extracts the remaining libraries
-                extracted_args = []
-                for f in files:
-                    if f.endswith(config.LIB_SUFFIX):
-                        base = os.path.splitext(os.path.basename(f))[0]
-                        # On the first iteration, we test the behavior of
-                        # extracting archives that don't have a copy of their
-                        # contents next to them, which is to use the file
-                        # extracted from the archive in a temporary directory.
-                        # On the second iteration, we test extracting archives
-                        # that do have a copy of their contents next to them,
-                        # in which case those contents are used instead of the
-                        # temporarily extracted files.
-                        if iteration == 1:
-                            extracted_args.extend(sorted(extracted[base]))
-                        else:
-                            dirname = os.path.dirname(f[len(self.tmpdir)+1:])
-                            if base.endswith('f'):
-                                dirname = os.path.join(dirname, 'foo', 'bar')
-                            extracted_args.extend([self.tmpfile(dirname, Obj(base)), self.tmpfile(dirname, Obj(base + '2'))])
-                    else:
-                        extracted_args.append(f)
-                self.assertRelEqual(args, ['foo', '-bar'] + extracted_args)
-
-                tmp = args.tmp
-            # Check that all temporary files are properly removed
-            self.assertEqual(True, all([not os.path.exists(f) for f in tmp]))
-
-            # Create archives contents next to them for the second iteration.
-            base = os.path.splitext(Lib('_'))[0]
-            self.touch(self.tmpfile(Obj(base.replace('_', suffix))) for suffix in ('a', 'a2', 'd', 'd2'))
-            try:
-                os.makedirs(self.tmpfile('foo', 'bar'))
-            except:
-                pass
-            self.touch(self.tmpfile('foo', 'bar', Obj(base.replace('_', suffix))) for suffix in ('f', 'f2'))
-            self.touch(self.tmpfile('liby', Obj(base.replace('_', suffix))) for suffix in ('z', 'z2'))
-
-        # Restore subprocess.call and subprocess.check_output
-        subprocess.call = subprocess_call
-        subprocess.check_output = subprocess_check_output
-
-class FakeProcess(object):
-    def __init__(self, out, err = ''):
-        self.out = out
-        self.err = err
-
-    def communicate(self):
-        return (self.out, self.err)
-
-OBJDUMPS = {
-'foo.o': '''
-00000000 g     F .text\t00000001 foo
-00000000 g     F .text._Z6foobarv\t00000001 _Z6foobarv
-00000000 g     F .text.hello\t00000001 hello
-00000000 g     F .text._ZThn4_6foobarv\t00000001 _ZThn4_6foobarv
-''',
-'bar.o': '''
-00000000 g     F .text.hi\t00000001 hi
-00000000 g     F .text.hot._Z6barbazv\t00000001 .hidden _Z6barbazv
-''',
-}
-
-PRINT_ICF = '''
-ld: ICF folding section '.text.hello' in file 'foo.o'into '.text.hi' in file 'bar.o'
-ld: ICF folding section '.foo' in file 'foo.o'into '.foo' in file 'bar.o'
-'''
-
-class SubprocessPopen(object):
-    def __init__(self, test):
-        self.test = test
-
-    def __call__(self, args, stdout = None, stderr = None):
-        self.test.assertEqual(stdout, subprocess.PIPE)
-        self.test.assertEqual(stderr, subprocess.PIPE)
-        if args[0] == 'objdump':
-            self.test.assertEqual(args[1], '-t')
-            self.test.assertTrue(args[2] in OBJDUMPS)
-            return FakeProcess(OBJDUMPS[args[2]])
-        else:
-            return FakeProcess('', PRINT_ICF)
-
-class TestSectionFinder(unittest.TestCase):
-    def test_getSections(self):
-        '''Test SectionFinder'''
-        # Divert subprocess.Popen
-        subprocess_popen = subprocess.Popen
-        subprocess.Popen = SubprocessPopen(self)
-        config.EXPAND_LIBS_ORDER_STYLE = 'linkerscript'
-        config.OBJ_SUFFIX = '.o'
-        config.LIB_SUFFIX = '.a'
-        finder = SectionFinder(['foo.o', 'bar.o'])
-        self.assertEqual(finder.getSections('foobar'), [])
-        self.assertEqual(finder.getSections('_Z6barbazv'), ['.text.hot._Z6barbazv'])
-        self.assertEqual(finder.getSections('_Z6foobarv'), ['.text._Z6foobarv', '.text._ZThn4_6foobarv'])
-        self.assertEqual(finder.getSections('_ZThn4_6foobarv'), ['.text._Z6foobarv', '.text._ZThn4_6foobarv'])
-        subprocess.Popen = subprocess_popen
-
-class TestSymbolOrder(unittest.TestCase):
-    def test_getOrderedSections(self):
-        '''Test ExpandMoreArgs' _getOrderedSections'''
-        # Divert subprocess.Popen
-        subprocess_popen = subprocess.Popen
-        subprocess.Popen = SubprocessPopen(self)
-        config.EXPAND_LIBS_ORDER_STYLE = 'linkerscript'
-        config.OBJ_SUFFIX = '.o'
-        config.LIB_SUFFIX = '.a'
-        config.LD_PRINT_ICF_SECTIONS = ''
-        args = ExpandArgsMore(['foo', '-bar', 'bar.o', 'foo.o'])
-        self.assertEqual(args._getOrderedSections(['_Z6foobarv', '_Z6barbazv']), ['.text._Z6foobarv', '.text._ZThn4_6foobarv', '.text.hot._Z6barbazv'])
-        self.assertEqual(args._getOrderedSections(['_ZThn4_6foobarv', '_Z6barbazv']), ['.text._Z6foobarv', '.text._ZThn4_6foobarv', '.text.hot._Z6barbazv'])
-        subprocess.Popen = subprocess_popen
-
-    def test_getFoldedSections(self):
-        '''Test ExpandMoreArgs' _getFoldedSections'''
-        # Divert subprocess.Popen
-        subprocess_popen = subprocess.Popen
-        subprocess.Popen = SubprocessPopen(self)
-        config.LD_PRINT_ICF_SECTIONS = '-Wl,--print-icf-sections'
-        args = ExpandArgsMore(['foo', '-bar', 'bar.o', 'foo.o'])
-        self.assertEqual(args._getFoldedSections(), {'.text.hello': ['.text.hi'], '.text.hi': ['.text.hello']})
-        subprocess.Popen = subprocess_popen
-
-    def test_getOrderedSectionsWithICF(self):
-        '''Test ExpandMoreArgs' _getOrderedSections, with ICF'''
-        # Divert subprocess.Popen
-        subprocess_popen = subprocess.Popen
-        subprocess.Popen = SubprocessPopen(self)
-        config.EXPAND_LIBS_ORDER_STYLE = 'linkerscript'
-        config.OBJ_SUFFIX = '.o'
-        config.LIB_SUFFIX = '.a'
-        config.LD_PRINT_ICF_SECTIONS = '-Wl,--print-icf-sections'
-        args = ExpandArgsMore(['foo', '-bar', 'bar.o', 'foo.o'])
-        self.assertEqual(args._getOrderedSections(['hello', '_Z6barbazv']), ['.text.hello', '.text.hi', '.text.hot._Z6barbazv'])
-        self.assertEqual(args._getOrderedSections(['_ZThn4_6foobarv', 'hi', '_Z6barbazv']), ['.text._Z6foobarv', '.text._ZThn4_6foobarv', '.text.hi', '.text.hello', '.text.hot._Z6barbazv'])
-        subprocess.Popen = subprocess_popen
-
-
-if __name__ == '__main__':
-    mozunit.main(runwith='unittest')
--- a/devtools/client/shadereditor/panel.js
+++ b/devtools/client/shadereditor/panel.js
@@ -2,17 +2,17 @@
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* 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 { Cc, Ci, Cu, Cr } = require("chrome");
 const promise = require("promise");
-const EventEmitter = require("devtools/shared/old-event-emitter");
+const EventEmitter = require("devtools/shared/event-emitter");
 const { WebGLFront } = require("devtools/shared/fronts/webgl");
 const DevToolsUtils = require("devtools/shared/DevToolsUtils");
 
 function ShaderEditorPanel(iframeWindow, toolbox) {
   this.panelWin = iframeWindow;
   this._toolbox = toolbox;
   this._destroyer = null;
 
--- a/devtools/client/shadereditor/shadereditor.js
+++ b/devtools/client/shadereditor/shadereditor.js
@@ -5,17 +5,17 @@
 
 const {require} = ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
 const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
 const {SideMenuWidget} = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
 const promise = require("promise");
 const defer = require("devtools/shared/defer");
 const {Task} = require("devtools/shared/task");
 const Services = require("Services");
-const EventEmitter = require("devtools/shared/old-event-emitter");
+const EventEmitter = require("devtools/shared/event-emitter");
 const Tooltip = require("devtools/client/shared/widgets/tooltip/Tooltip");
 const Editor = require("devtools/client/sourceeditor/editor");
 const {LocalizationHelper} = require("devtools/shared/l10n");
 const {extend} = require("devtools/shared/extend");
 const {WidgetMethods, setNamedTimeout} =
   require("devtools/client/shared/widgets/view-helpers");
 
 // Use privileged promise in panel documents to prevent having them to freeze
--- a/devtools/client/shadereditor/test/browser_se_editors-error-gutter.js
+++ b/devtools/client/shadereditor/test/browser_se_editors-error-gutter.js
@@ -15,62 +15,62 @@ async function ifWebGLSupported() {
     once(gFront, "program-linked"),
     once(panel.panelWin, EVENTS.SOURCES_SHOWN)
   ]);
 
   let vsEditor = await ShadersEditorsView._getEditor("vs");
   let fsEditor = await ShadersEditorsView._getEditor("fs");
 
   vsEditor.replaceText("vec3", { line: 7, ch: 22 }, { line: 7, ch: 26 });
-  let [, vertError] = await onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
+  let vertError = await panel.panelWin.once(EVENTS.SHADER_COMPILED);
   checkHasVertFirstError(true, vertError);
   checkHasVertSecondError(false, vertError);
   info("Error marks added in the vertex shader editor.");
 
   vsEditor.insertText(" ", { line: 1, ch: 0 });
-  await once(panel.panelWin, EVENTS.EDITOR_ERROR_MARKERS_REMOVED);
+  await panel.panelWin.once(EVENTS.EDITOR_ERROR_MARKERS_REMOVED);
   is(vsEditor.getText(1), "       precision lowp float;", "Typed space.");
   checkHasVertFirstError(false, vertError);
   checkHasVertSecondError(false, vertError);
   info("Error marks removed while typing in the vertex shader editor.");
 
-  [, vertError] = await onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
+  vertError = await panel.panelWin.once(EVENTS.SHADER_COMPILED);
   checkHasVertFirstError(true, vertError);
   checkHasVertSecondError(false, vertError);
   info("Error marks were re-added after recompiling the vertex shader.");
 
   fsEditor.replaceText("vec4", { line: 2, ch: 14 }, { line: 2, ch: 18 });
-  let [, fragError] = await onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
+  let fragError = await panel.panelWin.once(EVENTS.SHADER_COMPILED);
   checkHasVertFirstError(true, vertError);
   checkHasVertSecondError(false, vertError);
   checkHasFragError(true, fragError);
   info("Error marks added in the fragment shader editor.");
 
   fsEditor.insertText(" ", { line: 1, ch: 0 });
-  await once(panel.panelWin, EVENTS.EDITOR_ERROR_MARKERS_REMOVED);
+  await panel.panelWin.once(EVENTS.EDITOR_ERROR_MARKERS_REMOVED);
   is(fsEditor.getText(1), "       precision lowp float;", "Typed space.");
   checkHasVertFirstError(true, vertError);
   checkHasVertSecondError(false, vertError);
   checkHasFragError(false, fragError);
   info("Error marks removed while typing in the fragment shader editor.");
 
-  [, fragError] = await onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
+  fragError = await panel.panelWin.once(EVENTS.SHADER_COMPILED);
   checkHasVertFirstError(true, vertError);
   checkHasVertSecondError(false, vertError);
   checkHasFragError(true, fragError);
   info("Error marks were re-added after recompiling the fragment shader.");
 
   vsEditor.replaceText("2", { line: 3, ch: 19 }, { line: 3, ch: 20 });
-  await once(panel.panelWin, EVENTS.EDITOR_ERROR_MARKERS_REMOVED);
+  await panel.panelWin.once(EVENTS.EDITOR_ERROR_MARKERS_REMOVED);
   checkHasVertFirstError(false, vertError);
   checkHasVertSecondError(false, vertError);
   checkHasFragError(true, fragError);
   info("Error marks removed while typing in the vertex shader editor again.");
 
-  [, vertError] = await onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
+  vertError = await panel.panelWin.once(EVENTS.SHADER_COMPILED);
   checkHasVertFirstError(true, vertError);
   checkHasVertSecondError(true, vertError);
   checkHasFragError(true, fragError);
   info("Error marks were re-added after recompiling the fragment shader again.");
 
   await teardown(panel);
   finish();
 
--- a/devtools/client/shadereditor/test/browser_se_shaders-edit-02.js
+++ b/devtools/client/shadereditor/test/browser_se_shaders-edit-02.js
@@ -16,17 +16,17 @@ async function ifWebGLSupported() {
     once(panel.panelWin, EVENTS.SOURCES_SHOWN)
   ]);
 
   let vsEditor = await ShadersEditorsView._getEditor("vs");
   let fsEditor = await ShadersEditorsView._getEditor("fs");
 
 
   vsEditor.replaceText("vec3", { line: 7, ch: 22 }, { line: 7, ch: 26 });
-  let [, error] = await onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
+  let error = await panel.panelWin.once(EVENTS.SHADER_COMPILED);
 
   ok(error,
     "The new vertex shader source was compiled with errors.");
 
   // The implementation has the choice to defer all compile-time errors to link time.
   let infoLog = (error.compile != "") ? error.compile : error.link;
 
   isnot(infoLog, "",
@@ -37,17 +37,17 @@ async function ifWebGLSupported() {
     "A constructor error is contained in the info log.");
   ok(infoLog.includes("ERROR: 0:8: '='"),
     "A dimension error is contained in the info log.");
   ok(infoLog.includes("ERROR: 0:8: 'assign'"),
     "An assignment error is contained in the info log.");
 
 
   fsEditor.replaceText("vec4", { line: 2, ch: 14 }, { line: 2, ch: 18 });
-  [, error] = await onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
+  error = await panel.panelWin.once(EVENTS.SHADER_COMPILED);
 
   ok(error,
     "The new fragment shader source was compiled with errors.");
 
   infoLog = (error.compile != "") ? error.compile : error.link;
 
   isnot(infoLog, "",
     "The one of the compile or link info logs should not be empty.");
@@ -56,21 +56,21 @@ async function ifWebGLSupported() {
   ok(infoLog.includes("ERROR: 0:6: 'constructor'"),
     "A constructor error is contained in the info log.");
 
 
   await ensurePixelIs(gFront, { x: 0, y: 0 }, { r: 255, g: 0, b: 0, a: 255 }, true);
   await ensurePixelIs(gFront, { x: 511, y: 511 }, { r: 0, g: 255, b: 0, a: 255 }, true);
 
   vsEditor.replaceText("vec4", { line: 7, ch: 22 }, { line: 7, ch: 26 });
-  [, error] = await onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
+  error = await panel.panelWin.once(EVENTS.SHADER_COMPILED);
   ok(!error, "The new vertex shader source was compiled successfully.");
 
   fsEditor.replaceText("vec3", { line: 2, ch: 14 }, { line: 2, ch: 18 });
-  [, error] = await onceSpread(panel.panelWin, EVENTS.SHADER_COMPILED);
+  error = await panel.panelWin.once(EVENTS.SHADER_COMPILED);
   ok(!error, "The new fragment shader source was compiled successfully.");
 
   await ensurePixelIs(gFront, { x: 0, y: 0 }, { r: 255, g: 0, b: 0, a: 255 }, true);
   await ensurePixelIs(gFront, { x: 511, y: 511 }, { r: 0, g: 255, b: 0, a: 255 }, true);
 
   await teardown(panel);
   finish();
 }
--- a/devtools/client/shadereditor/test/head.js
+++ b/devtools/client/shadereditor/test/head.js
@@ -76,26 +76,16 @@ async function test() {
     handlError(e);
   }
 }
 
 function createCanvas() {
   return document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
 }
 
-// Hack around `once`, as that only resolves to a single (first) argument
-// and discards the rest. `onceSpread` is similar, except resolves to an
-// array of all of the arguments in the handler. These should be consolidated
-// into the same function, but many tests will need to be changed.
-function onceSpread(aTarget, aEvent) {
-  let deferred = defer();
-  aTarget.once(aEvent, (...args) => deferred.resolve(args));
-  return deferred.promise;
-}
-
 function observe(aNotificationName, aOwnsWeak = false) {
   info("Waiting for observer notification: '" + aNotificationName + ".");
 
   let deferred = defer();
 
   Services.obs.addObserver(function onNotification(...aArgs) {
     Services.obs.removeObserver(onNotification, aNotificationName);
     deferred.resolve.apply(deferred, aArgs);
--- a/dom/file/nsHostObjectProtocolHandler.cpp
+++ b/dom/file/nsHostObjectProtocolHandler.cpp
@@ -71,19 +71,16 @@ struct DataInfo
 
   RefPtr<BlobImpl> mBlobImpl;
   RefPtr<DOMMediaStream> mMediaStream;
   RefPtr<MediaSource> mMediaSource;
 
   nsCOMPtr<nsIPrincipal> mPrincipal;
   nsCString mStack;
 
-  // WeakReferences of nsHostObjectURI objects.
-  nsTArray<nsWeakPtr> mURIs;
-
   // When a blobURL is revoked, we keep it alive for RELEASING_TIMER
   // milliseconds in order to support pending operations such as navigation,
   // download and so on.
   bool mRevoked;
 };
 
 static nsClassHashtable<nsCStringHashKey, DataInfo>* gDataTable;
 
@@ -118,29 +115,29 @@ GetDataInfo(const nsACString& aUri, bool
   if (!aAlsoIfRevoked && res && res->mRevoked) {
     return nullptr;
   }
 
   return res;
 }
 
 static DataInfo*
-GetDataInfoFromURI(nsIURI* aURI)
+GetDataInfoFromURI(nsIURI* aURI, bool aAlsoIfRevoked = false)
 {
   if (!aURI) {
     return nullptr;
   }
 
   nsCString spec;
   nsresult rv = aURI->GetSpec(spec);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return nullptr;
   }
 
-  return GetDataInfo(spec);
+  return GetDataInfo(spec, aAlsoIfRevoked);
 }
 
 // Memory reporting for the hash table.
 namespace mozilla {
 
 void
 BroadcastBlobURLRegistration(const nsACString& aURI,
                              BlobImpl* aBlobImpl,
@@ -535,23 +532,16 @@ private:
     DataInfo* info = GetDataInfo(mURI, true /* We care about revoked dataInfo */);
     if (!info) {
       // Already gone!
       return;
     }
 
     MOZ_ASSERT(info->mRevoked);
 
-    for (uint32_t i = 0; i < info->mURIs.Length(); ++i) {
-      nsCOMPtr<nsIURI> uri = do_QueryReferent(info->mURIs[i]);
-      if (uri) {
-        static_cast<nsHostObjectURI*>(uri.get())->ForgetBlobImpl();
-      }
-    }
-
     gDataTable->Remove(mURI);
     if (gDataTable->Count() == 0) {
       delete gDataTable;
       gDataTable = nullptr;
     }
   }
 
   void
@@ -895,58 +885,51 @@ nsHostObjectProtocolHandler::NewURI(cons
     MOZ_ASSERT(info->mBlobImpl);
     principal = info->mPrincipal;
     blob = info->mBlobImpl;
   }
 
   nsCOMPtr<nsIURI> uri;
   rv = NS_MutateURI(new nsHostObjectURI::Mutator())
          .SetSpec(aSpec)
-         .Apply(NS_MutatorMethod(&nsIBlobURIMutator::SetBlobImpl, blob))
          .Apply(NS_MutatorMethod(&nsIPrincipalURIMutator::SetPrincipal, principal))
          .Finalize(uri);
   NS_ENSURE_SUCCESS(rv, rv);
 
   uri.forget(aResult);
 
-  if (info && info->mObjectType == DataInfo::eBlobImpl) {
-    info->mURIs.AppendElement(do_GetWeakReference(*aResult));
-  }
-
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsHostObjectProtocolHandler::NewChannel2(nsIURI* uri,
                                          nsILoadInfo* aLoadInfo,
                                          nsIChannel** result)
 {
   *result = nullptr;
 
-  nsCOMPtr<nsIURIWithBlobImpl> uriBlobImpl = do_QueryInterface(uri);
-  if (!uriBlobImpl) {
-    return NS_ERROR_DOM_BAD_URI;
-  }
-
-  nsCOMPtr<nsISupports> tmp;
-  MOZ_ALWAYS_SUCCEEDS(uriBlobImpl->GetBlobImpl(getter_AddRefs(tmp)));
-  nsCOMPtr<BlobImpl> blobImpl = do_QueryInterface(tmp);
+  RefPtr<BlobImpl> blobImpl;
+  NS_GetBlobForBlobURI(uri, getter_AddRefs(blobImpl), true);
   if (!blobImpl) {
     return NS_ERROR_DOM_BAD_URI;
   }
 
   nsCOMPtr<nsIURIWithPrincipal> uriPrinc = do_QueryInterface(uri);
   if (!uriPrinc) {
     return NS_ERROR_DOM_BAD_URI;
   }
 
   nsCOMPtr<nsIPrincipal> principal;
   nsresult rv = uriPrinc->GetPrincipal(getter_AddRefs(principal));
   NS_ENSURE_SUCCESS(rv, rv);
 
+  if (!principal) {
+    return NS_ERROR_DOM_BAD_URI;
+  }
+
 #ifdef DEBUG
   // Info can be null, in case this blob URL has been revoked already.
   DataInfo* info = GetDataInfoFromURI(uri);
   MOZ_ASSERT_IF(info, info->mPrincipal == principal);
 #endif
 
   // We want to be sure that we stop the creation of the channel if the blob URL
   // is copy-and-pasted on a different context (ex. private browsing or
@@ -1037,34 +1020,22 @@ nsFontTableProtocolHandler::GetProtocolF
 
 NS_IMETHODIMP
 nsFontTableProtocolHandler::GetScheme(nsACString &result)
 {
   result.AssignLiteral(FONTTABLEURI_SCHEME);
   return NS_OK;
 }
 
-/* static */ void
-nsHostObjectProtocolHandler::StoreClonedURI(const nsACString& aSpec,
-                                            nsIURI* aURI)
-{
-  MOZ_ASSERT(aURI);
-
-  DataInfo* info = GetDataInfo(aSpec);
-  if (info) {
-    info->mURIs.AppendElement(do_GetWeakReference(aURI));
-  }
-}
-
 nsresult
-NS_GetBlobForBlobURI(nsIURI* aURI, BlobImpl** aBlob)
+NS_GetBlobForBlobURI(nsIURI* aURI, BlobImpl** aBlob, bool aAlsoIfRevoked)
 {
   *aBlob = nullptr;
 
-  DataInfo* info = GetDataInfoFromURI(aURI);
+  DataInfo* info = GetDataInfoFromURI(aURI, aAlsoIfRevoked);
   if (!info || info->mObjectType != DataInfo::eBlobImpl) {
     return NS_ERROR_DOM_BAD_URI;
   }
 
   RefPtr<BlobImpl> blob = info->mBlobImpl;
   blob.forget(aBlob);
   return NS_OK;
 }
--- a/dom/file/nsHostObjectProtocolHandler.h
+++ b/dom/file/nsHostObjectProtocolHandler.h
@@ -83,19 +83,16 @@ public:
 
   static nsIPrincipal* GetDataEntryPrincipal(const nsACString& aUri);
   static void Traverse(const nsACString& aUri, nsCycleCollectionTraversalCallback& aCallback);
 
   static bool
   GetAllBlobURLEntries(nsTArray<mozilla::dom::BlobURLRegistrationData>& aRegistrations,
                        mozilla::dom::ContentParent* aCP);
 
-  // This is for nsHostObjectURI.
-  static void StoreClonedURI(const nsACString& aSpec, nsIURI* aURI);
-
 protected:
   virtual ~nsHostObjectProtocolHandler() {}
 
 private:
   static void Init();
 };
 
 class nsBlobProtocolHandler : public nsHostObjectProtocolHandler
@@ -128,17 +125,17 @@ inline bool IsRtspURI(nsIURI* aUri)
 
 inline bool IsFontTableURI(nsIURI* aUri)
 {
   bool isFont;
   return NS_SUCCEEDED(aUri->SchemeIs(FONTTABLEURI_SCHEME, &isFont)) && isFont;
 }
 
 extern nsresult
-NS_GetBlobForBlobURI(nsIURI* aURI, mozilla::dom::BlobImpl** aBlob);
+NS_GetBlobForBlobURI(nsIURI* aURI, mozilla::dom::BlobImpl** aBlob, bool aAlsoIfRevoked = false);
 
 extern nsresult
 NS_GetBlobForBlobURISpec(const nsACString& aSpec, mozilla::dom::BlobImpl** aBlob);
 
 extern nsresult
 NS_GetStreamForBlobURI(nsIURI* aURI, nsIInputStream** aStream);
 
 extern nsresult
--- a/dom/file/nsHostObjectURI.cpp
+++ b/dom/file/nsHostObjectURI.cpp
@@ -17,41 +17,29 @@ static NS_DEFINE_CID(kHOSTOBJECTURICID, 
 
 static NS_DEFINE_CID(kThisSimpleURIImplementationCID,
                      NS_THIS_SIMPLEURI_IMPLEMENTATION_CID);
 
 NS_IMPL_ADDREF_INHERITED(nsHostObjectURI, mozilla::net::nsSimpleURI)
 NS_IMPL_RELEASE_INHERITED(nsHostObjectURI, mozilla::net::nsSimpleURI)
 
 NS_INTERFACE_MAP_BEGIN(nsHostObjectURI)
-  NS_INTERFACE_MAP_ENTRY(nsIURIWithBlobImpl)
   NS_INTERFACE_MAP_ENTRY(nsIURIWithPrincipal)
-  NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
   if (aIID.Equals(kHOSTOBJECTURICID))
     foundInterface = static_cast<nsIURI*>(this);
   else if (aIID.Equals(kThisSimpleURIImplementationCID)) {
     // Need to return explicitly here, because if we just set foundInterface
     // to null the NS_INTERFACE_MAP_END_INHERITING will end up calling into
     // nsSimplURI::QueryInterface and finding something for this CID.
     *aInstancePtr = nullptr;
     return NS_NOINTERFACE;
   }
   else
 NS_INTERFACE_MAP_END_INHERITING(mozilla::net::nsSimpleURI)
 
-// nsIURIWithBlobImpl methods:
-
-NS_IMETHODIMP
-nsHostObjectURI::GetBlobImpl(nsISupports** aBlobImpl)
-{
-  RefPtr<mozilla::dom::BlobImpl> blobImpl(mBlobImpl);
-  blobImpl.forget(aBlobImpl);
-  return NS_OK;
-}
-
 // nsIURIWithPrincipal methods:
 
 NS_IMETHODIMP
 nsHostObjectURI::GetPrincipal(nsIPrincipal** aPrincipal)
 {
   NS_IF_ADDREF(*aPrincipal = mPrincipal);
 
   return NS_OK;
@@ -144,20 +132,16 @@ nsHostObjectURI::Deserialize(const mozil
     return true;
   }
 
   mPrincipal = PrincipalInfoToPrincipal(hostParams.principal().get_PrincipalInfo());
   if (!mPrincipal) {
     return false;
   }
 
-  // If this fails, we still want to complete the operation. Probably this
-  // blobURL has been revoked in the meantime.
-  NS_GetBlobForBlobURI(this, getter_AddRefs(mBlobImpl));
-
   return true;
 }
 
 nsresult
 nsHostObjectURI::SetScheme(const nsACString& aScheme)
 {
   // Disallow setting the scheme, since that could cause us to be associated
   // with a different protocol handler that doesn't expect us to be carrying
@@ -180,19 +164,16 @@ nsHostObjectURI::CloneInternal(mozilla::
   RefPtr<nsHostObjectURI> uriCheck;
   rv = simpleClone->QueryInterface(kHOSTOBJECTURICID, getter_AddRefs(uriCheck));
   MOZ_ASSERT(NS_SUCCEEDED(rv) && uriCheck);
 #endif
 
   nsHostObjectURI* u = static_cast<nsHostObjectURI*>(simpleClone.get());
 
   u->mPrincipal = mPrincipal;
-  u->mBlobImpl = mBlobImpl;
-
-  nsHostObjectProtocolHandler::StoreClonedURI(newRef, simpleClone);
 
   simpleClone.forget(aClone);
   return NS_OK;
 }
 
 /* virtual */ nsresult
 nsHostObjectURI::EqualsInternal(nsIURI* aOther,
                                 mozilla::net::nsSimpleURI::RefHandlingEnum aRefHandlingMode,
@@ -211,34 +192,29 @@ nsHostObjectURI::EqualsInternal(nsIURI* 
   }
 
   // Compare the member data that our base class knows about.
   if (!mozilla::net::nsSimpleURI::EqualsInternal(otherUri, aRefHandlingMode)) {
     *aResult = false;
     return NS_OK;
   }
 
-  // Compare the piece of additional member data that we add to base class,
-  // but we cannot compare BlobImpl. This should not be a problem, because we
-  // don't support changing the underlying mBlobImpl.
-
   if (mPrincipal && otherUri->mPrincipal) {
     // Both of us have mPrincipals. Compare them.
     return mPrincipal->Equals(otherUri->mPrincipal, aResult);
   }
   // else, at least one of us lacks a principal; only equal if *both* lack it.
   *aResult = (!mPrincipal && !otherUri->mPrincipal);
   return NS_OK;
 }
 
 // Queries this list of interfaces. If none match, it queries mURI.
 NS_IMPL_NSIURIMUTATOR_ISUPPORTS(nsHostObjectURI::Mutator,
                                 nsIURISetters,
                                 nsIURIMutator,
-                                nsIBlobURIMutator,
                                 nsIPrincipalURIMutator,
                                 nsISerializable)
 
 NS_IMETHODIMP
 nsHostObjectURI::Mutate(nsIURIMutator** aMutator)
 {
     RefPtr<nsHostObjectURI::Mutator> mutator = new nsHostObjectURI::Mutator();
     nsresult rv = mutator->InitFromURI(this);
@@ -300,15 +276,8 @@ nsHostObjectURI::GetFlags(uint32_t *aFla
 }
 
 NS_IMETHODIMP
 nsHostObjectURI::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc)
 {
   *aClassIDNoAlloc = kHOSTOBJECTURICID;
   return NS_OK;
 }
-
-void
-nsHostObjectURI::ForgetBlobImpl()
-{
-  MOZ_ASSERT(mBlobImpl);
-  mBlobImpl = nullptr;
-}
--- a/dom/file/nsHostObjectURI.h
+++ b/dom/file/nsHostObjectURI.h
@@ -8,48 +8,43 @@
 #define nsHostObjectURI_h
 
 #include "mozilla/Attributes.h"
 #include "mozilla/dom/File.h"
 #include "nsCOMPtr.h"
 #include "nsIClassInfo.h"
 #include "nsIPrincipal.h"
 #include "nsISerializable.h"
-#include "nsIURIWithBlobImpl.h"
 #include "nsIURIWithPrincipal.h"
 #include "nsSimpleURI.h"
 #include "nsIIPCSerializableURI.h"
-#include "nsWeakReference.h"
 
 
 /**
  * These URIs refer to host objects: Blobs, with scheme "blob",
  * MediaStreams, with scheme "mediastream", and MediaSources, with scheme
  * "mediasource".
  */
 class nsHostObjectURI final
   : public mozilla::net::nsSimpleURI
   , public nsIURIWithPrincipal
-  , public nsIURIWithBlobImpl
-  , public nsSupportsWeakReference
 {
 private:
-  nsHostObjectURI(nsIPrincipal* aPrincipal,
-                  mozilla::dom::BlobImpl* aBlobImpl)
+  explicit nsHostObjectURI(nsIPrincipal* aPrincipal)
     : mozilla::net::nsSimpleURI()
     , mPrincipal(aPrincipal)
-    , mBlobImpl(aBlobImpl)
   {}
 
   // For use only from deserialization
-  nsHostObjectURI() : mozilla::net::nsSimpleURI() {}
+  explicit nsHostObjectURI()
+    : mozilla::net::nsSimpleURI()
+  {}
 
 public:
   NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_NSIURIWITHBLOBIMPL
   NS_DECL_NSIURIWITHPRINCIPAL
   NS_DECL_NSISERIALIZABLE
   NS_DECL_NSICLASSINFO
   NS_DECL_NSIIPCSERIALIZABLEURI
 
   // Override CloneInternal() and EqualsInternal()
   virtual nsresult CloneInternal(RefHandlingEnum aRefHandlingMode,
                                  const nsACString& newRef,
@@ -64,32 +59,28 @@ public:
   {
     nsHostObjectURI* url = new nsHostObjectURI();
     SetRefOnClone(url, refHandlingMode, newRef);
     return url;
   }
 
   NS_IMETHOD Mutate(nsIURIMutator * *_retval) override;
 
-  void ForgetBlobImpl();
-
   nsCOMPtr<nsIPrincipal> mPrincipal;
-  RefPtr<mozilla::dom::BlobImpl> mBlobImpl;
 
 protected:
   virtual ~nsHostObjectURI() {}
 
   nsresult SetScheme(const nsACString &aProtocol) override;
   bool Deserialize(const mozilla::ipc::URIParams&);
 
 public:
   class Mutator final
     : public nsIURIMutator
     , public BaseURIMutator<nsHostObjectURI>
-    , public nsIBlobURIMutator
     , public nsIPrincipalURIMutator
     , public nsISerializable
   {
     NS_DECL_ISUPPORTS
     NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI)
     NS_DEFINE_NSIMUTATOR_COMMON
 
     NS_IMETHOD
@@ -100,26 +91,16 @@ public:
 
     MOZ_MUST_USE NS_IMETHOD
     Read(nsIObjectInputStream* aStream) override
     {
         return InitFromInputStream(aStream);
     }
 
     MOZ_MUST_USE NS_IMETHOD
-    SetBlobImpl(mozilla::dom::BlobImpl *aBlobImpl) override
-    {
-        if (!mURI) {
-            return NS_ERROR_NULL_POINTER;
-        }
-        mURI->mBlobImpl = aBlobImpl;
-        return NS_OK;
-    }
-
-    MOZ_MUST_USE NS_IMETHOD
     SetPrincipal(nsIPrincipal *aPrincipal) override
     {
         if (!mURI) {
             return NS_ERROR_NULL_POINTER;
         }
         mURI->mPrincipal = aPrincipal;
         return NS_OK;
     }
--- a/dom/svg/test/test_fragments.html
+++ b/dom/svg/test/test_fragments.html
@@ -8,17 +8,17 @@ https://bugzilla.mozilla.org/show_bug.cg
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
 </head>
 <body>
 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=759124">Mozilla Bug 759124</a>
 <p id="display"></p>
 <div id="content" style="display: none"></div>
 
-<iframe id="svg" src="fragments-helper.svg"></iframe>
+<iframe id="svg"></iframe>
 
 <pre id="test">
 <script class="testbody" type="application/javascript">
 SimpleTest.waitForExplicitFinish();
 
 function Test(svgFragmentIdentifier, valid, viewBoxString,
               preserveAspectRatioString, zoomAndPanString)
 {
@@ -105,12 +105,13 @@ function runTests()
     rootElement.setAttribute("zoomAndPan", "disable");
     rootElement.setAttribute("transform", "translate(10,10)");
   }
 
   SimpleTest.finish();
 }
 
 $(svg).addEventListener("load", runTests);
+$(svg).setAttribute("src", "fragments-helper.svg");
 </script>
 </pre>
 </body>
 </html>
--- a/gfx/layers/ipc/CompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CompositorBridgeParent.cpp
@@ -1680,20 +1680,22 @@ CompositorBridgeParent::RecvMapAndNotify
 
 mozilla::ipc::IPCResult
 CompositorBridgeParent::RecvAdoptChild(const uint64_t& child)
 {
   RefPtr<APZSampler> oldApzSampler;
   APZCTreeManagerParent* parent;
   {
     MonitorAutoLock lock(*sIndirectLayerTreesLock);
-    // We currently don't support adopting children from one compositor to
-    // another if the two compositors don't have the same options.
-    MOZ_ASSERT(sIndirectLayerTrees[child].mParent->mOptions == mOptions);
-    oldApzSampler = sIndirectLayerTrees[child].mParent->mApzSampler;
+    if (sIndirectLayerTrees[child].mParent) {
+      // We currently don't support adopting children from one compositor to
+      // another if the two compositors don't have the same options.
+      MOZ_ASSERT(sIndirectLayerTrees[child].mParent->mOptions == mOptions);
+      oldApzSampler = sIndirectLayerTrees[child].mParent->mApzSampler;
+    }
     NotifyChildCreated(child);
     if (sIndirectLayerTrees[child].mLayerTree) {
       sIndirectLayerTrees[child].mLayerTree->SetLayerManager(mLayerManager, GetAnimationStorage());
       // Trigger composition to handle a case that mLayerTree was not composited yet
       // by previous CompositorBridgeParent, since nsRefreshDriver might wait composition complete.
       ScheduleComposition();
     }
     if (mWrBridge && sIndirectLayerTrees[child].mWrBridge) {
--- a/netwerk/base/moz.build
+++ b/netwerk/base/moz.build
@@ -122,17 +122,16 @@ XPIDL_SOURCES += [
     'nsITransport.idl',
     'nsIUDPSocket.idl',
     'nsIUnicharStreamLoader.idl',
     'nsIUploadChannel.idl',
     'nsIUploadChannel2.idl',
     'nsIURI.idl',
     'nsIURIClassifier.idl',
     'nsIURIMutator.idl',
-    'nsIURIWithBlobImpl.idl',
     'nsIURIWithPrincipal.idl',
     'nsIURL.idl',
     'nsIURLParser.idl',
     'nsPILoadGroupInternal.idl',
     'nsPISocketTransportService.idl',
 ]
 
 if CONFIG['MOZ_TOOLKIT_SEARCH']:
deleted file mode 100644
--- a/netwerk/base/nsIURIWithBlobImpl.idl
+++ /dev/null
@@ -1,40 +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/. */
-
-#include "nsISupports.idl"
-
-interface nsIURI;
-
-%{C++
-namespace mozilla {
-namespace dom {
-  class BlobImpl;
-}}
-%}
-
-[ptr] native BlobImplPtr(mozilla::dom::BlobImpl);
-
-/**
- * nsIURIWithBlobImpl is implemented by URIs which are associated with a
- * specific BlobImpl.
- */
-[builtinclass, builtinclass, uuid(331b41d3-3506-4ab5-bef9-aab41e3202a3)]
-interface nsIURIWithBlobImpl : nsISupports
-{
-    /**
-     * The BlobImpl associated with the resource returned when loading this uri.
-     */
-    readonly attribute nsISupports blobImpl;
-};
-
-[builtinclass, uuid(d3e8c9fa-ff07-47cc-90dc-0cc5445ddb59)]
-interface nsIBlobURIMutator : nsISupports
-{
-    /**
-     * Associates a blobImpl to the mutated URI.
-     * Would normally return nsIURIMutator, but since it only gets called
-     * from C++, there is no need for that.
-     */
-    [must_use, noscript] void setBlobImpl(in BlobImplPtr blobImpl);
-};
--- a/python/mozbuild/mozbuild/artifacts.py
+++ b/python/mozbuild/mozbuild/artifacts.py
@@ -421,16 +421,17 @@ class MacArtifactJob(ArtifactJob):
 class WinArtifactJob(ArtifactJob):
     package_artifact_patterns = {
         'firefox/dependentlibs.list',
         'firefox/platform.ini',
         'firefox/application.ini',
         'firefox/**/*.dll',
         'firefox/*.exe',
         'firefox/**/interfaces.xpt',
+        'firefox/*.tlb',
     }
 
     product = 'firefox'
 
     # These are a subset of TEST_HARNESS_BINS in testing/mochitest/Makefile.in.
     test_artifact_patterns = {
         ('bin/BadCertServer.exe', ('bin', 'bin')),
         ('bin/GenerateOCSPResponse.exe', ('bin', 'bin')),
--- a/python/mozbuild/mozbuild/backend/common.py
+++ b/python/mozbuild/mozbuild/backend/common.py
@@ -22,30 +22,37 @@ from mozbuild.frontend.data import (
     BaseProgram,
     ChromeManifestEntry,
     ConfigFileSubstitution,
     Exports,
     FinalTargetPreprocessedFiles,
     FinalTargetFiles,
     GeneratedSources,
     GnProjectData,
+    HostLibrary,
+    HostRustLibrary,
     IPDLCollection,
+    RustLibrary,
     SharedLibrary,
+    StaticLibrary,
     UnifiedSources,
     XPIDLFile,
     WebIDLCollection,
 )
 from mozbuild.jar import (
     DeprecatedJarManifest,
     JarManifestParser,
 )
 from mozbuild.preprocessor import Preprocessor
 from mozpack.chrome.manifest import parse_manifest_line
 
-from mozbuild.util import group_unified_files
+from mozbuild.util import (
+    group_unified_files,
+    mkdir,
+)
 
 class XPIDLManager(object):
     """Helps manage XPCOM IDLs in the context of the build system."""
     def __init__(self, config):
         self.config = config
         self.topsrcdir = config.topsrcdir
         self.topobjdir = config.topobjdir
 
@@ -191,16 +198,103 @@ class CommonBackend(BuildBackend):
 
         # Write out a file listing generated sources.
         with self._write_file(mozpath.join(topobjdir, 'generated-sources.json')) as fh:
             d = {
                 'sources': sorted(self._generated_sources),
             }
             json.dump(d, fh, sort_keys=True, indent=4)
 
+    def _expand_libs(self, input_bin):
+        os_libs = []
+        shared_libs = []
+        static_libs = []
+        objs = []
+        no_pgo_objs = []
+
+        seen_objs = set()
+        seen_libs = set()
+
+        def add_objs(lib):
+            for o in lib.objs:
+                if o not in seen_objs:
+                    seen_objs.add(o)
+                    objs.append(o)
+                    # This is slightly odd, buf for consistency with the
+                    # recursivemake backend we don't replace OBJ_SUFFIX if any
+                    # object in a library has `no_pgo` set.
+                    if lib.no_pgo_objs or lib.no_pgo:
+                        no_pgo_objs.append(o)
+
+        def expand(lib, recurse_objs, system_libs):
+            if isinstance(lib, StaticLibrary):
+                if lib.no_expand_lib:
+                    static_libs.append(lib)
+                    recurse_objs = False
+                elif recurse_objs:
+                    add_objs(lib)
+
+                for l in lib.linked_libraries:
+                    expand(l, recurse_objs, system_libs)
+
+                if system_libs:
+                    for l in lib.linked_system_libs:
+                        if l not in seen_libs:
+                            seen_libs.add(l)
+                            os_libs.append(l)
+
+            elif isinstance(lib, SharedLibrary):
+                if lib not in seen_libs:
+                    seen_libs.add(lib)
+                    shared_libs.append(lib)
+
+        add_objs(input_bin)
+
+        system_libs = not isinstance(input_bin, StaticLibrary)
+        for lib in input_bin.linked_libraries:
+            if isinstance(lib, RustLibrary):
+                continue
+            elif isinstance(lib, StaticLibrary):
+                expand(lib, True, system_libs)
+            elif isinstance(lib, SharedLibrary):
+                if lib not in seen_libs:
+                    seen_libs.add(lib)
+                    shared_libs.append(lib)
+
+        for lib in input_bin.linked_system_libs:
+            if lib not in seen_libs:
+                seen_libs.add(lib)
+                os_libs.append(lib)
+
+        return objs, no_pgo_objs, shared_libs, os_libs, static_libs
+
+    def _make_list_file(self, objdir, objs, name):
+        if not objs:
+            return None
+        list_style = self.environment.substs.get('EXPAND_LIBS_LIST_STYLE')
+        list_file_path = mozpath.join(objdir, name)
+        objs = [os.path.relpath(o, objdir) for o in objs]
+        if list_style == 'linkerscript':
+            ref = list_file_path
+            content = '\n'.join('INPUT("%s")' % o for o in objs)
+        elif list_style == 'filelist':
+            ref = "-Wl,-filelist," + list_file_path
+            content = '\n'.join(objs)
+        elif list_style == 'list':
+            ref = "@" + list_file_path
+            content = '\n'.join(objs)
+        else:
+            return None
+
+        mkdir(objdir)
+        with self._write_file(list_file_path) as fh:
+            fh.write(content)
+
+        return ref
+
     def _handle_generated_sources(self, files):
         self._generated_sources.update(mozpath.relpath(f, self.environment.topobjdir) for f in files)
 
     def _handle_webidl_collection(self, webidls):
 
         bindings_dir = mozpath.join(self.environment.topobjdir, 'dom', 'bindings')
 
         all_inputs = set(webidls.all_static_sources())
--- a/python/mozbuild/mozbuild/backend/recursivemake.py
+++ b/python/mozbuild/mozbuild/backend/recursivemake.py
@@ -1319,77 +1319,113 @@ class RecursiveMakeBackend(CommonBackend
     def _process_host_library(self, libdef, backend_file):
         backend_file.write('HOST_LIBRARY_NAME = %s\n' % libdef.basename)
 
     def _build_target_for_obj(self, obj):
         return '%s/%s' % (mozpath.relpath(obj.objdir,
             self.environment.topobjdir), obj.KIND)
 
     def _process_linked_libraries(self, obj, backend_file):
-        def write_shared_and_system_libs(lib):
-            for l in lib.linked_libraries:
-                if isinstance(l, (StaticLibrary, RustLibrary)):
-                    write_shared_and_system_libs(l)
-                else:
-                    backend_file.write_once('SHARED_LIBS += %s/%s\n'
-                        % (pretty_relpath(l), l.import_name))
-            for l in lib.linked_system_libs:
-                backend_file.write_once('OS_LIBS += %s\n' % l)
-
         def pretty_relpath(lib):
             return '$(DEPTH)/%s' % mozpath.relpath(lib.objdir, topobjdir)
 
         topobjdir = mozpath.normsep(obj.topobjdir)
         # This will create the node even if there aren't any linked libraries.
         build_target = self._build_target_for_obj(obj)
         self._compile_graph[build_target]
 
+        objs, no_pgo_objs, shared_libs, os_libs, static_libs = self._expand_libs(obj)
+
+        if obj.KIND == 'target':
+            obj_target = obj.name
+            if isinstance(obj, Program):
+                obj_target = self._pretty_path(obj.output_path, backend_file)
+
+            is_unit_test = isinstance(obj, BaseProgram) and obj.is_unit_test
+            profile_gen_objs = []
+
+            if (self.environment.substs.get('MOZ_PGO') and
+                self.environment.substs.get('GNU_CC')):
+                # We use a different OBJ_SUFFIX for the profile generate phase on
+                # linux. These get picked up via OBJS_VAR_SUFFIX in config.mk.
+                if not is_unit_test and not isinstance(obj, SimpleProgram):
+                    profile_gen_objs = [o if o in no_pgo_objs else '%s.%s' %
+                                        (mozpath.splitext(o)[0], 'i_o') for o in objs]
+
+            def write_obj_deps(target, objs_ref, pgo_objs_ref):
+                if pgo_objs_ref:
+                    backend_file.write('ifdef MOZ_PROFILE_GENERATE\n')
+                    backend_file.write('%s: %s\n' % (target, pgo_objs_ref))
+                    backend_file.write('else\n')
+                    backend_file.write('%s: %s\n' % (target, objs_ref))
+                    backend_file.write('endif\n')
+                else:
+                    backend_file.write('%s: %s\n' % (target, objs_ref))
+
+            objs_ref = ' \\\n    '.join(os.path.relpath(o, obj.objdir)
+                                        for o in objs)
+            pgo_objs_ref = ' \\\n    '.join(os.path.relpath(o, obj.objdir)
+                                            for o in profile_gen_objs)
+            # Don't bother with a list file if we're only linking objects built
+            # in this directory or building a real static library. This
+            # accommodates clang-plugin, where we would otherwise pass an
+            # incorrect list file format to the host compiler as well as when
+            # creating an archive with AR, which doesn't understand list files.
+            if (objs == obj.objs and not isinstance(obj, StaticLibrary) or
+              isinstance(obj, StaticLibrary) and obj.no_expand_lib):
+                backend_file.write_once('%s_OBJS := %s\n' % (obj.name,
+                                                             objs_ref))
+                if profile_gen_objs:
+                    backend_file.write_once('%s_PGO_OBJS := %s\n' % (obj.name,
+                                                                     pgo_objs_ref))
+                write_obj_deps(obj_target, objs_ref, pgo_objs_ref)
+            elif not isinstance(obj, StaticLibrary):
+                list_file_path = '%s.list' % obj.name.replace('.', '_')
+                list_file_ref = self._make_list_file(obj.objdir, objs,
+                                                     list_file_path)
+                backend_file.write_once('%s_OBJS := %s\n' %
+                                        (obj.name, list_file_ref))
+                backend_file.write_once('%s: %s\n' % (obj_target, list_file_path))
+                if profile_gen_objs:
+                    pgo_list_file_path = '%s_pgo.list' % obj.name.replace('.', '_')
+                    pgo_list_file_ref = self._make_list_file(obj.objdir,
+                                                             profile_gen_objs,
+                                                             pgo_list_file_path)
+                    backend_file.write_once('%s_PGO_OBJS := %s\n' %
+                                            (obj.name, pgo_list_file_ref))
+                    backend_file.write_once('%s: %s\n' % (obj_target,
+                                                          pgo_list_file_path))
+                write_obj_deps(obj_target, objs_ref, pgo_objs_ref)
+
+        for lib in shared_libs:
+            backend_file.write_once('SHARED_LIBS += %s/%s\n' %
+                                    (pretty_relpath(lib), lib.import_name))
+        for lib in static_libs:
+            backend_file.write_once('STATIC_LIBS += %s/%s\n' %
+                                    (pretty_relpath(lib), lib.import_name))
+        for lib in os_libs:
+            if obj.KIND == 'target':
+                backend_file.write_once('OS_LIBS += %s\n' % lib)
+            else:
+                backend_file.write_once('HOST_EXTRA_LIBS += %s\n' % lib)
+
         for lib in obj.linked_libraries:
             if not isinstance(lib, ExternalLibrary):
                 self._compile_graph[build_target].add(
                     self._build_target_for_obj(lib))
-            relpath = pretty_relpath(lib)
-            if isinstance(obj, Library):
-                if isinstance(lib, RustLibrary):
-                    # We don't need to do anything here; we will handle
-                    # linkage for any RustLibrary elsewhere.
-                    continue
-                elif isinstance(lib, StaticLibrary):
-                    backend_file.write_once('STATIC_LIBS += %s/%s\n'
-                                        % (relpath, lib.import_name))
-                    if isinstance(obj, SharedLibrary):
-                        write_shared_and_system_libs(lib)
-                elif isinstance(obj, SharedLibrary):
-                    backend_file.write_once('SHARED_LIBS += %s/%s\n'
-                                        % (relpath, lib.import_name))
-            elif isinstance(obj, (Program, SimpleProgram)):
-                if isinstance(lib, StaticLibrary):
-                    backend_file.write_once('STATIC_LIBS += %s/%s\n'
-                                        % (relpath, lib.import_name))
-                    write_shared_and_system_libs(lib)
-                else:
-                    backend_file.write_once('SHARED_LIBS += %s/%s\n'
-                                        % (relpath, lib.import_name))
-            elif isinstance(obj, (HostLibrary, HostProgram, HostSimpleProgram)):
-                assert isinstance(lib, (HostLibrary, HostRustLibrary))
-                backend_file.write_once('HOST_LIBS += %s/%s\n'
-                                   % (relpath, lib.import_name))
+            if isinstance(lib, (HostLibrary, HostRustLibrary)):
+                backend_file.write_once('HOST_LIBS += %s/%s\n' %
+                                        (pretty_relpath(lib), lib.import_name))
 
         # We have to link any Rust libraries after all intermediate static
         # libraries have been listed to ensure that the Rust libraries are
         # searched after the C/C++ objects that might reference Rust symbols.
         if isinstance(obj, SharedLibrary):
             self._process_rust_libraries(obj, backend_file, pretty_relpath)
 
-        for lib in obj.linked_system_libs:
-            if obj.KIND == 'target':
-                backend_file.write_once('OS_LIBS += %s\n' % lib)
-            else:
-                backend_file.write_once('HOST_EXTRA_LIBS += %s\n' % lib)
-
         # Process library-based defines
         self._process_defines(obj.lib_defines, backend_file)
 
     def _process_rust_libraries(self, obj, backend_file, pretty_relpath):
         assert isinstance(obj, SharedLibrary)
 
         # If this library does not depend on any Rust libraries, then we are done.
         direct_linked = [l for l in obj.linked_libraries if isinstance(l, RustLibrary)]
--- a/python/mozbuild/mozbuild/frontend/data.py
+++ b/python/mozbuild/mozbuild/frontend/data.py
@@ -383,26 +383,30 @@ class LinkageMultipleRustLibrariesError(
 
 class Linkable(ContextDerived):
     """Generic context derived container object for programs and libraries"""
     __slots__ = (
         'cxx_link',
         'lib_defines',
         'linked_libraries',
         'linked_system_libs',
+        'no_pgo_sources',
+        'no_pgo',
         'sources',
     )
 
     def __init__(self, context):
         ContextDerived.__init__(self, context)
         self.cxx_link = False
         self.linked_libraries = []
         self.linked_system_libs = []
         self.lib_defines = Defines(context, {})
         self.sources = defaultdict(list)
+        self.no_pgo_sources = []
+        self.no_pgo = False
 
     def link_library(self, obj):
         assert isinstance(obj, BaseLibrary)
         if obj.KIND != self.KIND:
             raise LinkageWrongKindError('%s != %s' % (obj.KIND, self.KIND))
         # Linking multiple Rust libraries into an object would result in
         # multiple copies of the Rust standard library, as well as linking
         # errors from duplicate symbols.
@@ -432,26 +436,33 @@ class Linkable(ContextDerived):
     def source_files(self):
         all_sources = []
         # This is ordered for reproducibility and consistently w/
         # config/rules.mk
         for suffix in ('.c', '.S', '.cpp', '.m', '.mm', '.s'):
             all_sources += self.sources.get(suffix, [])
         return all_sources
 
-    @property
-    def objs(self):
+    def _get_objs(self, sources):
         obj_prefix = ''
         if self.KIND == 'host':
             obj_prefix = 'host_'
 
         return [mozpath.join(self.objdir, '%s%s.%s' % (obj_prefix,
                                                        mozpath.splitext(mozpath.basename(f))[0],
                                                        self.config.substs.get('OBJ_SUFFIX', '')))
-                for f in self.source_files()]
+                for f in sources]
+
+    @property
+    def no_pgo_objs(self):
+        return self._get_objs(self.no_pgo_sources)
+
+    @property
+    def objs(self):
+        return self._get_objs(self.source_files())
 
 
 class BaseProgram(Linkable):
     """Context derived container object for programs, which is a unicode
     string.
 
     This class handles automatically appending a binary suffix to the program
     name.
@@ -482,16 +493,20 @@ class BaseProgram(Linkable):
         if self.installed:
             return ObjDirPath(self._context, '!/' + mozpath.join(self.install_target, self.program))
         else:
             return ObjDirPath(self._context, '!' + self.program)
 
     def __repr__(self):
         return '<%s: %s/%s>' % (type(self).__name__, self.relobjdir, self.program)
 
+    @property
+    def name(self):
+        return self.program
+
 
 class Program(BaseProgram):
     """Context derived container object for PROGRAM"""
     SUFFIX_VAR = 'BIN_SUFFIX'
     KIND = 'target'
 
 
 class HostProgram(HostMixin, BaseProgram):
@@ -596,16 +611,20 @@ class BaseLibrary(Linkable):
             )
             self.import_name = self.lib_name
 
         self.refs = []
 
     def __repr__(self):
         return '<%s: %s/%s>' % (type(self).__name__, self.relobjdir, self.lib_name)
 
+    @property
+    def name(self):
+        return self.lib_name
+
 
 class Library(BaseLibrary):
     """Context derived container object for a library"""
     KIND = 'target'
     __slots__ = (
     )
 
     def __init__(self, context, basename, real_name=None):
--- a/python/mozbuild/mozbuild/frontend/emitter.py
+++ b/python/mozbuild/mozbuild/frontend/emitter.py
@@ -946,16 +946,20 @@ class TreeMetadataEmitter(LoggingMixin):
                     ctxt_sources[variable][canonical_suffix] += sorted(srcs)
                     yield obj
 
         if ctxt_sources:
             for linkable in linkables:
                 for target_var in ('SOURCES', 'UNIFIED_SOURCES'):
                     for suffix, srcs in ctxt_sources[target_var].items():
                         linkable.sources[suffix] += srcs
+                if no_pgo_sources:
+                    linkable.no_pgo_sources = no_pgo_sources
+                elif no_pgo:
+                    linkable.no_pgo = True
             for host_linkable in host_linkables:
                 for suffix, srcs in ctxt_sources['HOST_SOURCES'].items():
                     host_linkable.sources[suffix] += srcs
 
         for f, flags in all_flags.iteritems():
             if flags.flags:
                 ext = mozpath.splitext(f)[1]
                 yield PerSourceFlag(context, f, flags.flags)
--- a/python/mozbuild/mozbuild/test/backend/common.py
+++ b/python/mozbuild/mozbuild/test/backend/common.py
@@ -200,16 +200,28 @@ CONFIGS = defaultdict(lambda: {
     'program-paths': {
         'defines': {},
         'non_global_defines': [],
         'substs': {
             'COMPILE_ENVIRONMENT': '1',
             'BIN_SUFFIX': '.prog',
         },
     },
+    'linkage': {
+        'defines': {},
+        'non_global_defines': [],
+        'substs': {
+            'COMPILE_ENVIRONMENT': '1',
+            'LIB_SUFFIX': 'a',
+            'BIN_SUFFIX': '.exe',
+            'DLL_SUFFIX': '.so',
+            'OBJ_SUFFIX': 'o',
+            'EXPAND_LIBS_LIST_STYLE': 'list',
+        },
+    },
 })
 
 
 class BackendTester(unittest.TestCase):
     def setUp(self):
         self._old_env = dict(os.environ)
         os.environ.pop('MOZ_OBJDIR', None)
 
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/moz.build
@@ -0,0 +1,11 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+include('templates.mozbuild')
+
+DIRS += [
+     'real',
+     'shared',
+     'prog',
+     'static',
+]
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/prog/moz.build
@@ -0,0 +1,11 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+DIRS += ['qux']
+
+Program('MyProgram')
+
+USE_LIBS += [
+    'bar',
+    'baz',
+]
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/prog/qux/moz.build
@@ -0,0 +1,6 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+SOURCES += ['qux1.c']
+
+SharedLibrary('qux')
\ No newline at end of file
new file mode 100644
new file mode 100644
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/real/foo/moz.build
@@ -0,0 +1,9 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+SOURCES += [
+    'foo1.c',
+    'foo2.c'
+]
+
+FINAL_LIBRARY = 'foo'
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/real/moz.build
@@ -0,0 +1,14 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+DIRS += [
+    'foo',
+]
+
+NO_EXPAND_LIBS = True
+
+OS_LIBS += ['-lbaz']
+
+USE_LIBS += ['static:baz']
+
+Library('foo')
\ No newline at end of file
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/shared/baz/moz.build
@@ -0,0 +1,6 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+SOURCES += ['baz1.c']
+
+FINAL_LIBRARY = 'baz'
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/shared/moz.build
@@ -0,0 +1,14 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+DIRS += [
+    'baz',
+]
+
+STATIC_LIBRARY_NAME = 'baz_s'
+FORCE_STATIC_LIB = True
+
+OS_LIBS += ['-lfoo']
+USE_LIBS += ['qux']
+
+SharedLibrary('baz')
\ No newline at end of file
new file mode 100644
new file mode 100644
new file mode 100644
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/static/bar/bar_helper/moz.build
@@ -0,0 +1,8 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+SOURCES += [
+    'bar_helper1.cpp',
+]
+
+FINAL_LIBRARY = 'bar'
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/static/bar/moz.build
@@ -0,0 +1,13 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+SOURCES += [
+    'bar1.cc',
+    'bar2.cc',
+]
+
+DIRS += [
+    'bar_helper',
+]
+
+FINAL_LIBRARY = 'bar'
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/static/moz.build
@@ -0,0 +1,12 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+DIRS += [
+    'bar',
+]
+
+USE_LIBS += ['foo']
+
+OS_LIBS += ['-lbar']
+
+Library('bar')
new file mode 100644
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/data/linkage/templates.mozbuild
@@ -0,0 +1,23 @@
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+@template
+def Library(name):
+    LIBRARY_NAME = name
+
+@template
+def SharedLibrary(name):
+    FORCE_SHARED_LIB = True
+    LIBRARY_NAME = name
+
+@template
+def Binary():
+    # Add -lfoo for testing purposes.
+    OS_LIBS += ['foo']
+
+
+@template
+def Program(name):
+    PROGRAM = name
+
+    Binary()
\ No newline at end of file
--- a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
+++ b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
@@ -1045,16 +1045,83 @@ class TestRecursiveMakeBackend(BackendTe
 
         with open(os.path.join(env.topobjdir, 'cxx-library', 'backend.mk'), 'rb') as fh:
             lines = fh.readlines()
             lines = [line.rstrip() for line in lines]
 
             for line in lines:
                 self.assertNotIn('LIB_IS_C_ONLY', line)
 
+    def test_linkage(self):
+        env = self._consume('linkage', RecursiveMakeBackend)
+        expected_linkage = {
+            'prog': {
+                'SHARED_LIBS': ['$(DEPTH)/prog/qux/qux.so',
+                                '$(DEPTH)/shared/baz.so'],
+                'STATIC_LIBS': ['$(DEPTH)/real/foo.a'],
+                'OS_LIBS': ['-lfoo', '-lbaz', '-lbar'],
+            },
+            'shared': {
+                'OS_LIBS': ['-lfoo'],
+                'SHARED_LIBS': ['$(DEPTH)/prog/qux/qux.so'],
+                'STATIC_LIBS': [],
+            },
+            'static': {
+                'STATIC_LIBS': ['$(DEPTH)/real/foo.a'],
+                'OS_LIBS': ['-lbar'],
+                'SHARED_LIBS': ['$(DEPTH)/prog/qux/qux.so'],
+            },
+            'real': {
+                'STATIC_LIBS': [],
+                'SHARED_LIBS': ['$(DEPTH)/prog/qux/qux.so'],
+                'OS_LIBS': ['-lbaz'],
+            }
+        }
+        actual_linkage = {}
+        for name in expected_linkage.keys():
+            with open(os.path.join(env.topobjdir, name, 'backend.mk'), 'rb') as fh:
+                actual_linkage[name] = [line.rstrip() for line in fh.readlines()]
+        for name in expected_linkage:
+            for var in expected_linkage[name]:
+                for val in expected_linkage[name][var]:
+                    line = '%s += %s' % (var, val)
+                    self.assertIn(line,
+                                  actual_linkage[name])
+                    actual_linkage[name].remove(line)
+                for line in actual_linkage[name]:
+                    self.assertNotIn('%s +=' % var, line)
+
+    def test_list_files(self):
+        env = self._consume('linkage', RecursiveMakeBackend)
+        expected_list_files = {
+            'prog/MyProgram_exe.list': [
+                '../static/bar/bar1.o',
+                '../static/bar/bar2.o',
+                '../static/bar/bar_helper/bar_helper1.o',
+            ],
+            'shared/baz_so.list': [
+                'baz/baz1.o',
+            ],
+        }
+        actual_list_files = {}
+        for name in expected_list_files.keys():
+            with open(os.path.join(env.topobjdir, name), 'rb') as fh:
+                actual_list_files[name] = [mozpath.normsep(line.rstrip())
+                                           for line in fh.readlines()]
+        for name in expected_list_files:
+            self.assertEqual(actual_list_files[name],
+                             expected_list_files[name])
+
+        # We don't produce a list file for a shared library composed only of
+        # object files in its directory, but instead list them in a variable.
+        with open(os.path.join(env.topobjdir, 'prog', 'qux', 'backend.mk'), 'rb') as fh:
+            lines = [line.rstrip() for line in fh.readlines()]
+
+        self.assertIn('qux.so_OBJS := qux1.o', lines)
+
     def test_jar_manifests(self):
         env = self._consume('jar-manifests', RecursiveMakeBackend)
 
         with open(os.path.join(env.topobjdir, 'backend.mk'), 'rb') as fh:
             lines = fh.readlines()
 
         lines = [line.rstrip() for line in lines]
 
--- a/python/mozbuild/mozbuild/test/frontend/test_emitter.py
+++ b/python/mozbuild/mozbuild/test/frontend/test_emitter.py
@@ -668,16 +668,20 @@ class TestEmitterBasic(unittest.TestCase
         self.assertIsInstance(objs[3], Program)
         self.assertIsInstance(objs[4], SimpleProgram)
         self.assertIsInstance(objs[5], SimpleProgram)
 
         self.assertEqual(objs[3].program, 'test_program.prog')
         self.assertEqual(objs[4].program, 'test_program1.prog')
         self.assertEqual(objs[5].program, 'test_program2.prog')
 
+        self.assertEqual(objs[3].name, 'test_program.prog')
+        self.assertEqual(objs[4].name, 'test_program1.prog')
+        self.assertEqual(objs[5].name, 'test_program2.prog')
+
         self.assertEqual(objs[4].objs,
                          [mozpath.join(reader.config.topobjdir,
                                        'test_program1.%s' %
                                        reader.config.substs['OBJ_SUFFIX'])])
         self.assertEqual(objs[5].objs,
                          [mozpath.join(reader.config.topobjdir,
                                        'test_program2.%s' %
                                        reader.config.substs['OBJ_SUFFIX'])])
@@ -1195,19 +1199,25 @@ class TestEmitterBasic(unittest.TestCase
 
     def test_linkables_cxx_link(self):
         """Test that linkables transitively set cxx_link properly."""
         reader = self.reader('test-linkables-cxx-link')
         got_results = 0
         for obj in self.read_topsrcdir(reader):
             if isinstance(obj, SharedLibrary):
                 if obj.basename == 'cxx_shared':
+                    self.assertEquals(obj.name, '%scxx_shared%s' %
+                                      (reader.config.dll_prefix,
+                                       reader.config.dll_suffix))
                     self.assertTrue(obj.cxx_link)
                     got_results += 1
                 elif obj.basename == 'just_c_shared':
+                    self.assertEquals(obj.name, '%sjust_c_shared%s' %
+                                      (reader.config.dll_prefix,
+                                       reader.config.dll_suffix))
                     self.assertFalse(obj.cxx_link)
                     got_results += 1
         self.assertEqual(got_results, 2)
 
     def test_generated_sources(self):
         """Test that GENERATED_SOURCES works properly."""
         reader = self.reader('generated-sources')
         objs = self.read_topsrcdir(reader)
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1158,9 +1158,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 = 485;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1530043637929000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1530130018442000);
--- a/security/manager/ssl/nsSTSPreloadList.errors
+++ b/security/manager/ssl/nsSTSPreloadList.errors
@@ -10,17 +10,17 @@ 0day.su: could not connect to host
 0i0.nl: could not connect to host
 0vi.org: could not connect to host
 0x52.org: could not connect to host
 0xaa55.me: could not connect to host
 1001.best: could not connect to host
 100onrainkajino.com: could not connect to host
 135vv.com: could not connect to host
 13826145000.com: could not connect to host
-166166.com: could not connect to host
+16164f.com: could not connect to host
 1888zr.com: could not connect to host
 1912x.com: could not connect to host
 1er-secours.ch: could not connect to host
 1gsoft.com: could not connect to host
 1nian.vip: could not connect to host
 1q365a.com: could not connect to host
 249cq.com: could not connect to host
 256k.me: could not connect to host
@@ -30,27 +30,27 @@ 2fl.me: could not connect to host
 2gen.com: could not connect to host
 330.net: could not connect to host
 360ds.co.in: could not connect to host
 38888msc.com: could not connect to host
 38blog.com: could not connect to host
 3dm.audio: could not connect to host
 3vlnaeet.cz: could not connect to host
 404.guide: could not connect to host
+404forest.com: could not connect to host
 41844.de: could not connect to host
 42t.ru: could not connect to host
 439191.com: could not connect to host
 47tech.com: could not connect to host
 4baby.com.br: could not connect to host
 4d2.xyz: could not connect to host
 4host.ch: could not connect to host
 4loc.us: could not connect to host
 4web-hosting.com: could not connect to host
 5000yz.com: could not connect to host
-517vpn.cn: could not connect to host
 52kb1.com: could not connect to host
 52neptune.com: could not connect to host
 5w5.la: could not connect to host
 68277.me: could not connect to host
 692b8c32.de: could not connect to host
 69mentor.com: could not connect to host
 6w6.la: could not connect to host
 7183.org: could not connect to host
@@ -62,24 +62,25 @@ 88laohu.cc: could not connect to host
 88laohu.com: could not connect to host
 8ackprotect.com: could not connect to host
 8ballbombom.uk: could not connect to host
 8t88.biz: could not connect to host
 91-freedom.com: could not connect to host
 99buffets.com: could not connect to host
 a-ix.net: could not connect to host
 aaron.xin: could not connect to host
+abi-2017.tk: could not connect to host
 abi-fvs.de: could not connect to host
 abigailstark.com: could not connect to host
-abilma.com: could not connect to host
 abloop.com: could not connect to host
 abolition.co: could not connect to host
 abstractbarista.com: could not connect to host
 abstractbarista.net: could not connect to host
 ac.milan.it: could not connect to host
+ac0g.dyndns.org: could not connect to host
 acat.io: could not connect to host
 accolade.com.br: could not connect to host
 accwing.com: could not connect to host
 acgaudio.com: could not connect to host
 achterhoekseveiligheidsbeurs.nl: could not connect to host
 acpinformatique.fr: could not connect to host
 acrossgw.com: could not connect to host
 activeclearweb.com: could not connect to host
@@ -89,17 +90,16 @@ adamcoffee.net: could not connect to hos
 adamdixon.co.uk: could not connect to host
 adec-emsa.ae: could not connect to host
 adrianajewelry.my: could not connect to host
 adult.properties: could not connect to host
 advaithnikhi.ml: could not connect to host
 advaithnikhi.tk: could not connect to host
 advanced-online.eu: could not connect to host
 adzie.xyz: could not connect to host
-aerobotz.com: could not connect to host
 aevpn.org: could not connect to host
 affiliateroyale.com: could not connect to host
 affily.io: could not connect to host
 afterstack.net: could not connect to host
 agdalieso.com.ba: could not connect to host
 agingstop.net: could not connect to host
 agoravm.tk: could not connect to host
 agowa.eu: could not connect to host
@@ -134,19 +134,19 @@ alldm.ru: could not connect to host
 alloutatl.com: could not connect to host
 allscammers.exposed: could not connect to host
 allthingsfpl.com: could not connect to host
 allthingssquared.com: could not connect to host
 alocato.com: could not connect to host
 alohapartyevents.co.uk: could not connect to host
 alpe-d-or.dyn-o-saur.com: could not connect to host
 alphabrock.cn: could not connect to host
+alphahunks.com: could not connect to host
 altahrim.net: could not connect to host
 altered.network: could not connect to host
-altitudemoversdenver.com: could not connect to host
 amdouglas.uk: could not connect to host
 ameho.me: could not connect to host
 americandistribuidora.com: could not connect to host
 amilum.org: could not connect to host
 amua.fr: could not connect to host
 amunoz.org: could not connect to host
 anadoluefessk.org: could not connect to host
 analyzemyfriends.com: could not connect to host
@@ -187,17 +187,16 @@ arnaudminable.net: could not connect to 
 arresttracker.com: could not connect to host
 arsenal.ru: could not connect to host
 arsk1.com: could not connect to host
 artea.ga: could not connect to host
 articaexports.com: could not connect to host
 artisense.de: could not connect to host
 artisticedgegranite.net: could not connect to host
 artofeyes.nl: could not connect to host
-asec01.net: could not connect to host
 aserver.co: could not connect to host
 ashleyadum.com: could not connect to host
 asphaltfruehling.de: could not connect to host
 asphyxia.su: could not connect to host
 aspisdata.com: could not connect to host
 asral7.com: could not connect to host
 assdecoeur.org: could not connect to host
 assindia.nl: could not connect to host
@@ -206,17 +205,16 @@ astrath.net: could not connect to host
 astrea-voetbal-groningen.nl: could not connect to host
 asuhe.win: could not connect to host
 asuhe.xyz: could not connect to host
 async.be: could not connect to host
 at1.co: could not connect to host
 athi.pl: could not connect to host
 atigerseye.com: could not connect to host
 atlas-5.site: could not connect to host
-aubg.org: could not connect to host
 aufmerksamkeitsstudie.com: could not connect to host
 augix.net: could not connect to host
 aur.rocks: could not connect to host
 ausec.ch: could not connect to host
 ausschreibungen-suedtirol.it: could not connect to host
 austinsutphin.com: could not connect to host
 australiancattle.dog: could not connect to host
 authint.com: could not connect to host
@@ -259,16 +257,17 @@ bbdos.ru: could not connect to host
 bbwteens.org: could not connect to host
 bcnet.com.hk: could not connect to host
 bcradio.org: could not connect to host
 bcrook.com: could not connect to host
 bdikaros-network.net: could not connect to host
 bdsmxxxpics.com: could not connect to host
 beamitapp.com: could not connect to host
 beasel.biz: could not connect to host
+beauty-italy.ru: could not connect to host
 beccajoshwedding.com: could not connect to host
 beersandco.ch: could not connect to host
 bellavistaoutdoor.com: could not connect to host
 belpbleibtbelp.ch: could not connect to host
 belwederczykow.eu: could not connect to host
 ben.ninja: could not connect to host
 benfairclough.com: could not connect to host
 benjamin-horvath.com: could not connect to host
@@ -286,17 +285,16 @@ bestellipticalmachinereview.info: could 
 bestfitnesswatchreview.info: could not connect to host
 besthotsales.com: could not connect to host
 betonmoney.com: could not connect to host
 bey.io: could not connect to host
 bezoomnyville.com: could not connect to host
 bfrailwayclub.cf: could not connect to host
 bianinapiccanovias.com: could not connect to host
 bichonmaltes.com.br: could not connect to host
-bierochs.org: could not connect to host
 bigerbio.com: could not connect to host
 billaud.eu.org: could not connect to host
 billigpoker.dk: could not connect to host
 binam.center: could not connect to host
 bingcheung.com: could not connect to host
 binimo.com: could not connect to host
 biou.me: could not connect to host
 biovalue.eu: could not connect to host
@@ -313,16 +311,17 @@ bitmaincare.ru: could not connect to hos
 bitmessage.ch: could not connect to host
 bityes.org: could not connect to host
 bjgongyi.com: could not connect to host
 bjtxl.cn: could not connect to host
 black-khat.com: could not connect to host
 blackberrycentral.com: could not connect to host
 blackdragoninc.org: could not connect to host
 blackscreen.me: could not connect to host
+blameomar.com: could not connect to host
 blantik.net: could not connect to host
 blazeit.io: could not connect to host
 blindaryproduction.tk: could not connect to host
 blinkenlight.co.uk: could not connect to host
 blinkenlight.com.au: could not connect to host
 blog.gparent.org: could not connect to host
 blogabout.ru: could not connect to host
 blogdieconomia.it: could not connect to host
@@ -343,17 +342,16 @@ boxdevigneron.fr: could not connect to h
 bpadvisors.eu: could not connect to host
 bqcp.net: could not connect to host
 bradkovach.com: could not connect to host
 bragaweb.com.br: could not connect to host
 brage.info: could not connect to host
 braintensive.com: could not connect to host
 brandontaylor-black.com: could not connect to host
 brianmwaters.net: could not connect to host
-brickwerks.io: could not connect to host
 brideandgroomdirect.ie: could not connect to host
 bridgeout.com: could not connect to host
 brinkmann.one: could not connect to host
 brio-ukraine.store: could not connect to host
 brookframework.org: could not connect to host
 brrr.fr: could not connect to host
 brynnan.nl: could not connect to host
 bsalyzer.com: could not connect to host
@@ -425,23 +423,24 @@ cctld.com: could not connect to host
 cdeck.net: could not connect to host
 cdlcenter.com: could not connect to host
 cdmhp.org.nz: could not connect to host
 cdmon.tech: could not connect to host
 cdnk39.com: could not connect to host
 cee.io: could not connect to host
 cegfw.com: could not connect to host
 cencalvia.org: could not connect to host
+centerforpolicy.org: could not connect to host
 centos.pub: could not connect to host
 centrallead.net: could not connect to host
 centrolavoro.org: could not connect to host
+certcenter.de: could not connect to host
 cgtx.us: could not connect to host
 challengeskins.com: could not connect to host
 championnat-romand-cuisiniers-amateurs.ch: could not connect to host
-chancat.blog: could not connect to host
 channellife.asia: could not connect to host
 chaouby.com: could not connect to host
 charge.co: could not connect to host
 charmyadesara.com: could not connect to host
 cheah.xyz: could not connect to host
 cheesefusion.com: could not connect to host
 cheltik.ru: could not connect to host
 chemicalguys-ruhrpott.de: could not connect to host
@@ -452,16 +451,17 @@ chinternet.xyz: could not connect to hos
 chloe.re: could not connect to host
 chocolat-suisse.ch: could not connect to host
 chorkley.me: could not connect to host
 chrisebert.net: could not connect to host
 christianhoffmann.info: could not connect to host
 christianpusch.de: could not connect to host
 christiansayswords.com: could not connect to host
 chromaryu.net: could not connect to host
+chua.family: could not connect to host
 chziyue.com: could not connect to host
 cipher.land: could not connect to host
 cipherli.st: could not connect to host
 cisy.me: could not connect to host
 citywalkr.com: could not connect to host
 ciuciucadou.ro: could not connect to host
 cjtkfan.club: could not connect to host
 ckcameron.net: could not connect to host
@@ -470,34 +470,32 @@ clearchatsandbox.com: could not connect 
 clearviewwealthprojector.com.au: could not connect to host
 clic-music.com: could not connect to host
 clickclock.cc: could not connect to host
 clickomobile.com: could not connect to host
 clintonbloodworth.com: could not connect to host
 cloudberlin.goip.de: could not connect to host
 cloudbleed.info: could not connect to host
 cloudimproved.com: could not connect to host
-cloudimprovedtest.com: could not connect to host
 cloudwarez.xyz: could not connect to host
 clownish.co.il: could not connect to host
 clycat.ru: could not connect to host
 cmcc.network: could not connect to host
 cmrss.com: could not connect to host
 cms-weble.jp: could not connect to host
 cmweller.com: could not connect to host
 cnetw.xyz: could not connect to host
 cnlic.com: could not connect to host
 cnwage.com: could not connect to host
 cnwarn.com: could not connect to host
 co-yutaka.com: could not connect to host
 cobaltlp.com: could not connect to host
 coccinellaskitchen.com: could not connect to host
 coccinellaskitchen.de: could not connect to host
 coccinellaskitchen.it: could not connect to host
-cocoaheads.at: could not connect to host
 codeloop.pw: could not connect to host
 codenlife.xyz: could not connect to host
 coderhangout.com: could not connect to host
 codewiz.xyz: could not connect to host
 cogumelosmagicos.org: could not connect to host
 colarelli.ch: could not connect to host
 colleencornez.com: could not connect to host
 collins.kg: could not connect to host
@@ -510,43 +508,43 @@ comicrelief.com: could not connect to ho
 compeuphoria.com: could not connect to host
 complex-organization.com: could not connect to host
 complt.xyz: could not connect to host
 comprehensiveihc.com: could not connect to host
 conception.sk: could not connect to host
 conniesacademy.com: could not connect to host
 conrad.am: could not connect to host
 constructive.men: could not connect to host
+consumeractionlawgroup.com: could not connect to host
 corecdn.org: could not connect to host
 corinnanese.de: could not connect to host
 correct.horse: could not connect to host
 cosmeticosdelivery.com.br: could not connect to host
 cosmeticosnet.com.br: could not connect to host
 cosmiatria.pe: could not connect to host
 cosplayer.com: could not connect to host
 cotta.dk: could not connect to host
 coumoul.fr: could not connect to host
 cpaneltips.com: could not connect to host
 crackslut.eu: could not connect to host
 craftination.net: could not connect to host
 craftydev.design: could not connect to host
 crashsec.com: could not connect to host
+creativecommonscatpictures.com: could not connect to host
 creato.top: could not connect to host
 credential.eu: could not connect to host
 cristianhares.com: could not connect to host
 criticalaim.com: could not connect to host
 crow.tw: could not connect to host
 crox.co: could not connect to host
 cryptoki.fr: could not connect to host
 cryptolosophy.io: could not connect to host
-cryptoparty.at: could not connect to host
 cryptoparty.dk: could not connect to host
 cryptopartynewcastle.org: could not connect to host
 cryptoshot.pw: could not connect to host
-crystalmachine.net: could not connect to host
 cselzer.com: could not connect to host
 csgo77.com: could not connect to host
 csilies.de: could not connect to host
 cunha.be: could not connect to host
 cuni-cuni-club.com: could not connect to host
 cuni-rec.com: could not connect to host
 cuonic.com: could not connect to host
 curacao-license.com: could not connect to host
@@ -604,16 +602,17 @@ dedietrich-asia.com: could not connect t
 deepcreampie.com: could not connect to host
 deeps.cat: could not connect to host
 deepsouthsounds.com: could not connect to host
 deloittequant.com: could not connect to host
 dengchangdong.com: could not connect to host
 depedtayo.ph: could not connect to host
 derchris.me: could not connect to host
 derivativeshub.pro: could not connect to host
+derive.cc: could not connect to host
 dermacarecomplex.com: could not connect to host
 dermapuur.nl: could not connect to host
 designsbykerrialee.co.uk: could not connect to host
 detalhecomercio.com.br: could not connect to host
 detecte-fuite.ch: could not connect to host
 detecte.ch: could not connect to host
 detectefuite.ch: could not connect to host
 devdesco.com: could not connect to host
@@ -655,42 +654,41 @@ distinctivephotography.com.au: could not
 distrilogservices.com: could not connect to host
 ditch.ch: could not connect to host
 dixmag.com: could not connect to host
 diyosun.com: could not connect to host
 diz.in.ua: could not connect to host
 djul.net: could not connect to host
 dlouwrink.nl: could not connect to host
 dlyl888.com: could not connect to host
-dn42.eu: could not connect to host
 dna.li: could not connect to host
 dnfc.rocks: could not connect to host
 dnmaze.com: could not connect to host
 dobrisan.ro: could not connect to host
 doctafit.com: could not connect to host
 docubox.info: could not connect to host
 doesmycodehavebugs.today: could not connect to host
 dogcratereview.info: could not connect to host
 dojifish.space: could not connect to host
 dolarcanadense.com.br: could not connect to host
 dolphin-hosting.com: could not connect to host
-domainoo.com: could not connect to host
 domengrad.ru: could not connect to host
 domfee.com: could not connect to host
 dongkexue.com: could not connect to host
 donotspellitgav.in: could not connect to host
 donovand.info: could not connect to host
 doopdidoop.com: could not connect to host
 dougferris.id.au: could not connect to host
 doyoulyft.com: could not connect to host
 doze-cloud.tech: could not connect to host
 dragonwork.me: could not connect to host
 dranderle.com: could not connect to host
 dreamaholic.club: could not connect to host
 dreaming.solutions: could not connect to host
+dreischneidiger.de: could not connect to host
 dreizwosechs.de: could not connect to host
 drinkplanet.eu: could not connect to host
 driving-lessons.co.uk: could not connect to host
 drivinghorror.com: could not connect to host
 drixn.cn: could not connect to host
 drixn.info: could not connect to host
 drixn.net: could not connect to host
 drizz.com.br: could not connect to host
@@ -726,16 +724,17 @@ effectiveosgi.com: could not connect to 
 eggplant.today: could not connect to host
 ehrlichesbier.de: could not connect to host
 ehuber.info: could not connect to host
 einhorn.space: could not connect to host
 einsatzstiefel.info: could not connect to host
 einsteinathome.org: could not connect to host
 ekobudisantoso.net: could not connect to host
 ekong366.com: could not connect to host
+electicofficial.com: could not connect to host
 electricalcontrolpanels.co.uk: could not connect to host
 elektronring.com: could not connect to host
 elenorsmadness.org: could not connect to host
 elepover.com: could not connect to host
 elevateandprosper.com: could not connect to host
 elitesensual.com.br: could not connect to host
 elonbase.com: could not connect to host
 elsword.moe: could not connect to host
@@ -752,20 +751,22 @@ empire24.co: could not connect to host
 emrenovation.com: could not connect to host
 endohaus.us: could not connect to host
 endspamwith.us: could not connect to host
 enoou.com: could not connect to host
 enpalmademallorca.info: could not connect to host
 enskat.de: could not connect to host
 enskatson-sippe.de: could not connect to host
 envelope.co.nz: could not connect to host
+eolme.ml: could not connect to host
 epichouse.net: could not connect to host
 er-music.com: could not connect to host
 erad.fr: could not connect to host
 erclab.kr: could not connect to host
+ericloud.tk: could not connect to host
 erigrid.eu: could not connect to host
 erspro.net: could not connect to host
 es888999.com: could not connect to host
 esoterik.link: could not connect to host
 essentialoilsimports.com: could not connect to host
 esseriumani.com: could not connect to host
 ethanfaust.com: could not connect to host
 etzi.myds.me: could not connect to host
@@ -773,23 +774,23 @@ euexia.fr: could not connect to host
 eung.ga: could not connect to host
 euph.eu: could not connect to host
 eurostrategy.vn.ua: could not connect to host
 evankurniawan.com: could not connect to host
 evasioncreole.com: could not connect to host
 eventaro.com: could not connect to host
 eventmake.es: could not connect to host
 everyarti.st: could not connect to host
+everygayporn.com: could not connect to host
 eveshaiwu.com: could not connect to host
 eworksmedia.com: could not connect to host
 exceptionalservices.us: could not connect to host
 exo.do: could not connect to host
 expoort.fr: could not connect to host
 exteriorservices.io: could not connect to host
-extratorrent.cool: could not connect to host
 extratorrent.fyi: could not connect to host
 extratorrent.red: could not connect to host
 extratorrent.world: could not connect to host
 eytosh.net: could not connect to host
 f1bigpicture.com: could not connect to host
 f8842.com: could not connect to host
 faber.org.ru: could not connect to host
 fabian-kluge.de: could not connect to host
@@ -808,17 +809,16 @@ falkus.net: could not connect to host
 fallenangeldrinks.eu: could not connect to host
 famer.me: could not connect to host
 fameuxhosting.co.uk: could not connect to host
 faretravel.co.uk: could not connect to host
 farm24.co.uk: could not connect to host
 farmacia.pt: could not connect to host
 fastaim.de: could not connect to host
 fastbackmbg.be: could not connect to host
-faxite.com: could not connect to host
 faxreader.net: could not connect to host
 fcapartsdb.com: could not connect to host
 feac.us: could not connect to host
 fedn.it: could not connect to host
 feedstringer.com: could not connect to host
 feirlane.org: could not connect to host
 feisbed.com: could not connect to host
 feist.io: could not connect to host
@@ -828,17 +828,16 @@ feras-alhajjaji.com: could not connect t
 fetclips.se: could not connect to host
 ff-bg.xyz: could not connect to host
 fhsseniormens.club: could not connect to host
 ficklenote.net: could not connect to host
 fierman.eu: [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 116"  data: no]
 fierman.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 116"  data: no]
 fierman.us: [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 116"  data: no]
 fifieldtech.com: could not connect to host
-figurasdelinguagem.com.br: could not connect to host
 figuurzagers.nl: [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 116"  data: no]
 filebox.space: could not connect to host
 fileio.io: could not connect to host
 filesense.com: could not connect to host
 findmybottleshop.com.au: could not connect to host
 findyour.diet: could not connect to host
 finstererlebnis.de: could not connect to host
 firexarxa.de: could not connect to host
@@ -849,48 +848,46 @@ fixmyglitch.com: could not connect to ho
 fixthetimeline.com: could not connect to host
 fixthetimeline.org: could not connect to host
 flam.io: could not connect to host
 flamingcow.tv: could not connect to host
 flexinvesting.fi: could not connect to host
 floth.at: could not connect to host
 flugplatz-edvc.de: could not connect to host
 flyingdoggy.net: could not connect to host
-fmovies.fyi: could not connect to host
 fmovies.life: could not connect to host
 focalforest.com: could not connect to host
 fognini-depablo.eu: could not connect to host
 fojing.com: could not connect to host
 foodserve.in: could not connect to host
 forcamp.ga: could not connect to host
 forsyththeatre.com: could not connect to host
 fortuna-loessnitz.de: could not connect to host
 foshanshequ.com: could not connect to host
 fossewayflowers.co.uk: could not connect to host
 fossewayflowers.com: could not connect to host
 foudufafa.de: could not connect to host
-foxmay.co.uk: could not connect to host
 foxyslut.com: could not connect to host
 fragnic.com: could not connect to host
 frank.fyi: could not connect to host
 franklinhua.com: could not connect to host
 franzt.ovh: could not connect to host
 freddieonfire.tk: could not connect to host
 fredliang.cn: could not connect to host
 fredtec.ru: could not connect to host
 free8.xyz: could not connect to host
 freeassangenow.org: could not connect to host
 freedomvote.nl: could not connect to host
 freejidi.com: could not connect to host
 freelansir.com: could not connect to host
 freesitemapgenerator.com: could not connect to host
+freesounding.ru: could not connect to host
 freshcode.nl: could not connect to host
 frickenate.com: could not connect to host
 friedhelm-wolf.de: could not connect to host
-friller.com.au: could not connect to host
 frodriguez.xyz: could not connect to host
 frolov.net: could not connect to host
 fromlemaytoz.com: could not connect to host
 frosty-gaming.xyz: could not connect to host
 frp-roleplay.de: could not connect to host
 fsfi.is: could not connect to host
 ftgho.com: could not connect to host
 fuckcf.cf: could not connect to host
@@ -933,22 +930,22 @@ gdhzcgs.com: could not connect to host
 gdz-otvety.com: could not connect to host
 ge1.me: could not connect to host
 gear-acquisition-syndrome.community: could not connect to host
 gearev.net: could not connect to host
 geeks.berlin: could not connect to host
 gehrke.nrw: could not connect to host
 geigr.de: could not connect to host
 geldteveel.eu: could not connect to host
-generalpants.com.au: could not connect to host
 generationnext.pl: could not connect to host
 geneve.guide: could not connect to host
 genia-life.de: could not connect to host
 genoog.com: could not connect to host
 genossen.ru: could not connect to host
+gerardobsd.com: could not connect to host
 geri.be: could not connect to host
 gers-authentique.com: could not connect to host
 geta.pub: could not connect to host
 getdigitized.net: could not connect to host
 getfilterlive.org: could not connect to host
 getgeek.dk: could not connect to host
 getgeek.ee: could not connect to host
 getgeek.fi: could not connect to host
@@ -986,42 +983,40 @@ goanalyse.co.uk: could not connect to ho
 godrealms.com: could not connect to host
 goiaspropaganda.com.br: could not connect to host
 goldfelt.com: could not connect to host
 gongjuhao.com: could not connect to host
 goodyearsotn.co.uk: could not connect to host
 google.ax: could not connect to host
 goranrango.ch: could not connect to host
 gorod74.ru: could not connect to host
-gosciencegirls.com: could not connect to host
 gottfridsberg.org: could not connect to host
 gouthro-goteborg.se: could not connect to host
 gozadentro.com: could not connect to host
 gpfclan.de: could not connect to host
 gradsm-ci.net: could not connect to host
 granth.io: could not connect to host
 graphite.org.uk: could not connect to host
 gratisonlinesex.com: could not connect to host
 greggsfoundation.org.uk: could not connect to host
 gregmartyn.com: could not connect to host
 greuel.online: could not connect to host
-greybit.net: could not connect to host
 greyhash.se: could not connect to host
 gritte.net: could not connect to host
 grossberger-ge.org: could not connect to host
 grossmisconduct.news: could not connect to host
 growingmetrics.com: could not connect to host
 grusenmeyer.be: could not connect to host
 gugaltika-ipb.org: could not connect to host
 guinea-pig.co: could not connect to host
-gummibande.noip.me: could not connect to host
 gunhunter.com: could not connect to host
 gus.moe: could not connect to host
 gutuia.blue: could not connect to host
 gvchannel.xyz: could not connect to host
+gviedu.com: could not connect to host
 gxgx.org: could not connect to host
 gzitech.net: could not connect to host
 gzpblog.com: could not connect to host
 h2cdn.cloud: could not connect to host
 h3artbl33d.nl: could not connect to host
 habeo.si: could not connect to host
 hackbubble.me: could not connect to host
 hackmeplz.com: could not connect to host
@@ -1033,16 +1028,18 @@ halta.info: could not connect to host
 hamking.tk: could not connect to host
 hammer-schnaps.com: could not connect to host
 hamu.blue: could not connect to host
 hanksservice.com: could not connect to host
 happytiger.eu: could not connect to host
 hapsfordmill.co.uk: could not connect to host
 hapvm.com: could not connect to host
 hardeman.nu: could not connect to host
+hardergayporn.com: could not connect to host
+hardfalcon.net: could not connect to host
 harrypottereditor.net: could not connect to host
 has-no-email-set.de: could not connect to host
 hasabig.wang: could not connect to host
 hasalittle.wang: could not connect to host
 hashimah.ca: could not connect to host
 hashplex.com: could not connect to host
 hatethe.uk: could not connect to host
 hbbet.com: could not connect to host
@@ -1086,17 +1083,17 @@ hjes.com.ve: could not connect to host
 hochzeitshelferlein.de: could not connect to host
 hoffens.se: could not connect to host
 hohm.in: could not connect to host
 holidayincotswolds.co.uk: could not connect to host
 holowaty.me: could not connect to host
 home-cloud.online: could not connect to host
 homesfordinner.ca: could not connect to host
 homoglyph.net: could not connect to host
-honeybeard.co.uk: could not connect to host
+hompus.nl: could not connect to host
 honeytracks.com: could not connect to host
 hoodoo.io: could not connect to host
 hoodoo.tech: could not connect to host
 hopglass.eu: could not connect to host
 hopglass.net: could not connect to host
 horvathd.eu: could not connect to host
 hosted-oswa.org: could not connect to host
 hostingfirst.nl: could not connect to host
@@ -1159,17 +1156,16 @@ imgencrypt.com: could not connect to hos
 imgul.net: could not connect to host
 imguoguo.com: could not connect to host
 imlinan.cn: could not connect to host
 imlinan.info: could not connect to host
 imlinan.net: could not connect to host
 imoner.ga: could not connect to host
 imperdintechnologies.com: could not connect to host
 impulse-clan.de: could not connect to host
-imy.life: could not connect to host
 increasetestosteronelevels.org: could not connect to host
 industreiler.com: could not connect to host
 industreiler.com.br: could not connect to host
 inexpensivecomputers.net: could not connect to host
 informatik.zone: could not connect to host
 infoworm.org: could not connect to host
 infruction.com: could not connect to host
 injust.eu.org: could not connect to host
@@ -1191,30 +1187,28 @@ intracom.com: could not connect to host
 invenio.software: could not connect to host
 investingdiary.cn: could not connect to host
 investorloanshub.com: could not connect to host
 iodu.re: could not connect to host
 ip.or.at: could not connect to host
 iphonechina.net: could not connect to host
 iplog.info: could not connect to host
 ipnetworking.net: could not connect to host
-irayo.net: could not connect to host
 irinkeby.nu: could not connect to host
 isamiok.com: could not connect to host
 isisfighters.info: could not connect to host
 isoroc-nidzica.pl: could not connect to host
 isscouncil.com: could not connect to host
 isslshop.com: could not connect to host
 isthefieldcontrolsystemdown.com: could not connect to host
 istherrienstillcoach.com: could not connect to host
 it-adminio.ru: could not connect to host
 itad.top: could not connect to host
 itnews-bg.com: could not connect to host
 itpro-mg.de: could not connect to host
-its-gutachten.de: could not connect to host
 its-schindler.de: could not connect to host
 itsatrap.nl: could not connect to host
 itsmejohn.org: could not connect to host
 ivanilla.org: could not connect to host
 ivanpolchenko.com: could not connect to host
 ivfmeds.com: could not connect to host
 ivyshop.com.br: could not connect to host
 iwex.swiss: could not connect to host
@@ -1262,16 +1256,17 @@ juliaoantiguidades.com.br: could not con
 juliawebber.co.za: could not connect to host
 jumbopan.com: could not connect to host
 jumbopan.net: could not connect to host
 jurriaan.ninja: could not connect to host
 just-pools.co.za: could not connect to host
 justinharrison.ca: could not connect to host
 justzz.xyz: could not connect to host
 juventusmania1897.com: could not connect to host
+kabus.org: could not connect to host
 kaika-facilitymanagement.de: could not connect to host
 kainz.be: could not connect to host
 kalender.goip.de: could not connect to host
 kaloix.de: could not connect to host
 kamalame.co: could not connect to host
 kamitech.ch: could not connect to host
 kandalife.com: could not connect to host
 kanganer.com: could not connect to host
@@ -1287,16 +1282,17 @@ kearney.io: could not connect to host
 keezin.ga: could not connect to host
 kellyandantony.com: could not connect to host
 kelm.me: could not connect to host
 kermadec.com: could not connect to host
 keshausconsulting.com: could not connect to host
 kevindekoninck.com: could not connect to host
 kevinfoley.cc: could not connect to host
 kevinfoley.org: could not connect to host
+kevinmeijer.nl: could not connect to host
 keyserver.sexy: could not connect to host
 kgb.us: could not connect to host
 kidbacker.com: could not connect to host
 kieranweightman.me: could not connect to host
 kievradio.com: could not connect to host
 kikuzuki.org: could not connect to host
 kinepolis-studio.ga: could not connect to host
 kingbird.me: could not connect to host
@@ -1322,17 +1318,16 @@ konventseliten.se: could not connect to 
 kopfsalat.eu: could not connect to host
 koppelvlak.net: could not connect to host
 kotitesti.fi: could not connect to host
 kotorimusic.ga: could not connect to host
 kozmik.co: could not connect to host
 krampus-fischamend.at: could not connect to host
 kriegskindernothilfe.de: could not connect to host
 kruin.net: could not connect to host
-ksero.center: could not connect to host
 ktube.yt: could not connect to host
 kubusadvocaten.nl: could not connect to host
 kuko-crews.org: could not connect to host
 kwikmed.eu: could not connect to host
 kwipi.com: could not connect to host
 kyberna.xyz: could not connect to host
 kyle.place: could not connect to host
 kylerwood.com: could not connect to host
@@ -1454,16 +1449,17 @@ luxvacuos.net: could not connect to host
 m-generator.com: could not connect to host
 m4570.xyz: could not connect to host
 m4g.ru: could not connect to host
 maartenterpstra.xyz: could not connect to host
 mach-politik.ch: could not connect to host
 madeintucson.org: could not connect to host
 madnetwork.org: could not connect to host
 madusecurity.com: could not connect to host
+magicball.co: could not connect to host
 magnacumlaude.co: could not connect to host
 maik-mahlow.de: could not connect to host
 mail4geek.com: could not connect to host
 mailon.ga: could not connect to host
 makeit-so.de: could not connect to host
 makeuplove.nl: could not connect to host
 malamutedoalasca.com.br: could not connect to host
 malesbdsm.com: could not connect to host
@@ -1520,25 +1516,27 @@ meetings2.com: could not connect to host
 megadrol.com: could not connect to host
 meizufans.eu: could not connect to host
 melenchatsmelenchiens.fr: could not connect to host
 melhorproduto.com.br: could not connect to host
 melodic.com.au: could not connect to host
 melody-lyrics.com: could not connect to host
 melonstudios.net: could not connect to host
 melpomene.me: could not connect to host
+melted.me: could not connect to host
 melvinlammerts.nl: could not connect to host
+memdoc.org: could not connect to host
 memepasmal.org: could not connect to host
 menchez.me: could not connect to host
 menzaijia.com: could not connect to host
 mercanix.co.uk: could not connect to host
 metaether.net: could not connect to host
+meterhost.com: could not connect to host
 metrix-money-ptc.com: could not connect to host
 metrix.design: could not connect to host
-meupedido.online: could not connect to host
 mexior.nl: could not connect to host
 meyeraviation.com: could not connect to host
 michaelcullen.name: could not connect to host
 michaelkuchta.me: could not connect to host
 michaelsulzer.com: could not connect to host
 michaelsulzer.eu: could not connect to host
 michasfahrschule.com: could not connect to host
 microblading.pe: could not connect to host
@@ -1601,20 +1599,18 @@ movie4k.fyi: could not connect to host
 movie4k.life: could not connect to host
 moving-pixtures.de: could not connect to host
 mowalls.net: could not connect to host
 mozzilla.cz: could not connect to host
 mpserver12.org: could not connect to host
 mrafrohead.com: could not connect to host
 mrizzio.com: could not connect to host
 mrliu.me: could not connect to host
-msa-aesch.ch: could not connect to host
 msgallery.tk: could not connect to host
 msz-fotografie.de: could not connect to host
-mtb.wtf: could not connect to host
 mtirc.co: could not connect to host
 mtn.cc: could not connect to host
 muchohentai.com: could not connect to host
 muj-svet.cz: could not connect to host
 multivpn.fr: could not connect to host
 munduch.cz: could not connect to host
 murmel.it: could not connect to host
 murraycoin.org: could not connect to host
@@ -1623,16 +1619,17 @@ murz.tv: could not connect to host
 mushman.tk: could not connect to host
 muslimbanter.co.za: could not connect to host
 mxawei.cn: could not connect to host
 mxlife.org: could not connect to host
 my-demo.co: could not connect to host
 my-dick.ru: could not connect to host
 my-dns.co.il: could not connect to host
 my-floor.com: could not connect to host
+myblockchain.cloud: could not connect to host
 mycamda.com: could not connect to host
 myfappening.org: could not connect to host
 myfunworld.de: could not connect to host
 mygreatjob.eu: could not connect to host
 mykeepsake.xyz: could not connect to host
 myndcommunication.com: could not connect to host
 mytravelblog.de: could not connect to host
 mzlog.win: could not connect to host
@@ -1641,24 +1638,23 @@ naano.org: could not connect to host
 namaleaks.com: could not connect to host
 namikawatetsuji.jp: could not connect to host
 naphex.rocks: could not connect to host
 nasmocopati.com: could not connect to host
 nastysclaw.com: could not connect to host
 nataniel-perissier.fr: could not connect to host
 natur-udvar.hu: could not connect to host
 natuterra.com.br: could not connect to host
-nba2k.cn: could not connect to host
-nba2k.com.cn: could not connect to host
 ncdesigns-studio.com: could not connect to host
 ndtblog.com: could not connect to host
 necesitodinero.org: could not connect to host
 necio.ca: could not connect to host
 neer.io: could not connect to host
 nekoku.io: could not connect to host
+nekolove.jp: could not connect to host
 nerdjokes.de: could not connect to host
 nerfroute.com: could not connect to host
 nestone.ru: could not connect to host
 netbuzz.ru: could not connect to host
 netica.fr: could not connect to host
 netscaler.expert: could not connect to host
 netsight.org: could not connect to host
 netsystems.pro: could not connect to host
@@ -1672,20 +1668,22 @@ nexusconnectinternational.eu: could not 
 nexuscorporation.in: could not connect to host
 nfluence.org: could not connect to host
 ngiemboon.net: could not connect to host
 nginxyii.tk: could not connect to host
 ngocuong.net: could not connect to host
 nicoleoquendo.com: could not connect to host
 nienfun.com: could not connect to host
 nikksno.io: could not connect to host
+niklas.pw: could not connect to host
 nikobradshaw.com: could not connect to host
 nikolasbradshaw.com: could not connect to host
 nimidam.com: could not connect to host
 ninofink.com: could not connect to host
+ninreiei.jp: could not connect to host
 niouininon.eu: could not connect to host
 nippon.fr: could not connect to host
 nirada.info: could not connect to host
 nishikino-maki.com: could not connect to host
 nkadvertising.online: could not connect to host
 nodelab-it.de: could not connect to host
 nodeselect.com: could not connect to host
 noelblog.ga: could not connect to host
@@ -1707,27 +1705,27 @@ nsmail.cn: could not connect to host
 nudel.ninja: could not connect to host
 nulltime.net: could not connect to host
 nyanpasu.tv: could not connect to host
 oaksbloom.com: could not connect to host
 obdolbacca.ru: could not connect to host
 oberam.de: could not connect to host
 oberhof.co: could not connect to host
 observatory.se: could not connect to host
+ocapic.com: could not connect to host
 ocsr.nl: could not connect to host
 octo.im: could not connect to host
 oducs.org: could not connect to host
 off-the-clock.us: could not connect to host
 offgames.pro: could not connect to host
 office-ruru.com: could not connect to host
 oinky.ddns.net: could not connect to host
 okusiassociates.com: could not connect to host
 oldtimer-trifft-flugplatz.de: could not connect to host
 oliverspringer.eu: could not connect to host
-omarh.net: could not connect to host
 oneazcu.com: could not connect to host
 onewebdev.info: could not connect to host
 onsennuie.fr: could not connect to host
 onsite4u.de: could not connect to host
 onstud.com: could not connect to host
 onwie.fr: could not connect to host
 ooeste.com: could not connect to host
 openclub24.ru: could not connect to host
@@ -1765,17 +1763,16 @@ pastie.se: could not connect to host
 patrickbusch.net: could not connect to host
 patrickneuro.de: could not connect to host
 paulshir.com: could not connect to host
 paulshir.is: could not connect to host
 paveljanda.com: [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 116"  data: no]
 pay.ubuntu.com: could not connect to host
 paymon.tj: could not connect to host
 paypod.org: could not connect to host
-paytm.in: could not connect to host
 pbcknd.ml: could not connect to host
 pbscreens.com: could not connect to host
 pbytes.com: could not connect to host
 pcvirusclear.com: could not connect to host
 pear2pear.de: could not connect to host
 peerless.ae: could not connect to host
 peirong.me: could not connect to host
 pemagrid.org: could not connect to host
@@ -1838,16 +1835,17 @@ potlytics.com: could not connect to host
 potterscraftcider.com: could not connect to host
 pouets.ovh: could not connect to host
 poupatempo.org: could not connect to host
 povesham.tk: could not connect to host
 powerentertainment.tv: could not connect to host
 poy-tech.com: could not connect to host
 ppoozl.com: could not connect to host
 precedecaritas.com.br: could not connect to host
+prekladysanca.cz: could not connect to host
 premioambiente.it: could not connect to host
 pretty.hu: could not connect to host
 prettytunesapp.com: could not connect to host
 prifo.se: could not connect to host
 princessbackpack.de: could not connect to host
 printsos.com: could not connect to host
 prism-communication.com: could not connect to host
 privacymanatee.com: could not connect to host
@@ -1896,20 +1894,20 @@ pythia.nz: could not connect to host
 pyzlnar.com: could not connect to host
 qforum.org: could not connect to host
 qikan.net: could not connect to host
 qnatek.org: could not connect to host
 qoqo.us: could not connect to host
 qqvips.com: could not connect to host
 qrlfinancial.com: could not connect to host
 qto.net: could not connect to host
-queminventou.com.br: could not connect to host
 quietus.gq: could not connect to host
 quikpay.com.au: could not connect to host
 r-cut.fr: could not connect to host
+r0t.co: could not connect to host
 r40.us: could not connect to host
 racasdecachorro.org: could not connect to host
 rackblue.com: could not connect to host
 radtke.bayern: could not connect to host
 rainbin.com: could not connect to host
 ranos.org: could not connect to host
 ravengergaming.net: could not connect to host
 ravse.dk: could not connect to host
@@ -1958,17 +1956,16 @@ riceglue.com: could not connect to host
 richardb.me: could not connect to host
 richeza.com: [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 116"  data: no]
 rickmartensen.nl: could not connect to host
 righteousendeavour.com: could not connect to host
 riversideauto.net: could not connect to host
 riverstyxgame.com: could not connect to host
 rkc-hygrotherm.de: could not connect to host
 rmstudio.tw: could not connect to host
-roave.com: could not connect to host
 robi-net.it: could not connect to host
 robomonkey.org: could not connect to host
 robust.ga: could not connect to host
 rodehutskors.net: could not connect to host
 rofrank.space: could not connect to host
 roguesignal.net: could not connect to host
 rolandszabo.com: could not connect to host
 romanticschemermovie.com: could not connect to host
@@ -1984,16 +1981,17 @@ rotterdamjazz.info: could not connect to
 royzez.com: could not connect to host
 rozalynne-dawn.ga: could not connect to host
 rpasafrica.com: could not connect to host
 rs-devdemo.host: could not connect to host
 rsldb.com: could not connect to host
 rtc.fun: could not connect to host
 rubbix.net: could not connect to host
 rubendv.be: could not connect to host
+ruflay.ru: could not connect to host
 ruhr3.de: could not connect to host
 run-forrest.run: could not connect to host
 runcarina.com: could not connect to host
 rundumcolumn.xyz: could not connect to host
 ruurdboomsma.nl: could not connect to host
 rzegroup.com: could not connect to host
 s0923.com: could not connect to host
 s16e.no: could not connect to host
@@ -2027,18 +2025,20 @@ schmidttulskie.de: could not connect to 
 schnapke.name: could not connect to host
 schul-bar.de: could not connect to host
 scib.tk: could not connect to host
 sciencemonster.co.uk: could not connect to host
 scintillating.stream: could not connect to host
 scitopia.me: could not connect to host
 scm-2017.org: could not connect to host
 scottainslie.me.uk: could not connect to host
+scriptgates.ru: could not connect to host
 scripthost.org: could not connect to host
 scriptjunkie.us: could not connect to host
+scruffymen.com: could not connect to host
 sctm.at: could not connect to host
 seanationals.org: could not connect to host
 seankilgarriff.com: could not connect to host
 searx.pw: could not connect to host
 sebastian-lutsch.de: could not connect to host
 sebi.cf: could not connect to host
 secitem.de: could not connect to host
 sectest.ml: could not connect to host
@@ -2047,25 +2047,28 @@ secure-automotive-cloud.org: could not c
 secureindia.co: could not connect to host
 security.xn--q9jyb4c: could not connect to host
 securitymap.wiki: could not connect to host
 securitysoapbox.com: could not connect to host
 securitytalk.pl: could not connect to host
 securon.io: could not connect to host
 securoswiss.ch: could not connect to host
 seefirm.com: could not connect to host
+seehimnaked.com: could not connect to host
+seehisnudes.com: could not connect to host
 seekthe.net: could not connect to host
 seen.life: could not connect to host
 selent.me: could not connect to host
 seleondar.ru: could not connect to host
 selfhosters.com: could not connect to host
 selfmade4u.de: could not connect to host
 selfserverx.com: could not connect to host
 sellmoretires.com: could not connect to host
 seoscribe.net: could not connect to host
+serkaneles.com: could not connect to host
 servecrypt.net: could not connect to host
 servecrypt.ru: could not connect to host
 serverlauget.no: could not connect to host
 servfefe.com: could not connect to host
 seryovpn.com: could not connect to host
 sesha.co.za: could not connect to host
 sexshopfacil.com.br: could not connect to host
 sgtsnookums.net: could not connect to host
@@ -2088,16 +2091,17 @@ shh.sh: could not connect to host
 shinko-osaka.jp: could not connect to host
 shirakaba-cc.com: could not connect to host
 shred.ch: could not connect to host
 shredoptics.ch: could not connect to host
 shurita.org: could not connect to host
 shuzicai.cn: could not connect to host
 shymeck.pw: could not connect to host
 siamega.com: could not connect to host
+sickfile.com: could not connect to host
 siebens.net: could not connect to host
 signosquecombinam.com.br: could not connect to host
 siirtutkusu.com: could not connect to host
 sijmenschoon.nl: could not connect to host
 siku.pro: could not connect to host
 silqueskineyeserum.com: could not connect to host
 silverback.is: could not connect to host
 silverstartup.sk: could not connect to host
@@ -2140,16 +2144,17 @@ sogravatas.net.br: could not connect to 
 sojingle.net: could not connect to host
 soldout-app.com: could not connect to host
 solymar.co: could not connect to host
 somali-derp.com: could not connect to host
 sonafe.info: could not connect to host
 sonja-kowa.de: could not connect to host
 sorenam.com: could not connect to host
 sortaweird.net: could not connect to host
+soulema.com: could not connect to host
 sourcecode.love: could not connect to host
 sowingseasons.com: could not connect to host
 sowncloud.de: could not connect to host
 sp.rw: could not connect to host
 spam.lol: could not connect to host
 spanien.guide: could not connect to host
 sparkbase.cn: could not connect to host
 spartantheatre.org: could not connect to host
@@ -2221,17 +2226,16 @@ svj-stochovska.cz: could not connect to 
 svjvn.cz: could not connect to host
 swacp.com: could not connect to host
 swaggerdile.com: could not connect to host
 sweetlegs.jp: could not connect to host
 sweetll.me: could not connect to host
 sweetvanilla.jp: could not connect to host
 swfloshatraining.com: could not connect to host
 swissentreprises.ch: could not connect to host
-swordfighting.net: could not connect to host
 sydney-sehen.com: could not connect to host
 syhost.at: could not connect to host
 syncaddict.net: could not connect to host
 syncmylife.net: could not connect to host
 synergisticsoccer.com: could not connect to host
 sysert.tv: could not connect to host
 system12.pl: could not connect to host
 t3rror.net: could not connect to host
@@ -2252,16 +2256,17 @@ tcpweb.net: could not connect to host
 tdelmas.eu: could not connect to host
 tdelmas.ovh: could not connect to host
 tdsb.cf: could not connect to host
 tdsbhack.tk: could not connect to host
 teacherph.net: could not connect to host
 team-pancake.eu: could not connect to host
 tebieer.com: could not connect to host
 techask.it: could not connect to host
+techcultivation.de: could not connect to host
 techiehall.com: could not connect to host
 technoinfogroup.it: could not connect to host
 techunit.org: could not connect to host
 tektoria.de: could not connect to host
 telekollektiv.org: could not connect to host
 tempus-aquilae.de: could not connect to host
 tenispopular.com: could not connect to host
 terlindung.com: could not connect to host
@@ -2296,17 +2301,16 @@ theprincegame.com: could not connect to 
 theprivacysolution.com: could not connect to host
 thequillmagazine.org: could not connect to host
 thermique.ch: could not connect to host
 thesecondsposts.com: could not connect to host
 thesehighsandlows.com: could not connect to host
 theserver201.tk: could not connect to host
 thetapirsmouth.com: could not connect to host
 thevoid.one: could not connect to host
-thewebdexter.com: could not connect to host
 thingies.site: could not connect to host
 thinkcash.nl: could not connect to host
 thismumdoesntknowbest.com: could not connect to host
 threatcentral.io: could not connect to host
 tianxicaipiao.com: could not connect to host
 tianxicaipiao.win: could not connect to host
 tianxicp.com: could not connect to host
 tibbitshall.ca: could not connect to host
@@ -2343,20 +2347,20 @@ track.plus: could not connect to host
 trackingstream.com: could not connect to host
 trainhornforums.com: could not connect to host
 trainline.io: could not connect to host
 transcendmotor.sg: could not connect to host
 transmithe.net: could not connect to host
 travotion.com: could not connect to host
 treker.us: could not connect to host
 triageo.com.au: could not connect to host
+trickedguys.com: could not connect to host
 triddi.com: could not connect to host
 tristanfarkas.one: could not connect to host
 trush.in: could not connect to host
-tryfm.net: could not connect to host
 trynowrinkleseyeserum.com: could not connect to host
 tryti.me: could not connect to host
 tsaro.io: could not connect to host
 tsdom.net: could not connect to host
 tsumi.moe: could not connect to host
 tsura.org: could not connect to host
 tsurezurematome.ga: could not connect to host
 tucidi.net: could not connect to host
@@ -2366,19 +2370,21 @@ turismo.cl: could not connect to host
 turkiet.guide: could not connect to host
 turn-sticks.com: could not connect to host
 tutiendaroja.com: could not connect to host
 tutiendarosa.com: could not connect to host
 tutoragency.org: could not connect to host
 tuxhound.org: could not connect to host
 twem.ddns.net: could not connect to host
 twinkieman.com: could not connect to host
+twinkseason.com: could not connect to host
 twiri.net: could not connect to host
 twittelzie.nl: could not connect to host
 twitter.ax: could not connect to host
+tworaz.net: could not connect to host
 twotube.ie: could not connect to host
 twuni.org: could not connect to host
 tykoon.com: could not connect to host
 tyler.rs: could not connect to host
 tylerharcourt.ca: could not connect to host
 tylerharcourt.com: could not connect to host
 tylerharcourt.net: could not connect to host
 tylerharcourt.org: could not connect to host
@@ -2522,17 +2528,16 @@ westcanal.net: could not connect to host
 wetthost.com: could not connect to host
 weyland.tech: could not connect to host
 wg-tools.de: could not connect to host
 whereisjason.com: could not connect to host
 whereismyorigin.cf: could not connect to host
 wherephoto.com: could not connect to host
 whilsttraveling.com: could not connect to host
 whiskynerd.ca: could not connect to host
-whitworth.nyc: could not connect to host
 whoneedstobeprimaried.today: could not connect to host
 whyy.eu.org: could not connect to host
 wibuw.com: could not connect to host
 wilfrid-calixte.fr: could not connect to host
 wilhelm-nathan.de: could not connect to host
 willkommen-fuerstenberg.de: could not connect to host
 winnersports.co: could not connect to host
 winsufi.biz: could not connect to host
@@ -2586,53 +2591,55 @@ xn--thorme-6uaf.ca: could not connect to
 xn--vck8crc010pu14e.biz: could not connect to host
 xn--y8j2eb5631a4qf5n0h.com: could not connect to host
 xn--yj8h0m.ws: could not connect to host
 xn--ykrp42k.com: could not connect to host
 xpwn.cz: could not connect to host
 xtom.io: could not connect to host
 xtzone.be: could not connect to host
 xuntaosms.com: could not connect to host
-xuntier.ch: could not connect to host
 xwaretech.info: could not connect to host
+xy1919.com: could not connect to host
 xyfun.net: could not connect to host
 y3451.com: could not connect to host
 yabrt.cn: could not connect to host
 yahoo.ax: could not connect to host
 yarchives.jp: could not connect to host
 yaucy.win: could not connect to host
-ybresson.com: could not connect to host
 yd.io: could not connect to host
 yellowcar.website: could not connect to host
 yemalu.com: could not connect to host
 yemekbaz.az: could not connect to host
 yepbitcoin.com: could not connect to host
 yesfone.com.br: could not connect to host
 yggdar.ga: could not connect to host
 yhori.xyz: could not connect to host
 yibin0831.com: could not connect to host
 ying299.com: could not connect to host
 ying299.net: could not connect to host
 yinga.ga: could not connect to host
 ylk.io: could not connect to host
 yobbelwobbel.de: could not connect to host
 yobst.tk: could not connect to host
 yoga.is-an-engineer.com: could not connect to host
+yogananda-roma.org: could not connect to host
 yolo-csgo.com: could not connect to host
 yoticonnections.com: could not connect to host
 yotilabs.com: could not connect to host
 yourznc.com: could not connect to host
 yousite.by: could not connect to host
 yude.ml: could not connect to host
+yugege.cf: could not connect to host
 yum.beer: could not connect to host
 yumli.net: could not connect to host
 yux.fr: could not connect to host
 z-coder.com: could not connect to host
 z0rro.net: could not connect to host
 zachbolinger.com: could not connect to host
+zaem.tv: could not connect to host
 zaoext.com: could not connect to host
 zbchen.com: could not connect to host
 zbp.at: could not connect to host
 zdbl.de: could not connect to host
 zehdenick-bleibt-bunt.de: could not connect to host
 zeloz.xyz: could not connect to host
 zenghx.tk: could not connect to host
 zero-x-baadf00d.com: could not connect to host
@@ -2682,22 +2689,20 @@ 0x0a.net: could not connect to host
 0x1337.eu: could not connect to host
 0x44.net: could not connect to host
 0x4b0c131e.pub: could not connect to host
 0x539.pw: could not connect to host
 0x90.fi: could not connect to host
 0xa.in: could not connect to host
 0xb612.org: could not connect to host
 0xcafec0.de: did not receive HSTS header
-0xdc.io: did not receive HSTS header
 1017scribes.com: could not connect to host
 1018hosting.nl: did not receive HSTS header
 1022996493.rsc.cdn77.org: could not connect to host
 1091.jp: could not connect to host
-10ppm.com: did not receive HSTS header
 10seos.com: did not receive HSTS header
 10tacle.io: could not connect to host
 12.net: did not receive HSTS header
 120dayweightloss.com: could not connect to host
 123.gg: could not connect to host
 123movies.fyi: did not receive HSTS header
 123share.org: did not receive HSTS header
 123test.de: did not receive HSTS header
@@ -2741,36 +2746,37 @@ 25daysof.io: could not connect to host
 2859cc.com: could not connect to host
 2acbi-asso.fr: did not receive HSTS header
 2bizi.ru: could not connect to host
 2brokegirls.org: could not connect to host
 2carpros.com: did not receive HSTS header
 2intermediate.co.uk: did not receive HSTS header
 2or3.tk: could not connect to host
 2smart4food.com: did not receive HSTS header
-2ss.jp: could not connect to host
+2ss.jp: did not receive HSTS header
 300651.ru: did not receive HSTS header
 300mbmovie24.com: could not connect to host
 300mbmovies4u.cc: could not connect to host
 301.website: could not connect to host
 302.nyc: could not connect to host
 314166.com: could not connect to host
 314chan.org: did not receive HSTS header
 32ph.com: could not connect to host
 33836.com: did not receive HSTS header
 33drugstore.com: did not receive HSTS header
-341.mg: did not receive HSTS header
+341.mg: could not connect to host
 3555aa.com: could not connect to host
 35792.de: could not connect to host
 360gradus.com: did not receive HSTS header
 365.or.jp: could not connect to host
 368mibn.com: could not connect to host
 3778xl.com: did not receive HSTS header
 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
 3d-bastler.de: could not connect to host
 3dcart.com: did not receive HSTS header
 3delivered.com: could not connect to host
 3dproteinimaging.com: did not receive HSTS header
 3fl.com: did not receive HSTS header
 3mbo.de: did not receive HSTS header
@@ -3075,16 +3081,17 @@ alphagamers.net: did not receive HSTS he
 alphalabs.xyz: could not connect to host
 als-hardware.co.za: did not receive HSTS header
 alspolska.pl: max-age too low: 2592000
 alt33c3.org: could not connect to host
 altailife.ru: did not receive HSTS header
 altamarea.se: could not connect to host
 alteqnia.com: could not connect to host
 altfire.ca: could not connect to host
+altitudemoversdenver.com: did not receive HSTS header
 altmv.com: max-age too low: 7776000
 aluminium-scaffolding.co.uk: could not connect to host
 alunjam.es: did not receive HSTS header
 alusta.co: could not connect to host
 am8888.top: could not connect to host
 amadoraslindas.com: did not receive HSTS header
 amandaonishi.com: could not connect to host
 amavis.org: did not receive HSTS header
@@ -3451,16 +3458,17 @@ bakkerdesignandbuild.com: did not receiv
 balatoni-nyar.hu: did not receive HSTS header
 balcan-underground.net: could not connect to host
 baldwinkoo.com: could not connect to host
 baleares.party: could not connect to host
 balihai.com: did not receive HSTS header
 balloonphp.com: could not connect to host
 ballparkbuns.com: max-age too low: 86400
 balnearionaturaspa.com: did not receive HSTS header
+bals.org: did not receive HSTS header
 bambooforest.nl: could not connect to host
 bambumania.com.br: could not connect to host
 bananabandy.com: could not connect to host
 banbanchs.com: could not connect to host
 banchethai.com: could not connect to host
 bandb.xyz: could not connect to host
 bandrcrafts.com: did not receive HSTS header
 banduhn.com: did not receive HSTS header
@@ -3633,16 +3641,17 @@ 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
 bimbo.com.ar: max-age too low: 86400
 bimbobakeriesusa.com: max-age too low: 86400
 binaryfigments.com: max-age too low: 86400
 binderapp.net: could not connect to host
+binfind.com: did not receive HSTS header
 bingcheung.org: did not receive HSTS header
 bioespuna.eu: did not receive HSTS header
 biofam.ru: did not receive HSTS header
 bioknowme.com: did not receive HSTS header
 bionicspirit.com: could not connect to host
 biophysik-ssl.de: did not receive HSTS header
 birgitandmerlin.com: did not receive HSTS header
 birkman.com: could not connect to host
@@ -3706,17 +3715,17 @@ blackpayment.ru: could not connect to ho
 blackunicorn.wtf: could not connect to host
 bladesmith.io: did not receive HSTS header
 blakerandall.xyz: could not connect to host
 blauwwit.be: did not receive HSTS header
 blendlecdn.com: could not connect to host
 blenheimchalcot.com: did not receive HSTS header
 blessnet.jp: did not receive HSTS header
 blha303.com.au: could not connect to host
-bliesekow.net: did not receive HSTS header
+bliesekow.net: could not connect to host
 blindsexdate.nl: did not receive HSTS header
 blitzprog.org: did not receive HSTS header
 blmiller.com: could not connect to host
 blocksatz-medien.de: could not connect to host
 blog-ritaline.com: could not connect to host
 blog.coffee: could not connect to host
 blog.cyveillance.com: did not receive HSTS header
 blog.torproject.org: max-age too low: 1000
@@ -3739,17 +3748,17 @@ blucas.org: did not receive HSTS header
 blue17.co.uk: did not receive HSTS header
 bluebill.net: did not receive HSTS header
 bluecon.eu: did not receive HSTS header
 bluefrag.com: did not receive HSTS header
 blueglobalmedia.com: could not connect to host
 blueliv.com: did not receive HSTS header
 bluescloud.xyz: could not connect to host
 bluetenmeer.com: did not receive HSTS header
-bluketing.com: did not receive HSTS header
+bluketing.com: could not connect to host
 bluserv.net: could not connect to host
 bluteklab.com: did not receive HSTS header
 blutroyal.de: could not connect to host
 bm-trading.nl: did not receive HSTS header
 bnhlibrary.com: did not receive HSTS header
 board-buy.ru: could not connect to host
 bobiji.com: did not receive HSTS header
 bodo-wolff.de: could not connect to host
@@ -3784,17 +3793,16 @@ borderlinegroup.com: could not connect t
 boringsecurity.net: could not connect to host
 boris.one: did not receive HSTS header
 borisavstankovic.rs: could not connect to host
 borrelioz.com: did not receive HSTS header
 borscheid-wenig.com: did not receive HSTS header
 boschee.net: could not connect to host
 botox.bz: did not receive HSTS header
 botstack.host: did not receive HSTS header
-bottineauneighborhood.org: did not receive HSTS header
 bounceboxspc.com: did not receive HSTS header
 bouncecoffee.com: did not receive HSTS header
 bouncelanduk.co.uk: did not receive HSTS header
 bouncemasters.co.uk: did not receive HSTS header
 bouncycastleandparty.co.uk: did not receive HSTS header
 bourhis.info: did not receive HSTS header
 bouwbedrijfpurmerend.nl: did not receive HSTS header
 bowlroll.net: max-age too low: 0
@@ -3848,17 +3856,17 @@ britzer-toner.de: did not receive HSTS h
 brix.ninja: did not receive HSTS header
 brks.xyz: could not connect to host
 broken-oak.com: could not connect to host
 brookechase.com: did not receive HSTS header
 brownlawoffice.us: did not receive HSTS header
 browserid.org: could not connect to host
 brrd.io: did not receive HSTS header
 brunix.net: did not receive HSTS header
-brunohenc.from.hr: did not receive HSTS header
+brunohenc.from.hr: could not connect to host
 brunoonline.co.uk: could not connect to host
 bryanshearer.accountant: did not receive HSTS header
 bryn.xyz: could not connect to host
 bs12v.ru: did not receive HSTS header
 bsagan.fr: did not receive HSTS header
 bsdtips.com: could not connect to host
 bsklabels.com: did not receive HSTS header
 bsohoekvanholland.nl: did not receive HSTS header
@@ -3918,17 +3926,16 @@ businesshosting.nl: did not receive HSTS
 businessloanconnection.org: did not receive HSTS header
 busold.ws: could not connect to host
 bustimes.org.uk: did not receive HSTS header
 butchersworkshop.com: did not receive HSTS header
 butian518.com: did not receive HSTS header
 buttercoin.com: could not connect to host
 butterfieldstraining.com: could not connect to host
 buvinghausen.com: max-age too low: 86400
-buyaccessible.gov: did not receive HSTS header
 buybaby.eu: could not connect to host
 buyfox.de: did not receive HSTS header
 buynowdepot.com: did not receive HSTS header
 buzzconcert.com: did not receive HSTS header
 buzztelco.com.au: did not receive HSTS header
 bw81.xyz: could not connect to host
 bwear4all.de: could not connect to host
 bx-web.com: did not receive HSTS header
@@ -4048,18 +4055,20 @@ casinostest.com: could not connect to ho
 casioshop.eu: did not receive HSTS header
 casjay.cloud: did not receive HSTS header
 casovi.cf: could not connect to host
 castagnonavocats.com: did not receive HSTS header
 cata.ga: could not connect to host
 catalin.pw: could not connect to host
 catarsisvr.com: could not connect to host
 catchers.cc: did not receive HSTS header
+catharisme.eu: did not receive HSTS header
 catinmay.com: could not connect to host
 catnapstudios.com: could not connect to host
+catuniverse.org: did not receive HSTS header
 cavaleria.ro: did not receive HSTS header
 caveclan.org: did not receive HSTS header
 cavedevs.de: could not connect to host
 cavedroid.xyz: could not connect to host
 cavern.tv: did not receive HSTS header
 cayafashion.de: did not receive HSTS header
 cayounglab.co.jp: did not receive HSTS header
 cbengineeringinc.com: max-age too low: 86400
@@ -4071,17 +4080,17 @@ cd0.us: could not connect to host
 cdkeyworld.de: did not receive HSTS header
 cdnb.co: could not connect to host
 cdndepo.com: could not connect to host
 cdreporting.co.uk: did not receive HSTS header
 cdt.org: did not receive HSTS header
 ce-agentur.de: did not receive HSTS header
 cecilwalker.com.au: did not receive HSTS header
 celeirorural.com.br: did not receive HSTS header
-celina-reads.de: did not receive HSTS header
+celina-reads.de: could not connect to host
 cellsites.nz: could not connect to host
 centennialrewards.com: did not receive HSTS header
 centralpoint.be: did not receive HSTS header
 centralpoint.nl: did not receive HSTS header
 centralvacsunlimited.net: did not receive HSTS header
 centralync.com: could not connect to host
 centrepoint-community.com: could not connect to host
 centsforchange.net: could not connect to host
@@ -4304,17 +4313,17 @@ codepoet.de: did not receive HSTS header
 codepx.com: did not receive HSTS header
 codewiththepros.org: could not connect to host
 codigosddd.com.br: did not receive HSTS header
 coding.net: did not receive HSTS header
 coffeeetc.co.uk: max-age too low: 7889238
 coffeestrategies.com: max-age too low: 5184000
 cogniflex.com: did not receive HSTS header
 cohesive.io: did not receive HSTS header
-coinbit.trade: could not connect to host
+coinbit.trade: did not receive HSTS header
 coindam.com: could not connect to host
 coisasdaterra.com: max-age too low: 0
 colasjourdain.fr: did not receive HSTS header
 coldlostsick.net: could not connect to host
 colearnr.com: could not connect to host
 collablynk.com: did not receive HSTS header
 collabra.email: did not receive HSTS header
 collard.tk: did not receive HSTS header
@@ -4372,16 +4381,18 @@ connectingconcepts.com: did not receive 
 conrail.blue: did not receive HSTS header
 consciousandglamorous.com: could not connect to host
 consciousbrand.org.au: could not connect to host
 consciousbranding.org.au: could not connect to host
 consciousbrands.net.au: could not connect to host
 consejosdehogar.com: did not receive HSTS header
 console.python.org: did not receive HSTS header
 console.support: did not receive HSTS header
+construct-trust.com: did not receive HSTS header
+consultorcr.net: did not receive HSTS header
 contactbig.com: did not receive HSTS header
 contaimo.com: did not receive HSTS header
 container-lion.com: did not receive HSTS header
 containerstatistics.com: could not connect to host
 contarkos.xyz: could not connect to host
 content-design.de: did not receive HSTS header
 continuumgaming.com: could not connect to host
 controlcenter.gigahost.dk: did not receive HSTS header
@@ -4389,17 +4400,16 @@ controleer-maar-een-ander.nl: did not re
 convergemagazine.com: did not receive HSTS header
 convert.zone: did not receive HSTS header
 cooink.net: could not connect to host
 coolaj86.com: did not receive HSTS header
 coolbutbroken.com: did not receive HSTS header
 coolchevy.org.ua: did not receive HSTS header
 coole-meister.de: could not connect to host
 coolkidsbouncycastles.co.uk: did not receive HSTS header
-coolvox.com: did not receive HSTS header
 coonelnel.net: did not receive HSTS header
 cooxa.com: did not receive HSTS header
 copshop.com.br: could not connect to host
 cor-ser.es: could not connect to host
 coralproject.net: did not receive HSTS header
 coralrosado.com.br: did not receive HSTS header
 coramcdaniel.com: did not receive HSTS header
 corderoscleaning.com: did not receive HSTS header
@@ -4488,16 +4498,17 @@ cryptobin.org: could not connect to host
 cryptodash.net: could not connect to host
 cryptojar.io: could not connect to host
 cryptolab.pro: could not connect to host
 cryptolab.tk: could not connect to host
 cryptopartyatx.org: could not connect to host
 cryptopush.com: did not receive HSTS header
 crysadm.com: could not connect to host
 crystalclassics.co.uk: did not receive HSTS header
+crystalmachine.net: did not receive HSTS header
 crystalmate.eu: did not receive HSTS header
 cs-ubladego.pl: could not connect to host
 csapak.com: did not receive HSTS header
 csawctf.poly.edu: could not connect to host
 csfs.org.uk: could not connect to host
 csgf.ru: did not receive HSTS header
 csgodicegame.com: did not receive HSTS header
 csgoelemental.com: could not connect to host
@@ -4510,19 +4521,19 @@ cssu.in: did not receive HSTS header
 csvape.com: did not receive HSTS header
 ct-status.org: could not connect to host
 ct-watches.dk: did not receive HSTS header
 cthulhuden.com: could not connect to host
 ctrl.blog: did not receive HSTS header
 cu247secure.ie: did not receive HSTS header
 cuanhua3s.com: did not receive HSTS header
 cubecart.net: could not connect to host
-cubekrowd.net: did not receive HSTS header
 cubeserver.eu: could not connect to host
 cubewano.com: could not connect to host
+cubia.de: did not receive HSTS header
 cubix.host: did not receive HSTS header
 cucc.date: did not receive HSTS header
 cuecamania.com.br: could not connect to host
 cujanovic.com: did not receive HSTS header
 cujba.com: could not connect to host
 culinae.nl: could not connect to host
 cumparama.com: did not receive HSTS header
 cumshots-video.ru: could not connect to host
@@ -4537,19 +4548,17 @@ custe.rs: could not connect to host
 customadesign.com: did not receive HSTS header
 cutelariafiveladeouro.com.br: did not receive HSTS header
 cutorrent.com: could not connect to host
 cuvva.insure: did not receive HSTS header
 cvjm-memmingen.de: did not receive HSTS header
 cvtparking.co.uk: did not receive HSTS header
 cwage.com: could not connect to host
 cyanogenmod.xxx: could not connect to host
-cyber-konzept.de: did not receive HSTS header
 cybercecurity.com: did not receive HSTS header
-cyberfrancais.ro: did not receive HSTS header
 cyberlab.kiev.ua: did not receive HSTS header
 cyberlab.team: did not receive HSTS header
 cyberpunk.ca: could not connect to host
 cybersafesolutions.com: did not receive HSTS header
 cybershambles.com: could not connect to host
 cycleluxembourg.lu: did not receive HSTS header
 cyclingjunkies.com: could not connect to host
 cydia-search.io: could not connect to host
@@ -4644,17 +4653,16 @@ davidreinhardt.de: could not connect to 
 day.vip: did not receive HSTS header
 daylightcompany.com: did not receive HSTS header
 daytonaseaside.com: could not connect to host
 db.gy: could not connect to host
 dbx.ovh: could not connect to host
 dbyz.co.uk: max-age too low: 43200
 dcaracing.nl: could not connect to host
 dcbouncycastles.co.uk: did not receive HSTS header
-dcc.cat: did not receive HSTS header
 dccode.gov: could not connect to host
 dccoffeeproducts.com: did not receive HSTS header
 dccraft.net: could not connect to host
 dctxf.com: did not receive HSTS header
 dcuofriends.net: could not connect to host
 dcurt.is: did not receive HSTS header
 dcw.io: did not receive HSTS header
 ddatsh.com: did not receive HSTS header
@@ -4748,20 +4756,20 @@ devistravaux.org: did not receive HSTS h
 devlux.ch: did not receive HSTS header
 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
+dewebwerf.nl: did not receive HSTS header
 dewin.io: could not connect to host
 dfrance.com.br: did not receive HSTS header
 dfviana.com.br: max-age too low: 2592000
-dggm.ru: did not receive HSTS header
 dhaynes.xyz: max-age too low: 2592000
 dhpcs.com: did not receive HSTS header
 dhpiggott.net: did not receive HSTS header
 diablotine.rocks: could not connect to host
 diagnosia.com: did not receive HSTS header
 diagonale-deco.fr: did not receive HSTS header
 diamondcare.com.br: could not connect to host
 diamondt.us: did not receive HSTS header
@@ -4893,31 +4901,32 @@ doridian.de: could not connect to host
 doridian.net: did not receive HSTS header
 doridian.org: could not connect to host
 doriginal.es: did not receive HSTS header
 dorkfarm.com: did not receive HSTS header
 dormebebe.com.br: could not connect to host
 dosenbierrepublik.com: did not receive HSTS header
 dot42.no: could not connect to host
 dotadata.me: could not connect to host
+dotbrick.co.th: did not receive HSTS header
 dotspaperie.com: could not connect to host
 doublethink.online: could not connect to host
 doubleyummy.uk: did not receive HSTS header
 dovecotadmin.org: could not connect to host
 doveholesband.co.uk: did not receive HSTS header
 dovetailnow.com: could not connect to host
 dowc.org: did not receive HSTS header
 download.jitsi.org: did not receive HSTS header
 downsouthweddings.com.au: could not connect to host
 doxcelerate.com: max-age too low: 69
 dps.srl: did not receive HSTS header
 dr-becarelli-philippe.chirurgiens-dentistes.fr: did not receive HSTS header
 drabim.org: did not receive HSTS header
 drach.xyz: did not receive HSTS header
-draghive.club: could not connect to host
+draghive.club: did not receive HSTS header
 draghive.com: did not receive HSTS header
 draghive.net: did not receive HSTS header
 draghive.photos: did not receive HSTS header
 dragonisles.net: could not connect to host
 dragons-of-highlands.cz: did not receive HSTS header
 dragonsmoke.cloud: could not connect to host
 dragonstower.net: could not connect to host
 dragonteam.ninja: could not connect to host
@@ -4973,16 +4982,17 @@ duelysthub.com: could not connect to hos
 dukec.me: did not receive HSTS header
 dukefox.com: did not receive HSTS header
 dullsir.com: did not receive HSTS header
 dune.io: did not receive HSTS header
 dunea.nl: did not receive HSTS header
 duole30.com: did not receive HSTS header
 duongpho.com: did not receive HSTS header
 duskopy.top: 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
 duyao.de: max-age too low: 86400
 dv189.com: did not receive HSTS header
 dycem-ns.com: did not receive HSTS header
 dycontrol.de: could not connect to host
 dylanscott.com.au: did not receive HSTS header
 dymersion.com: did not receive HSTS header
@@ -5028,16 +5038,17 @@ ebp2p.com: did not receive HSTS header
 ebpglobal.com: did not receive HSTS header
 ebraph.com: could not connect to host
 ecake.in: did not receive HSTS header
 ecc-kaufbeuren.de: could not connect to host
 ecchidreams.com: did not receive HSTS header
 ecfs.link: could not connect to host
 ecg.fr: could not connect to host
 echipstore.com: did not receive HSTS header
+echoteam.gq: did not receive HSTS header
 eckro.com: did not receive HSTS header
 ecoheatcool.co.uk: did not receive HSTS header
 ecole-en-danger.fr: could not connect to host
 ecole-maternelle-saint-joseph.be: could not connect to host
 ecolesrec.ch: did not receive HSTS header
 ecology-21.ru: did not receive HSTS header
 ecomlane.com: could not connect to host
 ecomparemo.com: did not receive HSTS header
@@ -5060,16 +5071,17 @@ edissecurity.sk: did not receive HSTS he
 edited.de: did not receive HSTS header
 edix.ru: could not connect to host
 edk.com.tr: did not receive HSTS header
 edmodo.com: did not receive HSTS header
 edpubs.gov: did not receive HSTS header
 edsh.de: did not receive HSTS header
 educatio.tech: could not connect to host
 educourse.ga: could not connect to host
+edudrugs.com: did not receive HSTS header
 eduvance.in: did not receive HSTS header
 eengezinswoning-in-alphen-aan-den-rijn-kopen.nl: could not connect to host
 eengezinswoning-in-de-friese-meren-kopen.nl: could not connect to host
 eengezinswoning-in-friesland-kopen.nl: could not connect to host
 eengezinswoning-in-leeuwarden-kopen.nl: could not connect to host
 eengezinswoning-in-pekela-kopen.nl: could not connect to host
 eengezinswoning-in-rijnwaarden-kopen.nl: could not connect to host
 eengezinswoning-in-sudwest-fryslan-kopen.nl: could not connect to host
@@ -5221,25 +5233,26 @@ ericyl.com: could not connect to host
 eriel.com.br: could not connect to host
 erikwalther.eu: could not connect to host
 eriser.fr: did not receive HSTS header
 ernaehrungsberatung-zurich.ch: could not connect to host
 ernesto.at: could not connect to host
 eromixx.com: could not connect to host
 erotalia.es: could not connect to host
 erotic4me.ch: did not receive HSTS header
-eroticforce.com: did not receive HSTS header
+eroticforce.com: could not connect to host
 erotische-aanbiedingen.nl: could not connect to host
 errolz.com: could not connect to host
 errors.zenpayroll.com: could not connect to host
 ersindemirtas.com: did not receive HSTS header
 eru.me: did not receive HSTS header
 erwinvanlonden.net: did not receive HSTS header
 esbuilders.co.nz: did not receive HSTS header
 escalate.eu: could not connect to host
+escapees.com: did not receive HSTS header
 escolaengenharia.com.br: did not receive HSTS header
 escortshotsexy.com: max-age too low: 2592000
 escotour.com: could not connect to host
 escueladewordpress.com: did not receive HSTS header
 esec.rs: did not receive HSTS header
 esko.bar: could not connect to host
 esln.org: did not receive HSTS header
 esn-ypci.com: did not receive HSTS header
@@ -5297,33 +5310,32 @@ evafojtova.cz: did not receive HSTS head
 evanhandgraaf.nl: did not receive HSTS header
 evdenevenakliyatankara.pw: could not connect to host
 evecalm.com: did not receive HSTS header
 evegalaxy.net: did not receive HSTS header
 events12.com: did not receive HSTS header
 eventsafrica.net: did not receive HSTS header
 everybooks.com: could not connect to host
 everydaytherich.com: max-age too low: 7776000
-everygayporn.xyz: did not receive HSTS header
+everygayporn.xyz: could not connect to host
 everylab.org: could not connect to host
 everything.place: did not receive HSTS header
 eveseat.net: 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
 evin.ml: could not connect to host
 evites.me: could not connect to host
 evoludis.net: did not receive HSTS header
 evomon.com: could not connect to host
 evossd.tk: could not connect to host
 evowl.com: could not connect to host
 ewallet-optimizer.com: did not receive HSTS header
 ewex.org: could not connect to host
 excelgum.ca: did not receive HSTS header
-exembit.com: did not receive HSTS header
 exfiles.cz: did not receive HSTS header
 exgravitus.com: could not connect to host
 exno.co: could not connect to host
 exoscale.ch: did not receive HSTS header
 exousiakaidunamis.xyz: could not connect to host
 experticon.com: did not receive HSTS header
 expertmile.com: did not receive HSTS header
 exploit.cz: did not receive HSTS header
@@ -5353,16 +5365,17 @@ f-rickroll-g.pw: could not connect to ho
 f-s-u.co.uk: could not connect to host
 f00.ca: did not receive HSTS header
 f2f.cash: could not connect to host
 faber.io: could not connect to host
 fabhub.io: could not connect to host
 fabianfischer.de: did not receive HSTS header
 fabianmunoz.com: did not receive HSTS header
 fabriko.fr: did not receive HSTS header
+facebattle.com: did not receive HSTS header
 facebooktsukaikata.net: did not receive HSTS header
 fachschaft-informatik.de: did not receive HSTS header
 factorable.net: did not receive HSTS header
 factorygw.com: did not receive HSTS header
 fadilus.com: could not connect to host
 faesser.com: did not receive HSTS header
 fahmed.de: did not receive HSTS header
 faidanoi.it: did not receive HSTS header
@@ -5375,17 +5388,16 @@ faizan.net: did not receive HSTS header
 faizan.xyz: did not receive HSTS header
 fakeletters.org: did not receive HSTS header
 faktura.pl: did not receive HSTS header
 falcibiosystems.org: did not receive HSTS header
 falconwiz.com: did not receive HSTS header
 falkhusemann.de: did not receive HSTS header
 falkp.no: did not receive HSTS header
 fallenangelspirits.uk: could not connect to host
-fallofthecitadel.com: did not receive HSTS header
 faluninfo.ba: did not receive HSTS header
 fame-agency.net: 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
 fanboi.ch: did not receive HSTS header
 fanflow.com: did not receive HSTS header
 fant.dk: did not receive HSTS header
@@ -5421,16 +5433,17 @@ fbox.li: could not connect to host
 fdj.im: could not connect to host
 fdt.name: did not receive HSTS header
 feard.space: could not connect to host
 fedemo.top: did not receive HSTS header
 federalregister.gov: did not receive HSTS header
 fedo.moe: could not connect to host
 feedthebot.com: did not receive HSTS header
 feedthefuture.gov: did not receive HSTS header
+feeriedesign-event.com: did not receive HSTS header
 feezmodo.com: did not receive HSTS header
 fefore.com: did not receive HSTS header
 fegans.org.uk: did not receive HSTS header
 feitobrasilcosmeticos.com.br: did not receive HSTS header
 feliwyn.fr: did not receive HSTS header
 felixrr.pro: could not connect to host
 femaledom.xyz: could not connect to host
 feminists.co: could not connect to host
@@ -5555,27 +5568,25 @@ fluidojobs.com: could not connect to hos
 flukethoughts.com: did not receive HSTS header
 flurrybridge.com: did not receive HSTS header
 flushstudios.com: did not receive HSTS header
 flyaces.com: could not connect to host
 flybunnyfly.dk: did not receive HSTS header
 flygpost.com: did not receive HSTS header
 fm83.nl: could not connect to host
 fm992.com: could not connect to host
-fmi.gov: did not receive HSTS header
 fnncat.com: did not receive HSTS header
 fnvsecurity.com: could not connect to host
 fobc-usa.org: did not receive HSTS header
 foerster-kunststoff.de: did not receive HSTS header
 fojtova.cz: did not receive HSTS header
 fojtovi.cz: did not receive HSTS header
 fokan.ch: did not receive HSTS header
 foliekonsulenten.dk: did not receive HSTS header
 folioapp.io: did not receive HSTS header
-follandviolins.com: did not receive HSTS header
 followback.net: did not receive HSTS header
 fonetiq.io: could not connect to host
 food4health.guide: could not connect to host
 foodbuddy.ch: could not connect to host
 foodiebox.no: did not receive HSTS header
 foodies.my: did not receive HSTS header
 foodievenues.com: could not connect to host
 foodsafetyworkinggroup.gov: could not connect to host
@@ -5592,17 +5603,16 @@ foreveralone.io: could not connect to ho
 forewordreviews.com: did not receive HSTS header
 forex-dan.com: did not receive HSTS header
 forgix.com: could not connect to host
 forlagetmarx.dk: did not receive HSTS header
 formazioneopen.it: could not connect to host
 formersessalaries.com: did not receive HSTS header
 formula.cf: could not connect to host
 forplanetsake.com: could not connect to host
-fortran.io: did not receive HSTS header
 forty2.eu: did not receive HSTS header
 forus.be: could not connect to host
 fossewaygardencentre.co.uk: did not receive HSTS header
 fotiu.com: could not connect to host
 fotoallerlei.com: did not receive HSTS header
 fotocerita.net: could not connect to host
 fotogiraffe.ru: did not receive HSTS header
 fotografosexpertos.com: did not receive HSTS header
@@ -5647,17 +5657,16 @@ fridaperfumaria.com.br: could not connec
 fridolinka.cz: could not connect to host
 friendica.ch: could not connect to host
 friendlyfiregameshow.com: could not connect to host
 frimons.com: could not connect to host
 froggstack.de: could not connect to host
 front-end.dog: could not connect to host
 frontisme.nl: did not receive HSTS header
 frontmin.com: did not receive HSTS header
-fropky.com: did not receive HSTS header
 frost-ci.xyz: could not connect to host
 frostbytes.net: did not receive HSTS header
 froxlor.support: max-age too low: 0
 frsis2017.com: could not connect to host
 fruitusers.com: could not connect to host
 frumious.fyi: could not connect to host
 fsapubs.gov: did not receive HSTS header
 fsinf.at: did not receive HSTS header
@@ -5702,17 +5711,16 @@ futuristarchitecture.com: did not receiv
 fuvpn.com: could not connect to host
 fws.gov: did not receive HSTS header
 fyfywka.com: max-age too low: 86400
 fyodorpi.com: did not receive HSTS header
 fysiohaenraets.nl: did not receive HSTS header
 fzn.io: did not receive HSTS header
 fzslm.me: could not connect to host
 g-i-s.vn: did not receive HSTS header
-g-marketing.ro: did not receive HSTS header
 g-rickroll-o.pw: could not connect to host
 g2-inc.com: max-age too low: 600
 g2a.co: did not receive HSTS header
 g2g.com: did not receive HSTS header
 g5led.nl: could not connect to host
 g77.ca: could not connect to host
 gabber.scot: could not connect to host
 gabi.com.es: could not connect to host
@@ -5775,19 +5783,21 @@ gebn.co.uk: did not receive HSTS header
 gebn.uk: could not connect to host
 gedankenbude.info: could not connect to host
 geekbaba.com: could not connect to host
 geekcast.co.uk: did not receive HSTS header
 geekmind.org: max-age too low: 172800
 geeks.lgbt: could not connect to host
 geeky.software: could not connect to host
 geemo.top: could not connect to host
+geiser.io: did not receive HSTS header
 geli-graphics.com: did not receive HSTS header
 gemsoftheworld.org: could not connect to host
 gemuplay.com: could not connect to host
+generalpants.com.au: did not receive HSTS header
 genesischangelog.com: did not receive HSTS header
 genneve.com: did not receive HSTS header
 genshiken.org: could not connect to host
 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
 geoffdev.com: could not connect to host
@@ -5856,17 +5866,16 @@ gigacog.com: could not connect to host
 gigin.me: did not receive HSTS header
 gilcloud.com: could not connect to host
 gilgaz.com: did not receive HSTS header
 gillet-cros.fr: could not connect to host
 gilly.berlin: did not receive HSTS header
 gilroywestwood.org: did not receive HSTS header
 gincher.net: did not receive HSTS header
 gingali.de: did not receive HSTS header
-ginie.de: did not receive HSTS header
 ginijony.com: 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
 git-stuff.tk: could not connect to host
@@ -5917,16 +5926,17 @@ goldendata.io: could not connect to host
 goldminer.ga: could not connect to host
 goldpros.com: did not receive HSTS header
 golocal-media.de: could not connect to host
 gomiblog.com: did not receive HSTS header
 gong8.win: could not connect to host
 gonzalosanchez.mx: could not connect to host
 goodfurday.ca: did not receive HSTS header
 goodmengroup.de: did not receive HSTS header
+goods-memo.net: did not receive HSTS header
 goodtech.com.br: could not connect to host
 goodwin43.ru: could not connect to host
 googley.fr: max-age too low: 0
 goolok.com: could not connect to host
 gootax.pro: did not receive HSTS header
 goozz.nl: did not receive HSTS header
 gopay.cz: did not receive HSTS header
 gopokego.cz: could not connect to host
@@ -6026,25 +6036,25 @@ gts-schulsoftware.de: did not receive HS
 guarajubaimoveis.com.br: did not receive HSTS header
 guava.studio: did not receive HSTS header
 guentherhouse.com: did not receive HSTS header
 guenthernoack.de: could not connect to host
 guffrits.com: could not connect to host
 guge.gq: could not connect to host
 gugga.dk: could not connect to host
 guguke.net: did not receive HSTS header
-guidetoiceland.is: did not receive HSTS header
 guilde-vindicta.fr: did not receive HSTS header
 guillaume-leduc.fr: did not receive HSTS header
 guillaumematheron.fr: did not receive HSTS header
 guineafruitcorp.com: could not connect to host
 gulch.in.ua: did not receive HSTS header
 gulenet.com: could not connect to host
 gulfcoast-sandbox.com: could not connect to host
 gumannp.de: did not receive HSTS header
+gummibande.noip.me: did not receive HSTS header
 gunnarhafdal.com: did not receive HSTS header
 gunnaro.com: could not connect to host
 guntbert.net: could not connect to host
 guoqiang.info: did not receive HSTS header
 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
@@ -6305,16 +6315,18 @@ homeyantra.com: did not receive HSTS hea
 homezhi.com.tw: did not receive HSTS header
 hongyd.online: could not connect to host
 hongzhaxiaofendui.com: could not connect to host
 honoo.com: could not connect to host
 hookandloom.com: did not receive HSTS header
 hoopsacademyusa.com: could not connect to host
 hoorr.com: did not receive HSTS header
 hoovism.com: did not receive HSTS header
+hopewellproperties.co.uk: did not receive HSTS header
+horizonmoto.fr: did not receive HSTS header
 horizonshypnosis.ca: did not receive HSTS header
 horning.co: did not receive HSTS header
 horosho.in: could not connect to host
 horseboners.xxx: did not receive HSTS header
 hortifarm.ro: did not receive HSTS header
 horvathtom.com: could not connect to host
 hosteasy.nl: did not receive HSTS header
 hostelite.com: did not receive HSTS header
@@ -6376,17 +6388,17 @@ humpi.at: could not connect to host
 humpteedumptee.in: did not receive HSTS header
 huodongweb.com: could not connect to host
 hup.blue: could not connect to host
 huskybutt.dog: could not connect to host
 huzu.com: did not receive HSTS header
 hwcine.com: did not receive HSTS header
 hwpkasse.de: max-age too low: 2592000
 hyakumachi.com: did not receive HSTS header
-hyatt.com: could not connect to host
+hyatt.com: did not receive HSTS header
 hydra.ws: could not connect to host
 hydrodipcenter.nl: did not receive HSTS header
 hydronium.cf: could not connect to host
 hydronium.ga: could not connect to host
 hydronium.me: could not connect to host
 hydronium.ml: could not connect to host
 hydronium.tk: could not connect to host
 hypa.net.au: did not receive HSTS header
@@ -6510,16 +6522,17 @@ immunicity.works: could not connect to h
 immunicity.world: could not connect to host
 imolug.org: did not receive HSTS header
 imoni-blog.net: could not connect to host
 imoto.me: could not connect to host
 imperialonlinestore.com: did not receive HSTS header
 imperialwebsolutions.com: did not receive HSTS header
 imu.li: did not receive HSTS header
 imusic.dk: did not receive HSTS header
+imy.life: did not receive HSTS header
 inb4.us: could not connect to host
 inbox.li: did not receive HSTS header
 incendiary-arts.com: could not connect to host
 inche-ali.com: did not receive HSTS header
 inchomatic.com: did not receive HSTS header
 inderagamono.net: could not connect to host
 indiecert.net: could not connect to host
 indiemods.com: could not connect to host
@@ -6545,16 +6558,17 @@ info-sys.tk: could not connect to host
 infoduv.fr: did not receive HSTS header
 inforichjapan.com: did not receive HSTS header
 informaticapremium.com: did not receive HSTS header
 infosec.rip: could not connect to host
 infosoph.org: could not connect to host
 infotics.es: did not receive HSTS header
 infranix.eu: max-age too low: 7360000
 infura.co.th: could not connect to host
+ingenius.ws: did not receive HSTS header
 ingesol.fr: did not receive HSTS header
 inhelix.com: could not connect to host
 inhive.group: did not receive HSTS header
 injertoshorticolas.com: did not receive HSTS header
 injigo.com: did not receive HSTS header
 injust.cf: could not connect to host
 injust.ga: could not connect to host
 injust.gq: could not connect to host
@@ -6727,17 +6741,17 @@ izolight.ch: could not connect to host
 izoox.com: did not receive HSTS header
 izzzorgconcerten.nl: could not connect to host
 j-eck.nl: did not receive HSTS header
 j-lsolutions.com: could not connect to host
 j-rickroll-a.pw: could not connect to host
 ja-publications.com: did not receive HSTS header
 jaan.su: could not connect to host
 jackalworks.com: could not connect to host
-jackdoan.com: did not receive HSTS header
+jackdoan.com: could not connect to host
 jackfahnestock.com: could not connect to host
 jacobparry.ca: did not receive HSTS header
 jacobsenarquitetura.com: max-age too low: 5184000
 jagido.de: did not receive HSTS header
 jahliveradio.com: could not connect to host
 jaksi.io: did not receive HSTS header
 jamanji.com.ng: could not connect to host
 james-parker.com: did not receive HSTS header
@@ -6820,18 +6834,18 @@ jenjoit.de: could not connect to host
 jennifercherniack.com: did not receive HSTS header
 jens-prangenberg.de: did not receive HSTS header
 jensenbanden.no: could not connect to host
 jenssen.org: did not receive HSTS header
 jeremye77.com: did not receive HSTS header
 jermann.biz: did not receive HSTS header
 jeroenseegers.com: could not connect to host
 jesorsenville.com: did not receive HSTS header
-jessicabenedictus.nl: did not receive HSTS header
 jessicah.org: could not connect to host
+jesuisadmin.fr: did not receive HSTS header
 jesuisformidable.nl: could not connect to host
 jesuslucas.com: did not receive HSTS header
 jet-code.com: could not connect to host
 jetaprices.com: max-age too low: 0
 jetlagphotography.com: could not connect to host
 jeton.com: did not receive HSTS header
 jetsetcharge.com: could not connect to host
 jetsetpay.com: could not connect to host
@@ -6852,17 +6866,17 @@ jief.me: did not receive HSTS header
 jikken.de: could not connect to host
 jimas.eu: did not receive HSTS header
 jimenacocina.com: did not receive HSTS header
 jimgao.tk: did not receive HSTS header
 jimmehcai.com: could not connect to host
 jimmycai.org: could not connect to host
 jimmycn.com: did not receive HSTS header
 jingyuesi.com: could not connect to host
-jinmaguoji.com: could not connect to host
+jinmaguoji.com: did not receive HSTS header
 jinshavip.com: could not connect to host
 jiosongs.com: did not receive HSTS header
 jira.com: did not receive HSTS header
 jirav.io: could not connect to host
 jisaku-homepage.com: did not receive HSTS header
 jitsi.org: did not receive HSTS header
 jiyue.com: did not receive HSTS header
 jjf.org.au: did not receive HSTS header
@@ -7090,17 +7104,17 @@ kipin.fr: did not receive HSTS header
 kipira.com: could not connect to host
 kirainmoe.com: max-age too low: 233000
 kirara.eu: could not connect to host
 kirkforcongress.com: did not receive HSTS header
 kirkforsenate.com: could not connect to host
 kirkpatrickdavis.com: could not connect to host
 kirslis.com: did not receive HSTS header
 kisa.io: could not connect to host
-kisalt.im: could not connect to host
+kisalt.im: did not receive HSTS header
 kiss-register.org: could not connect to host
 kissart.net: could not connect to host
 kisstyle.ru: did not receive HSTS header
 kita.id: did not receive HSTS header
 kitabgaul.com: did not receive HSTS header
 kitakemon.com: could not connect to host
 kitashop.com.br: did not receive HSTS header
 kitatec.com.br: could not connect to host
@@ -7272,17 +7286,17 @@ land-links.org: did not receive HSTS hea
 landbetweenthelakes.us: did not receive HSTS header
 landgoedverkopen.nl: could not connect to host
 landhuisverkopen.nl: could not connect to host
 landscape.canonical.com: max-age too low: 2592000
 landscapingmedic.com: did not receive HSTS header
 langenbach.rocks: could not connect to host
 langendries.eu: could not connect to host
 langhun.me: did not receive HSTS header
-laniakean.com: could not connect to host
+laniakean.com: did not receive HSTS header
 lansinoh.co.uk: did not receive HSTS header
 lanzainc.xyz: did not receive HSTS header
 laobox.fr: could not connect to host
 laplaceduvillage.net: could not connect to host
 laquack.com: could not connect to host
 laredsemanario.com: could not connect to host
 lasepiataca.com: did not receive HSTS header
 lasercloud.ml: could not connect to host
@@ -7393,16 +7407,17 @@ lichess4545.com: did not receive HSTS he
 lichess4545.tv: did not receive HSTS header
 liebach.me: did not receive HSTS header
 liebestarot.at: did not receive HSTS header
 liemen.net: did not receive HSTS header
 life-time.nl: did not receive HSTS header
 lifecoachproviders.com: did not receive HSTS header
 lifeguard.aecom.com: did not receive HSTS header
 lifeinitsownway.com: could not connect to host
+lifemarque.co.uk: did not receive HSTS header
 lifeng.us: did not receive HSTS header
 lifeskillsdirect.com: did not receive HSTS header
 lifetimemoneymachine.com: did not receive HSTS header
 lifeventure.co.uk: did not receive HSTS header
 lightarmory.com: could not connect to host
 lightning-ashe.com: did not receive HSTS header
 lightnovelsekai.com: could not connect to host
 lightpaste.com: could not connect to host
@@ -7477,32 +7492,31 @@ localnetwork.nz: could not connect to ho
 locksmithrandburg24-7.co.za: could not connect to host
 locktheirphone.com: could not connect to host
 lockyourcomputer.pw: did not receive HSTS header
 locomotive.ca: did not receive HSTS header
 locvis.ru: did not receive HSTS header
 lodgesdureynou.fr: did not receive HSTS header
 loftboard.eu: could not connect to host
 log2n.uk: could not connect to host
-loganparkneighborhood.org: did not receive HSTS header
 logario.com.br: could not connect to host
 logfile.ch: did not receive HSTS header
 logicaladvertising.com: could not connect to host
 login.persona.org: could not connect to host
 loginseite.com: could not connect to host
 logistify.com.mx: did not receive HSTS header
 lognot.net: could not connect to host
 logymedia.com: could not connect to host
 loisircreatif.net: did not receive HSTS header
 lojadocristaozinho.com.br: did not receive HSTS header
 lojashowdecozinha.com.br: could not connect to host
 lojasviavento.com.br: could not connect to host
 lojavalcapelli.com.br: could not connect to host
 loli.bz: did not receive HSTS header
-loli.ski: did not receive HSTS header
+loli.ski: could not connect to host
 lolicore.ch: could not connect to host
 lolidunno.com: could not connect to host
 loma.ml: did not receive HSTS header
 londoncalling.co: did not receive HSTS header
 londonlanguageexchange.com: could not connect to host
 lonerwolf.com: did not receive HSTS header
 longboarding-ulm.de: could not connect to host
 look-at-my.site: could not connect to host
@@ -7553,16 +7567,17 @@ lucas-garte.com: did not receive HSTS he
 lucaterzini.com: could not connect to host
 luclu7.pw: could not connect to host
 lucyparsonslabs.com: did not receive HSTS header
 ludwig.click: did not receive HSTS header
 lufthansaexperts.com: max-age too low: 2592000
 luis-checa.com: could not connect to host
 lukaszdolan.com: did not receive HSTS header
 lukeng.me: could not connect to host
+lukeng.net: did not receive HSTS header
 lukonet.com: did not receive HSTS header
 luludapomerania.com: could not connect to host
 lumd.me: could not connect to host
 lumi.do: did not receive HSTS header
 lunarift.com: could not connect to host
 lunarrift.net: could not connect to host
 luneta.nearbuysystems.com: could not connect to host
 luno.io: could not connect to host
@@ -7572,17 +7587,16 @@ luoxiao.im: could not connect to host
 luripump.se: could not connect to host
 lusis.fr: did not receive HSTS header
 lusis.net: did not receive HSTS header
 lustrumxi.nl: could not connect to host
 luther.fi: did not receive HSTS header
 luxinmo.com: did not receive HSTS header
 luxus-russen.de: did not receive HSTS header
 luzeshomologadas.com.br: could not connect to host
-luzfaltex.com: did not receive HSTS header
 lycly.top: could not connect to host
 lydia-und-simon.de: could not connect to host
 lydiagorstein.com: could not connect to host
 lyonelkaufmann.ch: did not receive HSTS header
 lyoness.digital: did not receive HSTS header
 lyonl.com: did not receive HSTS header
 lyuba.fr: could not connect to host
 lzahq.tech: did not receive HSTS header
@@ -7728,17 +7742,17 @@ markusweimar.de: did not receive HSTS he
 marlen.cz: did not receive HSTS header
 marleyresort.com: did not receive HSTS header
 maroc-bivouac.com: did not receive HSTS header
 marriottvetcareers.com: could not connect to host
 marshut.net: could not connect to host
 martialc.be: could not connect to host
 martiert.com: could not connect to host
 martijnvhoof.nl: could not connect to host
-martin-arend.de: did not receive HSTS header
+martin-arend.de: could not connect to host
 martinec.co.uk: could not connect to host
 martinestyle.com: could not connect to host
 martineve.com: did not receive HSTS header
 martinp.no: could not connect to host
 martinreed.net: did not receive HSTS header
 martinrogalla.com: did not receive HSTS header
 marumagic.com: did not receive HSTS header
 marvinkeller.de: did not receive HSTS header
@@ -7821,23 +7835,21 @@ mecenat-cassous.com: did not receive HST
 mechmk1.me: did not receive HSTS header
 medallia.io: could not connect to host
 media-access.online: did not receive HSTS header
 mediacru.sh: could not connect to host
 mediafinancelab.org: did not receive HSTS header
 mediamag.am: max-age too low: 0
 mediawikicn.org: could not connect to host
 medienservice-fritz.de: did not receive HSTS header
-medifab.online: did not receive HSTS header
 medirich.co: could not connect to host
 meditek-dv.ru: could not connect to host
 mediterenopmaandag.nl: did not receive HSTS header
 medm-test.com: could not connect to host
 medzinenews.com: did not receive HSTS header
-meedoennoordkop.nl: could not connect to host
 meedoenzaanstad.nl: did not receive HSTS header
 meetfinch.com: could not connect to host
 meetingmanage.nl: did not receive HSTS header
 meetingmanager.ovh: did not receive HSTS header
 meetscompany.jp: did not receive HSTS header
 megakiste.de: could not connect to host
 megashur.se: did not receive HSTS header
 meghudson.com: could not connect to host
@@ -7857,17 +7869,16 @@ melodiouscode.net: did not receive HSTS 
 melted.pw: could not connect to host
 melvinlow.com: did not receive HSTS header
 memberpress.com: did not receive HSTS header
 members.mayfirst.org: did not receive HSTS header
 memeblast.ninja: could not connect to host
 memory-plus-180.com: could not connect to host
 memorygame.io: did not receive HSTS header
 memorytrace.space: could not connect to host
-menotag.com: did not receive HSTS header
 mensachterdepatient.nl: max-age too low: 2592000
 mensmaximus.de: did not receive HSTS header
 mentax.net: did not receive HSTS header
 menthix.net: could not connect to host
 menudrivetest.com: could not connect to host
 meow.cloud: could not connect to host
 meozcraft.com: could not connect to host
 mercamaris.es: did not receive HSTS header
@@ -7918,17 +7929,17 @@ michaelscrivo.com: did not receive HSTS 
 michaelwaite.org: could not connect to host
 michal-kral.cz: could not connect to host
 michalborka.cz: could not connect to host
 michel.pt: did not receive HSTS header
 michelledonelan.co.uk: did not receive HSTS header
 michiganmetalartwork.com: max-age too low: 7889238
 miconware.de: could not connect to host
 micro-dv.ru: could not connect to host
-micro-rain-systems.com: did not receive HSTS header
+micro-rain-systems.com: could not connect to host
 microme.ga: could not connect to host
 micropple.net: could not connect to host
 microtalk.org: could not connect to host
 midirs.org: did not receive HSTS header
 midonet.org: did not receive HSTS header
 midriversmotorsllc.com: did not receive HSTS header
 midwestwomenworkers.org: could not connect to host
 miegl.cz: could not connect to host
@@ -7990,17 +8001,16 @@ minh.at: did not receive HSTS header
 mini-piraten.de: did not receive HSTS header
 minikneet.nl: could not connect to host
 minimoo.se: could not connect to host
 minis-hip.de: max-age too low: 172800
 minkondom.nu: could not connect to host
 minnesotadata.com: could not connect to host
 minora.io: could not connect to host
 minoris.se: could not connect to host
-mintea-noua.ro: did not receive HSTS header
 mipiaci.co.nz: did not receive HSTS header
 mipiaci.com.au: did not receive HSTS header
 miragrow.com: could not connect to host
 mirindadomo.ru: did not receive HSTS header
 mironized.com: did not receive HSTS header
 mirrorx.com: did not receive HSTS header
 misericordiasegrate.org: did not receive HSTS header
 misgluteosperfectos.com: did not receive HSTS header
@@ -8152,21 +8162,22 @@ mrdani.net: could not connect to host
 mrdleisure.co.uk: did not receive HSTS header
 mredsanders.net: did not receive HSTS header
 mrettich.org: did not receive HSTS header
 mrhee.com: did not receive HSTS header
 mrning.com: did not receive HSTS header
 mrnonz.com: max-age too low: 0
 mrparker.pw: did not receive HSTS header
 mrpopat.in: did not receive HSTS header
-mrs-shop.com: did not receive HSTS header
+mrs-shop.com: could not connect to host
 mrsbairds.com: max-age too low: 86400
 msc-seereisen.net: max-age too low: 0
 mstd.tokyo: did not receive HSTS header
 mstdn-tech.jp: could not connect to host
+mstdn.nl: did not receive HSTS header
 mszaki.com: did not receive HSTS header
 mt.me.uk: could not connect to host
 mtamaki.com: could not connect to host
 mtcgf.com: did not receive HSTS header
 mtdn.jp: could not connect to host
 mtg-esport.de: did not receive HSTS header
 muevetumundo.com.mx: max-age too low: 86400
 mujadin.se: did not receive HSTS header
@@ -8280,17 +8291,17 @@ namacindia.com: did not receive HSTS hea
 namaho.com: could not connect to host
 named.ga: could not connect to host
 nameme.xyz: could not connect to host
 nametaken-cloud.duckdns.org: could not connect to host
 namethatbone.com: could not connect to host
 namorico.me: could not connect to host
 nan.ci: did not receive HSTS header
 nan.zone: could not connect to host
-naniki.co.uk: did not receive HSTS header
+naniki.co.uk: could not connect to host
 nanogeneinc.com: could not connect to host
 nanokamo.com: did not receive HSTS header
 nanrenba.net: could not connect to host
 nansay.cn: could not connect to host
 nanto.eu: could not connect to host
 narodniki.com: did not receive HSTS header
 narviz.com: did not receive HSTS header
 nashira.cz: did not receive HSTS header
@@ -8471,17 +8482,16 @@ nopol.de: could not connect to host
 norandom.com: could not connect to host
 norb.at: could not connect to host
 nordic-survival.de: did not receive HSTS header
 nordiccasinocommunity.com: did not receive HSTS header
 nordlicht.photography: did not receive HSTS header
 norge.guide: could not connect to host
 northcutt.com: did not receive HSTS header
 northernpage.com: did not receive HSTS header
-northfieldyarn.com: did not receive HSTS header
 northpennvwparts.com: max-age too low: 300
 northwest-events.co.uk: did not receive HSTS header
 nosecretshop.com: could not connect to host
 nostraspace.com: did not receive HSTS header
 notadd.io: could not connect to host
 notarankastojkovic.me: could not connect to host
 notarobot.fr: did not receive HSTS header
 notenoughtime.de: could not connect to host
@@ -8766,16 +8776,17 @@ oxymc.com: did not receive HSTS header
 oxynux.fr: could not connect to host
 oyste.in: could not connect to host
 ozoz.cc: could not connect to host
 p-rickroll-o.pw: could not connect to host
 p.linode.com: could not connect to host
 p1c.pw: could not connect to host
 p3.marketing: did not receive HSTS header
 p3in.com: could not connect to host
+p3ter.fr: did not receive HSTS header
 p8r.de: could not connect to host
 paavolastudio.com: did not receive HSTS header
 pablocamino.tk: could not connect to host
 packlane.com: did not receive HSTS header
 pactocore.org: could not connect to host
 paestbin.com: could not connect to host
 pagedesignshop.com: did not receive HSTS header
 pagerate.io: could not connect to host
@@ -8828,17 +8839,16 @@ parodybit.net: did not receive HSTS head
 parpaing-paillette.net: could not connect to host
 particonpsplus.it: could not connect to host
 partiono.com: did not receive HSTS header
 partirkyoto.jp: did not receive HSTS header
 partnercardservices.com: did not receive HSTS header
 partnersfcu.org: did not receive HSTS header
 partyhaus.ovh: could not connect to host
 partyhireformby.co.uk: did not receive HSTS header
-partyspecialists.com: did not receive HSTS header
 partyvan.eu: could not connect to host
 partyvan.it: could not connect to host
 partyvan.moe: could not connect to host
 partyvan.nl: could not connect to host
 partyvan.se: could not connect to host
 pascalchristen.ch: did not receive HSTS header
 pascaline-jouis.fr: did not receive HSTS header
 passpilot.co.uk: did not receive HSTS header
@@ -8902,16 +8912,17 @@ peliculasaudiolatinoonline.com: could no
 peliseries24.com: did not receive HSTS header
 pemberton.at: did not receive HSTS header
 penablog.com: did not receive HSTS header
 pencillab.cn: did not receive HSTS header
 pengui.uk: could not connect to host
 penguinclientsystem.com: did not receive HSTS header
 pennylane.me.uk: did not receive HSTS header
 pensanisso.com: max-age too low: 2592000
+pensionpilot.ca: did not receive HSTS header
 pentagram.me: max-age too low: 2592000
 pentano.net: could not connect to host
 people-mozilla.org: could not connect to host
 peperiot.com: did not receive HSTS header
 pepper.dog: did not receive HSTS header
 pepperhead.com: did not receive HSTS header
 pepperworldhotshop.de: did not receive HSTS header
 pepsicoemployeepreferencesurvey.com: could not connect to host
@@ -9027,17 +9038,16 @@ pixelhero.co.uk: did not receive HSTS he
 pixi.chat: could not connect to host
 pixi.me: did not receive HSTS header
 pizzadoc.ch: could not connect to host
 pjbet.mg: did not receive HSTS header
 pkautodesign.com: did not receive HSTS header
 pkschat.com: could not connect to host
 placollection.org: could not connect to host
 plaettliaktion.ch: did not receive HSTS header
-planete-lira.fr: did not receive HSTS header
 planpharmacy.com: could not connect to host
 plant.ml: did not receive HSTS header
 plantroon.com: could not connect to host
 plass.hamburg: could not connect to host
 plasvilledescartaveis.com.br: could not connect to host
 plataformadeinformacion.es: max-age too low: 30000
 platform.lookout.com: could not connect to host
 platomania.eu: did not receive HSTS header
@@ -9055,16 +9065,17 @@ plirt.ru: could not connect to host
 plixer.com: did not receive HSTS header
 plogable.co: could not connect to host
 plombirator.kz: did not receive HSTS header
 plothost.com: did not receive HSTS header
 ploup.net: could not connect to host
 pluff.nl: did not receive HSTS header
 plus-digital.net: did not receive HSTS header
 plus-u.com.au: did not receive HSTS header
+plustech.id: did not receive HSTS header
 plut.org: did not receive HSTS header
 plymouthsoftplay.co.uk: could not connect to host
 pm13-media.cz: could not connect to host
 pmac.pt: could not connect to host
 pmemanager.fr: did not receive HSTS header
 pmnts.io: could not connect to host
 pneusgppremium.com.br: did not receive HSTS header
 pnukee.com: did not receive HSTS header
@@ -9229,17 +9240,16 @@ ps-w.ru: did not receive HSTS header
 ps-x.ru: did not receive HSTS header
 pscleaningsolutions.co.uk: could not connect to host
 pshostpk.com: did not receive HSTS header
 psicologia.co.ve: could not connect to host
 psicologoforensebarcelona.com: did not receive HSTS header
 pstudio.me: did not receive HSTS header
 psw.academy: could not connect to host
 psw.consulting: could not connect to host
-psylab.cc: did not receive HSTS header
 ptn.moscow: could not connect to host
 ptonet.com: could not connect to host
 ptrujillo.com: did not receive HSTS header
 pubkey.is: could not connect to host
 publications.qld.gov.au: did not receive HSTS header
 publicidadnovagrass.com.mx: could not connect to host
 puentes.info: did not receive HSTS header
 pugliese.fr: could not connect to host
@@ -9347,17 +9357,16 @@ rainbowbarracuda.com: could not connect 
 ramarka.de: could not connect to host
 ramon-c.nl: could not connect to host
 ramonj.nl: could not connect to host
 randomcage.com: did not receive HSTS header
 randomcloud.net: could not connect to host
 randomhero.cloud: could not connect to host
 randomwinpicker.de: could not connect to host
 randy.pw: could not connect to host
-randy.su: could not connect to host
 ranegroup.hosting: could not connect to host
 rankthespot.com: could not connect to host
 ranktopay.com: did not receive HSTS header
 rannseier.org: did not receive HSTS header
 rany.duckdns.org: could not connect to host
 rany.io: could not connect to host
 rany.pw: could not connect to host
 rapidresearch.me: could not connect to host
@@ -9608,17 +9617,16 @@ roundtheme.com: did not receive HSTS hea
 rous.se: could not connect to host
 rouvray.org: could not connect to host
 royal-forest.org: max-age too low: 0
 royal-mangal.ch: could not connect to host
 royalhop.co: could not connect to host
 royalpub.net: did not receive HSTS header
 royalsignaturecruise.com: could not connect to host
 roychan.org: max-age too low: 0
-rozalisbengal.ro: did not receive HSTS header
 rozeapp.nl: could not connect to host
 rr.in.th: could not connect to host
 rrke.cc: did not receive HSTS header
 rsajeey.info: could not connect to host
 rsampaio.info: did not receive HSTS header
 rsblake.net: could not connect to host
 rsf.io: could not connect to host
 rsi.im: did not receive HSTS header
@@ -9633,16 +9641,17 @@ rubysecurity.org: did not receive HSTS h
 rubyshop.nl: max-age too low: 604800
 rudeotter.com: did not receive HSTS header
 rue-de-la-vieille.fr: max-age too low: 0
 rugirlfriend.com: could not connect to host
 rugs.ca: did not receive HSTS header
 rugstorene.co.uk: did not receive HSTS header
 ruig.jp: could not connect to host
 ruitershoponline.nl: did not receive HSTS header
+ruja.dk: did not receive HSTS header
 rumoterra.com.br: could not connect to host
 runawebinar.nl: could not connect to host
 runhardt.eu: did not receive HSTS header
 runtl.com: did not receive HSTS header
 runtondev.com: did not receive HSTS header
 ruqu.nl: could not connect to host
 rusadmin.biz: did not receive HSTS header
 ruska-modra.cz: did not receive HSTS header
@@ -9705,31 +9714,33 @@ sanik.my: did not receive HSTS header
 sanissimo.com.mx: max-age too low: 86400
 sansage.com.br: could not connect to host
 sansdev.com: could not connect to host
 sansemea.com: did not receive HSTS header
 santi.eu: did not receive HSTS header
 santing.net: could not connect to host
 santorinibbs.com: did not receive HSTS header
 santouri.be: could not connect to host
+saoneth.pl: max-age too low: 2592000
 saotn.org: did not receive HSTS header
 sarah-beckett-harpist.com: did not receive HSTS header
 sarahsweetlife.com: could not connect to host
 sarahsweger.com: could not connect to host
 sarakas.com: could not connect to host
 saraleebread.com: max-age too low: 86400
 sarangsemutbandung.com: could not connect to host
 sarisonproductions.com: did not receive HSTS header
 sarkarischeme.in: could not connect to host
 saruwebshop.co.za: could not connect to host
 sat.rent: did not receive HSTS header
 satanichia.moe: could not connect to host
 satmep.com: did not receive HSTS header
 satoshicrypt.com: did not receive HSTS header
 satragreen.com: did not receive HSTS header
+satrent.com: did not receive HSTS header
 satrent.se: did not receive HSTS header
 satriyowibowo.my.id: did not receive HSTS header
 satsukii.moe: did not receive HSTS header
 saturne.tk: could not connect to host
 saturngames.co.uk: could not connect to host
 saucyfox.net: did not receive HSTS header
 saudeeconforto.com.br: did not receive HSTS header
 saumon.xyz: could not connect to host
@@ -9737,17 +9748,17 @@ saunasandstuff.ca: did not receive HSTS 
 saunasandstuff.com: did not receive HSTS header
 savacloud.com: did not receive HSTS header
 save.gov: could not connect to host
 saveaward.gov: could not connect to host
 savemoneyonenergy.com: max-age too low: 2592000
 saveyour.biz: could not connect to host
 savisasolutions.co.za: did not receive HSTS header
 savvysuit.com: did not receive HSTS header
-sawamura-rental.com: did not receive HSTS header
+sawamura-rental.com: max-age too low: 0
 say-hanabi.com: could not connect to host
 sayhanabi.com: could not connect to host
 sazima.ru: did not receive HSTS header
 sbobetfun.com: could not connect to host
 sbox-archives.com: could not connect to host
 sby.de: did not receive HSTS header
 sc4le.com: could not connect to host
 scala.click: did not receive HSTS header
@@ -9773,17 +9784,19 @@ schulterglatzen-altenwalde.de: could not
 schultzflorists.com: could not connect to host
 schwarzkopfforyou.de: did not receive HSTS header
 schweiz.guide: could not connect to host
 schweizerbolzonello.net: could not connect to host
 schwetz.net: could not connect to host
 scicasts.com: max-age too low: 7776000
 scienceathome.org: did not receive HSTS header
 sciencebase.gov: did not receive HSTS header
+scionasset.com: did not receive HSTS header
 scivillage.com: did not receive HSTS header
+sckc.stream: did not receive HSTS header
 sclgroup.cc: did not receive HSTS header
 scooshonline.co.uk: did not receive HSTS header
 scopea.fr: max-age too low: 0
 score-savers.com: max-age too low: 10540800
 scores4schools.com: could not connect to host
 scotbirchfield.com: did not receive HSTS header
 scottdial.com: did not receive HSTS header
 scottferguson.com.au: did not receive HSTS header
@@ -9799,17 +9812,16 @@ screenresolution.space: could not connec
 screensaversplanet.com: did not receive HSTS header
 scribbleserver.com: could not connect to host
 scribe.systems: could not connect to host
 scrion.com: could not connect to host
 scriptenforcer.net: did not receive HSTS header
 scriptict.nl: could not connect to host
 scrollstory.com: did not receive HSTS header
 sdhmanagementgroup.com: could not connect to host
-sdho.org: did not receive HSTS header
 sdia.ru: could not connect to host
 sdmoscow.ru: could not connect to host
 sdrobs.com: did not receive HSTS header
 sdsl-speedtest.de: could not connect to host
 se7ensins.com: did not receive HSTS header
 seans.cc: did not receive HSTS header
 searchgov.gov.il: did not receive HSTS header
 seavancouver.com: could not connect to host
@@ -9852,17 +9864,17 @@ securityinet.net: did not receive HSTS h
 securityinet.org.il: could not connect to host
 securiviera.ch: did not receive HSTS header
 sedoexpert.nl: could not connect to host
 sedoexperts.nl: could not connect to host
 sedrubal.de: could not connect to host
 sedziapilkarski.pl: did not receive HSTS header
 seedboxers.net: could not connect to host
 seefunk.net: did not receive HSTS header
-seehimnude.com: max-age too low: 0
+seehimnude.com: could not connect to host
 seele.ca: could not connect to host
 sehenderson.com: did not receive HSTS header
 seiler-bad.de: did not receive HSTS header
 seizoushokoyuubangou.com: did not receive HSTS header
 sektor.team: could not connect to host
 selecadm.name: could not connect to host
 selectary.com: could not connect to host
 selectcertifiedautos.com: did not receive HSTS header
@@ -10097,16 +10109,17 @@ skyrunners.ch: could not connect to host
 skyveo.ml: did not receive HSTS header
 skyway.capital: did not receive HSTS header
 sl1pkn07.wtf: max-age too low: 2592000
 slanterns.net: could not connect to host
 slash-dev.de: did not receive HSTS header
 slashand.co: could not connect to host
 slashdesign.it: did not receive HSTS header
 slashem.me: could not connect to host
+slatop.org: did not receive HSTS header
 slattery.co: could not connect to host
 slauber.de: did not receive HSTS header
 sleeklounge.com: did not receive HSTS header
 sleep10.com: could not connect to host
 sleepstar.com.mt: did not receive HSTS header
 slicketl.com: did not receive HSTS header
 slightfuture.click: could not connect to host
 slightfuture.com: did not receive HSTS header
@@ -10114,16 +10127,17 @@ slix.io: could not connect to host
 slope.haus: could not connect to host
 slovakiana.sk: did not receive HSTS header
 slovoice.org: could not connect to host
 slowsociety.org: could not connect to host
 sluplift.com: did not receive HSTS header
 slycurity.de: did not receive HSTS header
 smablo.com: did not receive HSTS header
 smallcdn.rocks: could not connect to host
+smalldogbreeds.net: did not receive HSTS header
 smallshopit.com: did not receive HSTS header
 smart-mirror.de: did not receive HSTS header
 smart-ov.nl: could not connect to host
 smartbuyelectric.com: could not connect to host
 smartcoin.com.br: could not connect to host
 smartfon4you.ru: max-age too low: 0
 smarthomedna.com: did not receive HSTS header
 smartit.pro: did not receive HSTS header
@@ -10218,25 +10232,26 @@ southside-crew.club: could not connect t
 southworcestershiregpservices.co.uk: could not connect to host
 souvik.me: did not receive HSTS header
 souyar.de: could not connect to host
 souyar.net: could not connect to host
 souyar.us: could not connect to host
 sovereignshare.com: could not connect to host
 sown.dyndns.org: could not connect to host
 soz6.com: did not receive HSTS header
+spacecafe.org: did not receive HSTS header
 spacedust.xyz: could not connect to host
 spacefish.biz: could not connect to host
 spacehq.org: could not connect to host
 spacemo.com: did not receive HSTS header
 spacountryexplorer.org.au: did not receive HSTS header
 spaggel.nl: did not receive HSTS header
 spamloco.net: did not receive HSTS header
 spangehlassociates.com: did not receive HSTS header
-sparelib.com: max-age too low: 3650
+sparelib.com: could not connect to host
 spark.team: could not connect to host
 sparklingsparklers.com: did not receive HSTS header
 sparmedo.de: did not receive HSTS header
 sparsa.army: could not connect to host
 sparta-trade.com: could not connect to host
 spauted.com: could not connect to host
 spdysync.com: could not connect to host
 specialedesigns.com: could not connect to host
@@ -10296,19 +10311,18 @@ ssn1.ru: did not receive HSTS header
 sspanda.com: could not connect to host
 ssworld.ga: could not connect to host
 staack.com: could not connect to host
 stabletoken.com: could not connect to host
 stackfiles.io: could not connect to host
 stadjerspasonline.nl: could not connect to host
 stadtbauwerk.at: did not receive HSTS header
 staffjoy.com: did not receive HSTS header
-staffjoystaging.com: could not connect to host
+staffjoystaging.com: did not receive HSTS header
 stahl.xyz: could not connect to host
-staklim-malang.info: did not receive HSTS header
 stalkerhispano.com: max-age too low: 0
 stalkerteam.pl: did not receive HSTS header
 stalschermer.nl: could not connect to host
 stamparmakarije.me: did not receive HSTS header
 standardssuck.org: did not receive HSTS header
 standingmist.com: did not receive HSTS header
 stannahtrapliften.nl: did not receive HSTS header
 starandshield.com: did not receive HSTS header
@@ -10421,17 +10435,16 @@ sudo.li: did not receive HSTS header
 sugarcitycon.com: could not connect to host
 sugarsweetorsour.com: did not receive HSTS header
 suian.or.jp: max-age too low: 86400
 suite73.org: could not connect to host
 summitbankofkc.com: did not receive HSTS header
 summitmasters.net: did not receive HSTS header
 sumoatm.com: did not receive HSTS header
 sumoscout.de: could not connect to host
-sun-wellness-online.com.vn: did not receive HSTS header
 suncountrymarine.com: did not receive HSTS header
 sundaycooks.com: max-age too low: 2592000
 sunflyer.cn: did not receive HSTS header
 sunlandsg.vn: did not receive HSTS header
 sunnyfruit.ru: could not connect to host
 sunshinepress.org: could not connect to host
 sunyanzi.tk: could not connect to host
 suos.io: could not connect to host
@@ -10514,17 +10527,16 @@ szongott.net: did not receive HSTS heade
 t-complex.space: could not connect to host
 t-ken.xyz: could not connect to host
 t-point.eu: did not receive HSTS header
 t-tz.com: could not connect to host
 t0dd.eu: could not connect to host
 t4c-rebirth.com: could not connect to host
 t4x.org: could not connect to host
 taabe.xyz: could not connect to host
-taartenfeesies.nl: did not receive HSTS header
 taberu-fujitsubo.com: did not receive HSTS header
 tabitatsu.jp: did not receive HSTS header
 tacotown.tk: did not receive HSTS header
 tadigitalstore.com: could not connect to host
 tafoma.com: did not receive HSTS header
 tageau.com: could not connect to host
 taglondon.org: did not receive HSTS header
 tahakomat.cz: could not connect to host
@@ -10772,17 +10784,16 @@ thesearchnerds.co.uk: did not receive HS
 thesecurityteam.net: could not connect to host
 theshopally.com: did not receive HSTS header
 thesplit.is: could not connect to host
 thestack.xyz: could not connect to host
 thestagchorleywood.co.uk: did not receive HSTS header
 thethirdroad.com: did not receive HSTS header
 thetradinghall.com: could not connect to host
 theurbanyoga.com: did not receive HSTS header
-theuucc.org: did not receive HSTS header
 thevintagenews.com: did not receive HSTS header
 thewallset.com: did not receive HSTS header
 thewebfellas.com: did not receive HSTS header
 theweilai.com: did not receive HSTS header
 theworkingeye.nl: could not connect to host
 thewp.pro: could not connect to host
 thezonders.com: did not receive HSTS header
 thgros.fr: could not connect to host
@@ -10868,17 +10879,16 @@ titouan.co: did not receive HSTS header
 tittarpuls.se: could not connect to host
 titties.ml: could not connect to host
 tjc.wiki: could not connect to host
 tjeckien.guide: could not connect to host
 tkappertjedemetamorfose.nl: could not connect to host
 tkarstens.de: did not receive HSTS header
 tkjg.fi: did not receive HSTS header
 tkonstantopoulos.tk: could not connect to host
-tlach.cz: did not receive HSTS header
 tlcdn.net: could not connect to host
 tlo.hosting: could not connect to host
 tlo.link: could not connect to host
 tlo.network: could not connect to host
 tls.li: could not connect to host
 tlsbv.nl: did not receive HSTS header
 tlshost.net: could not connect to host
 tm-solutions.eu: could not connect to host
@@ -11034,16 +11044,17 @@ troo.ly: could not connect to host
 trouter.io: could not connect to host
 true.ink: did not receive HSTS header
 truebred-labradors.com: did not receive HSTS header
 trunkjunk.co: did not receive HSTS header
 trustedinnovators.com: did not receive HSTS header
 trusteecar.com: did not receive HSTS header
 trustmeimfancy.com: could not connect to host
 trybind.com: could not connect to host
+tryfm.net: did not receive HSTS header
 tryoneday.co: did not receive HSTS header
 ts2.se: could not connect to host
 ts3.consulting: could not connect to host
 tsecy.com: could not connect to host
 tsgoc.com: did not receive HSTS header
 tsrstore.gq: could not connect to host
 tssouthernpower.com: max-age too low: 0
 tsumegumi.net: could not connect to host
@@ -11132,17 +11143,16 @@ ubuntuhot.com: could not connect to host
 uefeng.com: did not receive HSTS header
 uega.net: did not receive HSTS header
 ufgaming.com: did not receive HSTS header
 ufotable.uk: did not receive HSTS header
 ugisgutless.com: could not connect to host
 ugo.ninja: could not connect to host
 ugosadventures.com: could not connect to host
 uhm.io: did not receive HSTS header
-uitslagensoftware.nl: did not receive HSTS header
 ukas.com: did not receive HSTS header
 ukdropshipment.co.uk: did not receive HSTS header
 ukdropshipment.com: did not receive HSTS header
 ukk.dk: did not receive HSTS header
 ukrgadget.com: could not connect to host
 ulabox.cat: did not receive HSTS header
 ulabox.es: did not receive HSTS header
 ullamodaintima.com.br: could not connect to host
@@ -11185,17 +11195,17 @@ under30stravelinsurance.com.au: did not 
 underkin.com: could not connect to host
 unfiltered.nyc: could not connect to host
 ungern.guide: could not connect to host
 uni-games.com: could not connect to host
 unicefkaarten.be: did not receive HSTS header
 unicooo.com: could not connect to host
 unifei.edu.br: did not receive HSTS header
 uniformecomgas.com.br: could not connect to host
-uniformehope.com.br: did not receive HSTS header
+uniformehope.com.br: could not connect to host
 uniformehumboldt.com.br: did not receive HSTS header
 unikitty-on-tour.com: could not connect to host
 unionstationapp.com: could not connect to host
 unison.com: did not receive HSTS header
 unisyssecurity.com: did not receive HSTS header
 uniteasia.org: did not receive HSTS header
 unitlabs.net: could not connect to host
 unitrade-425.co.za: did not receive HSTS header
@@ -11432,16 +11442,17 @@ vliegensvlug.services: max-age too low: 
 vlora.city: could not connect to host
 vm0.eu: could not connect to host
 vmrdev.com: could not connect to host
 voceinveste.com: did not receive HSTS header
 voicesuk.co.uk: did not receive HSTS header
 voidserv.net: could not connect to host
 volbyzive.cz: did not receive HSTS header
 volcrado.com: did not receive HSTS header
+voliere-info.nl: did not receive HSTS header
 volkden.com: could not connect to host
 volkerwesselswave.nl: did not receive HSTS header
 voltotc.com: did not receive HSTS header
 vonavy-cukor.sk: could not connect to host
 vonavycukor.sk: could not connect to host
 vonedelmann.de: did not receive HSTS header
 vonterra.us: did not receive HSTS header
 vooreenveiligthuis.nl: did not receive HSTS header
@@ -11482,22 +11493,22 @@ vyvybean.cf: could not connect to host
 vyvygen.com: did not receive HSTS header
 vzk.io: could not connect to host
 w2gshop.com.br: could not connect to host
 w4a.fr: could not connect to host
 w4xzr.top: could not connect to host
 w4xzr.xyz: could not connect to host
 w9rld.com: did not receive HSTS header
 wachtwoordencheck.nl: could not connect to host
-wafairhaven.com.au: did not receive HSTS header
 wait.moe: could not connect to host
 waixingrenfuli7.vip: could not connect to host
 wakapp.de: could not connect to host
 wakened.net: did not receive HSTS header
 walkeryoung.ca: could not connect to host
+walkingforhealth.org.uk: did not receive HSTS header
 wallabag.it: did not receive HSTS header
 wallabag.org: did not receive HSTS header
 wallsblog.dk: could not connect to host
 walnutgaming.co.uk: could not connect to host
 walterlynnmosley.com: did not receive HSTS header
 wanban.io: could not connect to host
 wangjun.me: did not receive HSTS header
 wangkezun.com: could not connect to host
@@ -11514,16 +11525,17 @@ warekit.io: did not receive HSTS header
 warhistoryonline.com: did not receive HSTS header
 warped.com: did not receive HSTS header
 warrencreative.com: did not receive HSTS header
 warsentech.com: could not connect to host
 warsh.moe: did not receive HSTS header
 warumsuchen.at: did not receive HSTS header
 wasatchcrest.com: did not receive HSTS header
 wasi-net.de: did not receive HSTS header
+wasielewski.com.de: did not receive HSTS header
 watchium.com: did not receive HSTS header
 waterforlife.net.au: did not receive HSTS header
 waterpoint.com.br: could not connect to host
 watersportmarkt.net: did not receive HSTS header
 watsonhall.uk: could not connect to host
 wattechweb.com: did not receive HSTS header
 wavefloatrooms.com: did not receive HSTS header
 wavefrontsystemstech.com: could not connect to host
@@ -11553,17 +11565,16 @@ webeconomia.it: did not receive HSTS hea
 webelement.sk: did not receive HSTS header
 weberjulia.com: could not connect to host
 webfronten.dk: did not receive HSTS header
 webhelyesarcu.hu: did not receive HSTS header
 webhosting4.net: did not receive HSTS header
 webhostingpros.ml: could not connect to host
 webies.ro: did not receive HSTS header
 webm.to: could not connect to host
-webmail.info: did not receive HSTS header
 webmail.mayfirst.org: did not receive HSTS header
 webmaniabr.com: did not receive HSTS header
 webmarketingfestival.it: did not receive HSTS header
 webninja.work: could not connect to host
 webnosql.com: could not connect to host
 webperformance.ru: could not connect to host
 webproshosting.tk: could not connect to host
 webpublica.pt: could not connect to host
@@ -11626,17 +11637,16 @@ wewillgo.org: did not receive HSTS heade
 wewlad.me: did not receive HSTS header
 wftda.com: did not receive HSTS header
 whatnext.limited: did not receive HSTS header
 whats.io: could not connect to host
 whatsstalk.me: could not connect to host
 whatsyouroffer.co.uk: did not receive HSTS header
 wheresben.today: could not connect to host
 whisker.network: could not connect to host
-whistler-transfers.com: did not receive HSTS header
 whitehat.id: did not receive HSTS header
 whiterabbit.org: did not receive HSTS header
 whiterabbitcakery.com: could not connect to host
 whitestagforge.com: could not connect to host
 whoclicks.net: could not connect to host
 whoisapi.online: could not connect to host
 wholebites.com: max-age too low: 7889238
 wholesomeharvestbread.com: max-age too low: 86400
@@ -11839,17 +11849,17 @@ xiliant.com: did not receive HSTS header
 ximage.me: did not receive HSTS header
 ximens.me: could not connect to host
 xinbiji.cn: could not connect to host
 xinghuokeji.xin: could not connect to host
 xisa.it: could not connect to host
 xivpn.com: could not connect to host
 xiyu.it: did not receive HSTS header
 xiyu.moe: did not receive HSTS header
-xlfblog.com: could not connect to host
+xlfblog.com: did not receive HSTS header
 xlinar.com: did not receive HSTS header
 xmr.my: could not connect to host
 xmv.cz: could not connect to host
 xn--3lqp21gwna.xn--fiqs8s: could not connect to host
 xn--3lqp21gwna.xn--fiqz9s: could not connect to host
 xn--3lqt7ir4md4tzwa.cn: did not receive HSTS header
 xn--3lqt7ir4md4tzwa.xn--fiqs8s: did not receive HSTS header
 xn--3px.jp: could not connect to host
@@ -11892,16 +11902,17 @@ xoda.pw: did not receive HSTS header
 xoffy.com: did not receive HSTS header
 xom.party: could not connect to host
 xor-a.net: could not connect to host
 xperiacodes.com: could not connect to host
 xpi.fr: could not connect to host
 xpj.sx: could not connect to host
 xpressprint.com.br: did not receive HSTS header
 xrp.pw: could not connect to host
+xscapers.com: did not receive HSTS header
 xsyds.cn: did not receive HSTS header
 xtom.email: could not connect to host
 xtream-hosting.com: could not connect to host
 xtream-hosting.de: could not connect to host
 xtream-hosting.eu: could not connect to host
 xtreamhosting.eu: could not connect to host
 xtrim.ru: did not receive HSTS header
 xuexb.com: did not receive HSTS header
@@ -12090,16 +12101,17 @@ zoners.si: did not receive HSTS header
 zonky.io: could not connect to host
 zoo24.de: did not receive HSTS header
 zoofaeth.de: did not receive HSTS header
 zoomingin.net: max-age too low: 5184000
 zoommailing.com: did not receive HSTS header
 zoorigin.com: did not receive HSTS header
 zorasvobodova.cz: did not receive HSTS header
 zortium.report: could not connect to host
+zotero.org: did not receive HSTS header
 zoznamrealit.sk: did not receive HSTS header
 zqhong.com: could not connect to host
 zqjs.tk: could not connect to host
 ztan.tk: could not connect to host
 ztcaoll222.cn: did not receive HSTS header
 ztytian.com: could not connect to host
 zubel.it: did not receive HSTS header
 zuckerfloh.de: did not receive HSTS header
--- a/security/manager/ssl/nsSTSPreloadList.inc
+++ b/security/manager/ssl/nsSTSPreloadList.inc
@@ -3,17 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /*****************************************************************************/
 /* This is an automatically generated file. If you're not                    */
 /* nsSiteSecurityService.cpp, you shouldn't be #including it.     */
 /*****************************************************************************/
 
 #include <stdint.h>
-const PRTime gPreloadListExpirationTime = INT64_C(1532462824852000);
+const PRTime gPreloadListExpirationTime = INT64_C(1532549205674000);
 %%
 0-1.party, 1
 0.me.uk, 1
 0005pay.com, 1
 00100010.net, 1
 0010100.net, 1
 00120012.net, 1
 00130013.net, 1
@@ -147,16 +147,17 @@ 0x65.net, 1
 0x7d.com, 1
 0x7fffffff.net, 1
 0x90.in, 1
 0x90.io, 1
 0xaa55.me, 1
 0xabe.io, 1
 0xacab.org, 1
 0xda.de, 1
+0xdc.io, 0
 0xdefaced.de, 1
 0xee.eu, 1
 0xf00.ch, 1
 0xfc.de, 1
 0xn.de, 1
 0yen.org, 1
 1-2-3bounce.co.uk, 1
 100-downloads.com, 1
@@ -186,16 +187,17 @@ 10453.net, 1
 10495.net, 1
 1066.io, 1
 10774.net, 1
 10840.net, 1
 10gb.io, 1
 10gbit.ovh, 1
 10hz.de, 1
 10og.de, 1
+10ppm.com, 1
 10v2.com, 1
 10x.ooo, 1
 1100.so, 1
 110110110.net, 1
 1116pay.com, 1
 112112112.net, 1
 112app.nl, 1
 112hz.com, 1
@@ -552,17 +554,16 @@ 393422.com, 1
 394022.com, 1
 394122.com, 1
 394322.com, 1
 394522.com, 1
 394622.com, 1
 394922.com, 1
 396422.com, 1
 398.info, 1
-3ags.de, 1
 3bakayottu.com, 1
 3bigking.com, 1
 3c-d.de, 1
 3chat.org, 1
 3circlefunding.ch, 1
 3countiescastlehire.co.uk, 1
 3cs.ch, 1
 3dm.audio, 1
@@ -921,17 +922,17 @@ 789zr.com, 1
 7bwin.com, 1
 7careconnect.com, 1
 7delights.com, 1
 7delights.in, 1
 7geese.com, 1
 7graus.pt, 1
 7kicks.com, 1
 7links.com.br, 1
-7nw.eu, 0
+7nw.eu, 1
 7proxies.com, 1
 7sons.de, 1
 7thcircledesigns.com, 1
 7trade8.com, 1
 7x24servis.com, 1
 8003pay.com, 1
 804322.com, 1
 809422.com, 1
@@ -2095,17 +2096,16 @@ altered.network, 1
 alternador.com.br, 1
 alternative.bike, 1
 alternativebit.fr, 1
 alternativedev.ca, 1
 alternativet.party, 1
 alterspalter.de, 1
 altesses.eu, 1
 altestore.com, 1
-altitudemoversdenver.com, 1
 altkremsmuensterer.at, 1
 altonblom.com, 1
 altopartners.com, 1
 altopia.com, 1
 altphotos.com, 1
 altporn.xyz, 1
 altruistgroup.net, 1
 altstipendiaten.de, 1
@@ -3708,17 +3708,16 @@ ballbusting-cbt.com, 1
 ballejaune.com, 1
 ballinarsl.com.au, 1
 ballmerpeak.org, 1
 ballonsportclub-erlangen.de, 1
 ballotapi.com, 1
 ballothero.com, 1
 ballroom.info, 1
 balonmano.co, 1
-bals.org, 1
 balslev.io, 1
 balticnetworks.com, 1
 bambambaby.com.br, 1
 bamboorelay.com, 1
 bamtoki.com, 1
 bananensap.nl, 1
 bananium.fr, 1
 banburybid.com, 1
@@ -4528,17 +4527,16 @@ binaryapparatus.com, 1
 binaryappdev.com, 1
 binarycreations.scot, 1
 binarydream.fi, 1
 binaryevolved.com, 1
 binarystud.io, 1
 binbin9.com, 1
 binbin9.net, 1
 binding-problem.com, 1
-binfind.com, 1
 bing.com, 1
 bingcheung.com, 1
 bingo-wear.com, 1
 bingo9.net, 1
 bingobank.org, 1
 bingofriends.com, 1
 bingostars.com, 1
 binhex.net, 1
@@ -5128,16 +5126,17 @@ boss.az, 1
 bostadsportal.se, 1
 bosufitness.cz, 1
 bosun.io, 1
 bosworthdental.co.uk, 1
 botlab.ch, 1
 botmanager.pl, 1
 botserver.de, 1
 bottaerisposta.net, 1
+bottineauneighborhood.org, 1
 bottke.berlin, 1
 bou.lt, 1
 bouah.net, 1
 bouchard-mathieux.com, 1
 bouchonville-knifemaker.com, 1
 bouckaert-usedcars.be, 1
 boudah.pl, 1
 boueki.jp, 1
@@ -5746,16 +5745,17 @@ butikvip.ru, 1
 butt.repair, 1
 buttercupstraining.co.uk, 1
 buttermilk.cf, 1
 buttonline.ch, 1
 buturyu.net, 1
 buturyu.org, 1
 buxum-communication.ch, 1
 buy-thing.com, 1
+buyaccessible.gov, 1
 buybike.shop, 1
 buycarpet.shop, 1
 buycook.shop, 1
 buydesired.com, 1
 buydissertations.com, 1
 buyerdocs.com, 1
 buyessay.org, 1
 buyessays.net, 1
@@ -6287,31 +6287,29 @@ catchfotografie.nl, 1
 catchief.com, 1
 catcontent.cloud, 1
 catdecor.ru, 1
 catenacondos.com, 1
 catfooddispensersreviews.com, 1
 catgirl.me, 1
 catgirl.pics, 1
 catharinesomerville.com, 1
-catharisme.eu, 1
 catharisme.net, 1
 catharisme.org, 1
 catherineidylle.com, 1
 catherinesarasin.com, 1
 catherinescastles.co.uk, 1
 catholics.dating, 1
 cathosa.nl, 1
 cativa.net, 1
 catmoose.ca, 1
 catnet.dk, 0
 catnmeow.com, 1
 catsmagic.pp.ua, 1
 cattivo.nl, 0
-catuniverse.org, 1
 catveteran.com, 1
 caughtredhanded.co.nz, 1
 caulfieldeastapartments.com.au, 1
 caulfieldracecourseapartments.com.au, 1
 caulong-ao.net, 1
 causae-fincas.es, 1
 causae.es, 1
 cav.ac, 1
@@ -7004,17 +7002,17 @@ circulatedigital.com, 1
 cirfi.com, 1
 ciri.com.co, 1
 cirope.com, 1
 cirrus0.de, 1
 cirugiasplasticas.com.mx, 1
 cirujanooral.com, 1
 cirurgicagervasio.com.br, 1
 cirurgicalucena.com.br, 1
-ciscodude.net, 1
+ciscodude.net, 0
 cisoaid.com, 1
 ciss.ltd, 1
 cisy.me, 1
 citationgurus.com, 1
 citcuit.in, 1
 citimarinestore.com, 1
 citizen-cam.de, 1
 citizensbankal.com, 1
@@ -7708,23 +7706,21 @@ consiliumvitae.ch, 1
 consill.com, 1
 console.ninja, 1
 console.rest, 1
 consommateuraverti.com, 1
 consonare.de, 1
 constancechen.me, 1
 constant-rough.de, 1
 constares.de, 1
-construct-trust.com, 1
 constructionjobs.com, 1
 constructive.men, 1
 consul.io, 1
 consultcelerity.com, 1
 consultingroupitaly.com, 1
-consultorcr.net, 1
 consultpetkov.com, 1
 consumer.gov, 1
 consumeractionlawgroup.com, 1
 consumerfiles.com, 1
 consumersentinel.gov, 1
 consumidor.gov, 1
 consuwijzer.nl, 1
 contactsingapore.sg, 1
@@ -7784,16 +7780,17 @@ cooldan.com, 1
 coole-fete.de, 1
 coolerssr.space, 1
 coolgifs.de, 1
 cooljs.me, 1
 coolpickz.com, 1
 coolprylar.se, 1
 coolrc.me, 1
 coolviewthermostat.com, 1
+coolvox.com, 1
 coopens.com, 1
 coore.jp, 1
 coorpacademy.com, 1
 copdfoundation.org, 1
 copperhead.co, 1
 copperheados.com, 1
 coptic-treasures.com, 1
 coptkm.cz, 1
@@ -8178,17 +8175,16 @@ cryptoparty.tv, 1
 cryptopartynewcastle.org, 1
 cryptopartyutah.org, 1
 cryptophobia.nl, 1
 cryptorival.com, 1
 cryptoseb.pw, 1
 cryptoshot.pw, 1
 cryptract.co, 1
 crystalchandelierservices.com, 1
-crystalmachine.net, 0
 crystone.me, 1
 cryz.ru, 1
 cs-colorscreed-betongulve.dk, 1
 cs2016.ch, 1
 csabg.org, 1
 csacongress.org, 1
 csbs.fr, 1
 cscau.com, 1
@@ -8245,18 +8241,18 @@ ctyi.me, 1
 cub-bouncingcastles.co.uk, 1
 cube-cloud.com, 1
 cube.de, 1
 cubecart-demo.co.uk, 1
 cubecart-hosting.co.uk, 1
 cubecraft.net, 1
 cubecraftstore.com, 1
 cubecraftstore.net, 1
+cubekrowd.net, 1
 cubela.tech, 1
-cubia.de, 1
 cubia3.com, 1
 cubia4.com, 1
 cubile.xyz, 1
 cublick.com, 1
 cubos.io, 0
 cubostecnologia.com, 0
 cubostecnologia.com.br, 0
 cubua.com, 1
@@ -8366,25 +8362,27 @@ cw.center, 1
 cwagner.me, 1
 cwbrtrust.ca, 1
 cwmart.in, 1
 cwningen.cymru, 0
 cwrcoding.com, 1
 cy.technology, 1
 cybbh.space, 1
 cyber-computer.club, 1
+cyber-konzept.de, 1
 cyber-perikarp.eu, 1
 cyber.cafe, 1
 cyberatlantis.com, 1
 cybercareers.gov, 1
 cybercloud.cc, 1
 cybercrew.cc, 1
 cybercrime-forschung.de, 1
 cyberdos.de, 1
 cyberduck.io, 1
+cyberfrancais.ro, 1
 cybergrx.com, 1
 cyberguerrilla.info, 1
 cyberguerrilla.org, 1
 cyberianhusky.com, 1
 cyberkov.com, 1
 cyberlightapp.com, 1
 cybermeldpunt.nl, 1
 cyberoptic.de, 1
@@ -8750,17 +8748,17 @@ datorb.com, 1
 datovyaudit.cz, 1
 datsound.ru, 1
 datsumou-q.com, 1
 datumou-osusume.com, 1
 datumou-recipe.com, 1
 daubecity.de, 1
 daubehosting.de, 1
 dave-pearce.com, 1
-daveaglick.com, 1
+daveaglick.com, 0
 davecardwell.com, 1
 davelynes.com, 1
 daveoc64.co.uk, 1
 davepage.me.uk, 1
 davepearce.com, 1
 daverandom.com, 1
 davescomputertips.com, 1
 davesinclair.com.au, 1
@@ -8839,16 +8837,17 @@ dbpmedia.se, 1
 dbq.com, 1
 dbrgn.ch, 1
 dbtsai.com, 1
 dc-occasies.be, 1
 dc562.org, 1
 dc585.info, 1
 dcards.in.th, 1
 dcautomacao.com.br, 1
+dcc.cat, 1
 dcc.moe, 1
 dcepler.net, 1
 dchatelain.ch, 1
 dchest.org, 1
 dckd.nl, 1
 dcl.re, 1
 dclaisse.fr, 1
 dcmt.co, 1
@@ -9276,17 +9275,16 @@ devpsy.info, 1
 devrandom.net, 1
 devstaff.gr, 1
 devtestfan1.gov, 1
 devyn.ca, 1
 devzero.io, 1
 dewaard.de, 1
 dewalch.net, 1
 dewapress.com, 1
-dewebwerf.nl, 1
 dewinter.com, 1
 dexalo.de, 1
 dezeregio.nl, 1
 dezet-ev.de, 1
 dezintranet.com, 1
 dezmembrariromania.ro, 1
 dezshop24.de, 1
 df1paw.de, 1
@@ -9297,16 +9295,17 @@ dfixit.com, 1
 dfl.mn, 1
 dflcares.com, 1
 dfmn.berlin, 1
 dfranke.com, 1
 dgblaw.com.au, 1
 dgbouncycastlehire.com, 1
 dgby.org, 1
 dgeex.eu, 1
+dggm.ru, 1
 dggwp.de, 1
 dgitup.com, 1
 dgportals.co.uk, 1
 dgpot.com, 1
 dgt-portal.de, 1
 dgx.io, 1
 dharamkot.com, 1
 dhautefeuille.eu, 1
@@ -9919,17 +9918,16 @@ dossplumbing.co.za, 1
 dostavkakurierom.ru, 1
 dosvientoselectrical.com, 1
 dosyauzantisi.com, 1
 dot.ro, 1
 dotacni-parazit.cz, 1
 dotb.dn.ua, 0
 dotbigbang.com, 1
 dotbox.org, 1
-dotbrick.co.th, 1
 dotconnor.com, 1
 dotgov.gov, 1
 dothebangthingsalon.com, 1
 dothydesign.com, 1
 dotjs.party, 1
 dotkniseandroida.cz, 1
 dotkod.com, 1
 dotkod.pl, 1
@@ -10264,17 +10262,16 @@ dusmomente.com, 1
 dusnan.com, 1
 dustplanet.de, 1
 dustri.org, 1
 dustycloth.com, 1
 dustygroove.com, 1
 dustyspokesbnb.ca, 1
 dutch.desi, 1
 dutch1.nl, 1
-dutchessuganda.com, 1
 dutchrank.nl, 1
 dutchwanderers.nl, 1
 dutchweballiance.nl, 1
 dutyfreeonboard.com, 1
 dvbris.co.uk, 1
 dvbris.com, 1
 dvdland.com.au, 1
 dvhosting.be, 1
@@ -10492,17 +10489,16 @@ echoactive.com, 1
 echoanalytics.com, 1
 echodio.com, 1
 echofoxtrot.co, 1
 echomanchester.net, 1
 echopaper.com, 1
 echosim.io, 1
 echosixmonkey.com, 1
 echosystem.fr, 1
-echoteam.gq, 1
 echoteen.com, 1
 echoworld.ch, 1
 ecirtam.net, 1
 eckel.co, 1
 eclipse.ws, 1
 ecnetworker.com, 1
 eco-derattizzazione.it, 1
 eco-work.it, 1
@@ -10600,17 +10596,16 @@ educaid.be, 1
 educationevolving.org, 1
 educationfutures.com, 1
 educationunlimited.com, 1
 educator-one.com, 1
 educators.co.nz, 1
 educatoys.com.br, 1
 educatweb.de, 1
 eductf.org, 1
-edudrugs.com, 1
 eduid.se, 1
 eduif.nl, 0
 edumundo.nl, 1
 eduroam.no, 1
 edusanjal.com, 1
 edusantorini.com, 1
 eduvpn.no, 1
 edv-bv.de, 1
@@ -10871,17 +10866,17 @@ elinvention.ovh, 1
 eliolita.com, 1
 eliott.be, 0
 elisa.ee, 0
 elisabeth-kostecki.de, 1
 elisabeth-strunz.de, 1
 elisabethkostecki.de, 1
 elisabethrene.com, 1
 elisechristie.com, 1
-elistor6100.xyz, 0
+elistor6100.xyz, 1
 elite-box.com, 1
 elite-box.org, 1
 elite-porno.ru, 1
 elite12.de, 1
 elitebouncingfun.com, 1
 elitegameservers.net, 1
 elitehosting.de, 1
 elitesensual.com.br, 1
@@ -11459,17 +11454,16 @@ esbfun.net, 1
 esbgood.com, 1
 esbin.net, 1
 esbjon.com, 1
 esbjon.net, 1
 esbm4.net, 1
 esbm5.net, 1
 esc.chat, 1
 escael.org, 1
-escapees.com, 1
 escapeplaza.de, 1
 escapetalk.nl, 1
 escargotbistro.com, 1
 escavador.com, 1
 esclear.de, 1
 escontact.ch, 1
 escort-byuro.net, 1
 escort-fashion.com, 1
@@ -11820,16 +11814,17 @@ exchangeworks.co, 1
 exchaser.com, 1
 exclusivebouncycastles.co.uk, 1
 exdamo.de, 0
 exe-boss.tech, 1
 exebouncycastles.co.uk, 1
 exehack.net, 1
 exeintel.com, 1
 exekutori.com, 1
+exembit.com, 1
 exemples-de-stands.com, 1
 exeria.de, 1
 exgaywatch.com, 1
 exgen.io, 1
 exhalespa.com, 1
 exhibityour.com, 1
 exiahost.com, 1
 exit9wineandliquor.com, 1
@@ -11896,17 +11891,17 @@ extensia.it, 1
 extensiblewebmanifesto.org, 1
 extensiblewebreportcard.org, 1
 extensiblewebsummit.org, 1
 extensiontree.com, 1
 exteriorservices.io, 1
 extradesktops.com, 0
 extranetpuc.com.br, 1
 extrapagetab.com, 1
-extratorrent.cool, 1
+extratorrent.cool, 0
 extratorrent.fyi, 1
 extratorrent.red, 1
 extratorrent.world, 1
 extreme-gaming.de, 1
 extreme-gaming.us, 1
 extreme-players.com, 1
 extreme-players.de, 1
 extreme.co.th, 1
@@ -11976,17 +11971,16 @@ fabriziorocca.it, 1
 fabrysociety.org, 1
 fabse.net, 1
 fabulouslyyouthfulskin.com, 1
 fabulouslyyouthfulskineyeserum.com, 1
 facanabota.com, 1
 facanabota.com.br, 1
 facciadastile.it, 1
 facealacrise.fr, 1
-facebattle.com, 1
 facebook-atom.appspot.com, 1
 facebook.ax, 1
 facebook.com, 0
 facebydrh.com, 1
 facebylouise.co.uk, 1
 facekungfu.com, 1
 facepalmsecurity.com, 1
 facepunch.org, 1
@@ -12054,16 +12048,17 @@ falegname-roma.it, 1
 falkus.net, 1
 falldennismarketing.com, 1
 fallenangeldrinks.co.uk, 1
 fallenangeldrinks.com, 1
 fallenangeldrinks.eu, 1
 fallenangelspirits.co.uk, 1
 fallenangelspirits.com, 1
 fallenspirits.co.uk, 1
+fallofthecitadel.com, 1
 falsum.net, 1
 fam-kreibich.de, 1
 fam-stemmer.de, 0
 fam-weyer.de, 1
 famcloud.de, 1
 famdouma.nl, 1
 fameng.nl, 1
 famep.gov, 1
@@ -12254,17 +12249,16 @@ feedhq.org, 1
 feedkovacs.hu, 1
 feedough.com, 1
 feedstringer.com, 1
 feegg.com.br, 1
 feel.aero, 1
 feelgood-workouts.de, 1
 feeltennis.net, 1
 feen.us, 1
-feeriedesign-event.com, 1
 feetpa.ws, 1
 fefelovalex.ru, 1
 fegli.gov, 1
 fehngarten.de, 1
 fehnladen.de, 1
 feigling.net, 1
 feilen.de, 1
 feirlane.org, 0
@@ -12741,16 +12735,17 @@ flyss.net, 1
 flyssh.net, 1
 flyt.online, 1
 flytoadventures.com, 1
 fm-cdn.de, 1
 fm.ie, 1
 fmapplication.com, 1
 fmarchal.fr, 1
 fmdance.cl, 1
+fmi.gov, 1
 fminsight.net, 1
 fmodoux.biz, 1
 fmovies.fyi, 1
 fmovies.life, 1
 fmussatmd.com, 1
 fnb-griffinonline.com, 1
 fnbnokomis.com, 1
 fndout.com, 1
@@ -12774,16 +12769,17 @@ foiaonline.gov, 1
 fojing.com, 1
 fokan.be, 1
 fokep.no, 1
 fokkusu.fi, 1
 fol.tf, 1
 foljeton.dk, 1
 folkadelic.de, 1
 folkfests.org, 1
+follandviolins.com, 1
 followerrocket.com, 1
 followersya.com, 1
 followthatpage.com, 1
 followthedog.co.uk, 1
 foluomeng.net, 1
 folv.es, 1
 fomopop.com, 1
 fondanastasia.ru, 1
@@ -12873,16 +12869,17 @@ forsakringsarkivet.se, 1
 forschbach-janssen.de, 1
 forsec.nl, 1
 forstbetrieb-hennecke.de, 1
 forstprodukte.de, 1
 forsyththeatre.com, 1
 forteggz.nl, 1
 fortesanshop.it, 1
 fortnine.ca, 1
+fortran.io, 1
 fortress.no, 1
 fortress.sk, 1
 fortricks.in, 1
 fortuna-loessnitz.de, 1
 fortuna-s.com, 1
 fortworth.ch, 1
 forty-two.nl, 1
 forty8creates.com, 1
@@ -13186,16 +13183,17 @@ frolov.net, 1
 frolova.org, 1
 fromix.de, 1
 fromlemaytoz.com, 1
 fromscratch.rocks, 1
 fromthesoutherncross.com, 1
 fronteers.nl, 0
 frontline.cloud, 1
 frontline6.com, 1
+fropky.com, 1
 frosthall.com, 1
 frostprotection.co.uk, 1
 frostwarning.com, 1
 frosty-gaming.xyz, 1
 frothy.coffee, 1
 froufe.com, 1
 frowin-stemmer.de, 0
 frozen-geek.net, 1
@@ -13406,16 +13404,17 @@ fysesbjerg.dk, 1
 fysio123.nl, 1
 fysiotherapieholtenbroek.nl, 1
 fysiotherapierossum.nl, 1
 fysiovdberg.nl, 1
 fysuite.com, 1
 fzbrweb.cz, 1
 fzx750.ru, 1
 g-m-w.eu, 1
+g-marketing.ro, 1
 g-o.pl, 1
 g-rom.net, 1
 g01.in.ua, 1
 g1.ie, 1
 g10e.ch, 1
 g1jeu.com, 1
 g2links.com, 1
 g2pla.net, 1
@@ -13691,17 +13690,16 @@ geh.li, 1
 gehaowu.com, 1
 gehopft.de, 1
 gehreslaw.com, 1
 gehrke.in, 1
 gehrke.nrw, 1
 gehsicht.de, 1
 geigr.de, 1
 geiser-family.ch, 1
-geiser.io, 1
 gelb-computer.de, 1
 geld-im-blick.de, 1
 geld24.nl, 1
 geldimblick.de, 1
 geldteveel.eu, 1
 geleenbeekdal.nl, 1
 geleia-real.com, 1
 gelis.ch, 1
@@ -13726,17 +13724,16 @@ geneau.net, 1
 genehightower.com, 1
 genehome.com.au, 1
 genemesservwparts.com, 1
 general-anaesthesia.com, 1
 general-anaesthetics.com, 1
 general-anesthesia.com, 1
 generali-worldwide.com, 1
 generalinsuranceservices.com, 1
-generalpants.com.au, 1
 generationgoat.com, 1
 generationnext.pl, 1
 generationsweldom.com, 1
 generator.creditcard, 1
 generic.cx, 1
 genesiseureka.com, 1
 genesismachina.ca, 1
 genesistrading.com, 1
@@ -13982,16 +13979,17 @@ gileadpac.com, 1
 giliamor.com, 1
 gillesdesnoyers.com, 1
 gillesmorelle.com, 1
 gillmanandsoame.co.uk, 1
 gillyscastles.co.uk, 1
 gilmoreid.com.au, 1
 gilnet.be, 1
 gina-architektur.design, 1
+ginie.de, 1
 ginionusedcars.be, 1
 ginja.co.th, 1
 ginkel.com, 1
 ginnegappen.nl, 1
 ginniemae.gov, 1
 ginza-luce.net, 1
 ginzadelunch.jp, 1
 giochi-online.ws, 1
@@ -14240,17 +14238,16 @@ gonkar.com, 1
 gonx.dk, 1
 goo.gl, 1
 good-tips.pro, 1
 gooday.life, 1
 gooddomainna.me, 1
 goodeats.nyc, 1
 goodenough.nz, 0
 goodfeels.net, 1
-goods-memo.net, 1
 goodsex4all.com.br, 1
 goodvibesblog.com, 1
 goodyearsotn.co.uk, 1
 google, 1
 google-analytics.com, 1
 google.ax, 1
 googleandroid.cz, 1
 googlemail.com, 0
@@ -14632,16 +14629,17 @@ guid2steamid.pw, 1
 guide-peche-cantal.com, 1
 guidechecking.com, 1
 guidedselling.net, 1
 guideline.gov, 1
 guidelines.gov, 1
 guideo.ch, 1
 guides-et-admin.com, 1
 guides-peche64.com, 1
+guidetoiceland.is, 0
 guildbase.de, 1
 guildgearscore.cf, 0
 guildofmusicsupervisors.co.uk, 1
 guillaume-briand.fr, 1
 guillaumecote.me, 1
 guillaumeperrin.io, 1
 guillemaud.me, 0
 guiltypleasuresroleplaying.com, 1
@@ -14652,17 +14650,16 @@ guishem.com, 1
 gulchuk.com, 1
 gulenbase.no, 1
 gulfstream.ru, 1
 gulleyperformancecenter.com, 1
 gulshankumar.net, 1
 gumballs.com, 1
 gume4you.com, 1
 gumi.ca, 1
-gummibande.noip.me, 1
 gunhunter.com, 1
 guniram.com, 1
 gunwatch.co.uk, 1
 guochang.xyz, 1
 guoliang.me, 1
 guozeyu.com, 1
 gupfen.ch, 1
 guphi.net, 0
@@ -15685,32 +15682,30 @@ hooowl.com, 1
 hoopertechnicalsolutions.com, 1
 hooray.beer, 1
 hootworld.net, 1
 hoowhen.cn, 1
 hopconseils.ch, 1
 hopconseils.com, 1
 hope-line-earth.jp, 1
 hopesb.org, 1
-hopewellproperties.co.uk, 1
 hopglass.eu, 1
 hopglass.net, 1
 hoplongtech.com, 1
 hopps.me, 1
 hoppyx.com, 1
 horace.li, 1
 horaceli.com, 1
 horackova.info, 1
 hord.ca, 1
 horecaapparatuurkobezuijen.nl, 1
 horeizai.net, 1
 horisonttimedia.fi, 1
 horizonhomes-samui.com, 1
 horizonlawncare.tk, 1
-horizonmoto.fr, 1
 horkel.cf, 1
 hornyforhanzo.com, 1
 horodance.dk, 1
 horrell.ca, 1
 horrendous-servers.com, 1
 horror-forum.de, 1
 horsehunter.co.uk, 1
 horstmanshof.eu, 1
@@ -16498,17 +16493,16 @@ impulsionsa.com, 1
 impyus.com, 1
 imququ.com, 1
 imreh.net, 1
 imrejonk.nl, 1
 imrunner.com, 1
 imrunner.ru, 1
 ims-sargans.ch, 1
 imscompany.com, 1
-imy.life, 1
 imydl.com, 1
 imydl.tech, 1
 imyvm.com, 1
 imyz.tw, 1
 in-depthoutdoors.com, 1
 in-flames.com, 1
 in.search.yahoo.com, 0
 in.xero.com, 0
@@ -16646,17 +16640,16 @@ ing89.cc, 1
 ing89.com, 1
 ingalabs.hu, 1
 ingalls.run, 1
 ingatlanneked.hu, 1
 ingber.com, 1
 inge-r.nl, 1
 ingeeibach.de, 1
 ingenium.si, 1
-ingenius.ws, 1
 ingerhy.com, 1
 ingi.ga, 1
 ingjobs.ch, 1
 inglesnarede.com.br, 1
 ingo-schlueter.de, 1
 ingoschlueter.de, 1
 ingresscode.cn, 1
 inhaltsangabe.de, 1
@@ -17642,18 +17635,18 @@ jerseybikehire.co.uk, 1
 jerseyjumpingbeans.co.uk, 1
 jerseylvi2013.org, 1
 jesse3.com, 1
 jesseerbach.com, 1
 jessekaufman.com, 1
 jessesjumpingcastles.co.uk, 1
 jessevictors.com, 1
 jessgranger.com, 1
+jessicabenedictus.nl, 0
 jesters-court.net, 1
-jesuisadmin.fr, 1
 jet-stream.fr, 1
 jetapi.org, 1
 jetbbs.com, 1
 jetbrains.pw, 1
 jetflex.de, 1
 jetkittens.co.uk, 1
 jetmirshatri.com, 1
 jetsetboyz.net, 1
@@ -20072,17 +20065,16 @@ lifanov.com, 1
 lifebetweenlives.com.au, 1
 lifecism.com, 1
 lifecoach.tw, 0
 lifeinhex.com, 1
 lifeinsurancepro.org, 1
 lifeinsurances.pro, 1
 lifeinsurances24.com, 1
 lifekiss.ru, 1
-lifemarque.co.uk, 1
 lifematenutrition.com, 1
 lifemstyle.com, 1
 lifenexto.com, 1
 lifeqa.net, 1
 lifequotes-uk.co.uk, 1
 lifesafety.com.br, 1
 lifescience-japan.com, 1
 lifestylefinancial.ca, 1
@@ -20425,16 +20417,17 @@ lode.li, 1
 loeildansledoigt.fr, 1
 loenshotel.de, 1
 loew.de, 1
 loforo.com, 1
 lofttravel.com, 1
 log.my, 0
 logaldeveloper.com, 1
 loganmarchione.com, 1
+loganparkneighborhood.org, 1
 logbook.ch, 1
 logbot.info, 1
 logcat.info, 1
 logement-saisonnier.com, 1
 logement.com, 1
 logentries.com, 0
 logexplorer.net, 1
 logfile.at, 1
@@ -20734,17 +20727,16 @@ lukasschauer.de, 1
 lukasschick.de, 0
 lukasunger.cz, 1
 lukasunger.net, 1
 lukaszorn.de, 1
 lukasztkacz.com, 1
 lukatz.de, 1
 luke.ch, 1
 lukeistschuld.de, 1
-lukeng.net, 1
 lukesbouncycastlehire.com, 1
 lukestebbing.com, 1
 lukmanulhakim.id, 1
 lukull-pizza.de, 1
 lumer.tech, 1
 lumi.pw, 1
 lumiere.com, 1
 luminancy.com, 1
@@ -20796,16 +20788,17 @@ luxonetwork.com, 1
 luxsci.com, 1
 luxurynsight.net, 1
 luxuryweddingsindonesia.com, 1
 luxusnivoucher.cz, 1
 luxusnyvoucher.sk, 1
 luxvacuos.net, 1
 luxwatch.com, 1
 luzat.com, 1
+luzfaltex.com, 1
 lv.search.yahoo.com, 0
 lv0.it, 1
 lv5.top, 1
 lvmoo.com, 1
 lvrsystems.com, 1
 lwl-foej-bewerbung.de, 0
 lwl.moe, 1
 lwl12.com, 1
@@ -21737,16 +21730,17 @@ medicare-providers.net, 1
 medicarecoveragefinder.com, 1
 medicareinfo.org, 1
 medicinesfast.com, 0
 medicinia.com.br, 1
 medicinskavranje.edu.rs, 1
 medicocompetente.it, 1
 medicoresponde.com.br, 1
 medienweite.de, 1
+medifab.online, 1
 medifi.com, 1
 medigap-quote.net, 1
 medinside.ch, 1
 medinside.li, 1
 medinsider.ch, 1
 medinsider.li, 1
 medireport.fr, 1
 mediter-simplement.com, 1
@@ -21764,16 +21758,17 @@ medtankers.management, 1
 medtehnika.ua, 1
 medusa.wtf, 1
 meduza.io, 1
 medvet.com.es, 1
 medwaybouncycastlehire.co.uk, 1
 medy-me.com, 1
 medyotan.ga, 1
 meedoenhartvanwestbrabant.nl, 1
+meedoennoordkop.nl, 0
 meehle.com, 1
 meeko.cc, 1
 meerutcake.com, 1
 meet.google.com, 1
 meetbot.fedoraproject.org, 1
 meetingapplication.com, 1
 meetingfriends.ch, 1
 meetings2.com, 1
@@ -21895,16 +21890,17 @@ mendozagenevieve.com, 1
 mendy.jp, 1
 menielias.com, 1
 menkyo-blog.com, 1
 mennace.com, 1
 menntagatt.is, 1
 menole.com, 1
 menole.de, 1
 menole.net, 1
+menotag.com, 1
 mensagemaniversario.com.br, 1
 mensagemdaluz.com, 1
 mensagensaniversario.com.br, 1
 mensagensdeconforto.com.br, 1
 mensagensperfeitas.com.br, 1
 mensch-peter.me, 1
 mentalhealth.gov, 1
 mentalhealthmn.org, 1
@@ -22290,16 +22286,17 @@ minnesotamathcorps.org, 1
 minnesotareadingcorps.org, 1
 minnit.chat, 1
 minobar.com, 1
 minor.news, 1
 minorshadows.net, 1
 minpingvin.dk, 1
 minschuns.ch, 1
 mintclass.com, 1
+mintea-noua.ro, 1
 minto.cc, 1
 mintosherbs.com, 1
 mintrak2.com, 1
 minu.link, 1
 minube.co.cr, 1
 minux.info, 1
 mipapo.de, 1
 mipla.ch, 1
@@ -22891,17 +22888,16 @@ msp66.de, 0
 mspnocsupport.com, 1
 mspsocial.net, 1
 msquadrat.de, 1
 mssys.de, 1
 mstdn.blue, 1
 mstdn.club, 1
 mstdn.fr, 1
 mstdn.io, 1
-mstdn.nl, 1
 mstdn.onl, 0
 mstiles92.com, 1
 msuess.me, 1
 msuna.net, 1
 msv-limpezas.pt, 1
 msx.org, 1
 msz-fotografie.de, 1
 mszavodumiru.cz, 1
@@ -24298,16 +24294,17 @@ northconsulting.fr, 1
 northcountykiaparts.com, 1
 northdevonbouncycastles.co.uk, 1
 northeastcdc.org, 1
 northeastrodeo.co.uk, 1
 northern-lakes.com, 1
 northernhamsterclub.com, 1
 northernmuscle.ca, 1
 northernselfstorage.co.za, 1
+northfieldyarn.com, 1
 northokanaganbookkeeping.com, 1
 northpole.dance, 1
 northridgeelectrical.com, 1
 northumbriagames.co.uk, 1
 northwoodsfish.com, 1
 norys-escape.de, 1
 nos-medias.fr, 1
 nos-oignons.net, 1
@@ -25265,17 +25262,16 @@ ozonytron.eu, 1
 ozvolvo.org, 1
 p-pc.de, 1
 p-s-b.com, 1
 p-t.io, 1
 p.ki, 1
 p1984.nl, 0
 p1ratrulezzz.me, 1
 p22.co, 1
-p3ter.fr, 1
 p4chivtac.com, 1
 p5r.uk, 1
 pa-w.de, 1
 pa.search.yahoo.com, 0
 paarberatung-hn.de, 1
 paass.net, 1
 paazmaya.fi, 1
 pablo.im, 1
@@ -25530,16 +25526,17 @@ partybounceplay.co.uk, 1
 partycentrumdebinnenhof.nl, 1
 partycentrumopenhuis.nl, 1
 partyhireisleofwight.co.uk, 1
 partyhireliverpool.co.uk, 1
 partypearl.de, 1
 partyrocksbounce.co.uk, 1
 partyschnaps.com, 1
 partyspaces.co.uk, 1
+partyspecialists.com, 1
 partytime-uk.co.uk, 1
 partytimeltd.ie, 1
 partytownireland.co.uk, 1
 partytownmarquees.co.uk, 1
 partyvan.io, 1
 partyzone.ie, 1
 parvaneh.fr, 1
 pasadenapooch.org, 1
@@ -25848,17 +25845,16 @@ penrithapartments.com.au, 1
 pens.com, 1
 pensacolawinterfest.org, 1
 pensador.com, 1
 pensador.info, 1
 penser-electronique.com, 1
 pensioenfonds-ey.nl, 1
 pension-veldzigt.nl, 1
 pension-waldesruh.de, 1
-pensionpilot.ca, 1
 pensiunealido.ro, 1
 pentandra.com, 1
 pentest.blog, 1
 pentest.nl, 1
 pentesterlab.com, 1
 penticton.photography, 1
 pentofun.ch, 1
 penz.media, 1
@@ -26339,16 +26335,17 @@ planbox.info, 1
 planer.me, 1
 planet-work.com, 1
 planetanim.fr, 1
 planetasuboficial.com.br, 1
 planetau2.com, 1
 planetbeauty.com, 1
 planetbreath.ch, 1
 planete-cocoon.com, 0
+planete-lira.fr, 1
 planete-secu.com, 1
 planeteroliste.com, 1
 planeteroliste.fr, 1
 planetknauer.net, 1
 planetromeo.com, 1
 planetromeofoundation.org, 1
 planformation.com, 1
 planify.io, 1
@@ -26453,17 +26450,16 @@ plural.cafe, 1
 plus-5.com, 1
 plus.google.com, 1
 plus.sandbox.google.com, 1
 plus1s.tk, 1
 plushev.com, 1
 pluslink.co.jp, 1
 plussizereviews.com, 1
 plusstreamfeed.appspot.com, 1
-plustech.id, 1
 pluta.net, 1
 pluto.life, 1
 plutokorea.com, 1
 plutopia.ch, 1
 plymouthbouncycastles.co.uk, 1
 plymouthglassgallery.com, 1
 plzdontpwn.me, 1
 plzenskybarcamp.cz, 1
@@ -27227,16 +27223,17 @@ psychicsource.com, 1
 psychintervention.com, 1
 psycho-lobby.com, 1
 psycho.space, 1
 psychoactive.com, 1
 psychoco.net, 1
 psychotherapie-kp.de, 1
 psydix.org, 1
 psyk.yt, 1
+psylab.cc, 1
 psylab.re, 1
 psylab.vip, 1
 psynapse.net.au, 1
 psytrance-pro.com, 1
 pt-server.de, 1
 ptal.eu, 1
 ptbi.org.pl, 1
 ptbx.co, 1
@@ -27683,16 +27680,17 @@ randc.org, 1
 random-samplings.org, 1
 randomadversary.com, 1
 randombit.eu, 0
 randomcode.org, 1
 randomdysfunctions.com, 1
 randomkoalafacts.com, 1
 randomprecision.co.uk, 1
 randomquotesapp.com, 1
+randy.su, 1
 rangde.org, 1
 rangsmo.se, 1
 rank-net.de, 1
 ranking-deli.jp, 1
 ranos.org, 1
 ranson.com.au, 1
 rantanda.com, 1
 ranyeh.co, 1
@@ -28716,16 +28714,17 @@ royalcitytaxi.ca, 1
 royalcitytaxi.com, 1
 royalmarinesassociation.org.uk, 1
 royalnissanparts.com, 1
 royalpalacenogent.fr, 1
 royalrangers.fi, 1
 royalty-market.com, 1
 royalvisiongroup.com, 1
 royzez.com, 1
+rozalisbengal.ro, 1
 rozalynne-dawn.ga, 1
 rozhodce.cz, 1
 rpadovani.com, 1
 rpasafrica.com, 1
 rpgmaker.es, 1
 rpherbig.com, 1
 rphl.net, 1
 rpine.net, 1
@@ -28823,17 +28822,16 @@ rugby.video, 1
 rugk.dedyn.io, 1
 ruh-veit.de, 1
 ruhr3.de, 1
 ruhrmobil-e.de, 1
 ruhrnalist.de, 1
 ruht.ro, 1
 ruigomes.me, 1
 ruiming.me, 1
-ruja.dk, 1
 ruk.ca, 1
 rukhaiyar.com, 1
 rullzer.com, 1
 rulu.co, 1
 rulu.tv, 1
 rulutv.com, 1
 rumlager.de, 1
 rummel-platz.de, 1
@@ -29173,17 +29171,16 @@ santmark.com, 1
 santmark.eu, 1
 santmark.fi, 1
 santmark.info, 1
 santmark.net, 1
 santmark.org, 1
 santodomingocg.org, 1
 santojuken.co.jp, 1
 sanvitolocapobus.com, 1
-saoneth.pl, 1
 saorsat.com, 1
 saorsat.ie, 1
 saorview.com, 1
 saorviewconnect.ie, 1
 saorviewconnected.ie, 1
 sapac.es, 1
 sapereaude.com.pl, 1
 sapien-ci.com, 1
@@ -29228,17 +29225,16 @@ sasyabapi.com, 1
 sat4all.com, 1
 sat7a-riyadh.com, 1
 satai.dk, 1
 saterdalen.net, 1
 satimagingcorp.com, 1
 satinn.pl, 1
 sativatunja.com, 1
 satmd.de, 1
-satrent.com, 1
 saturn.pl, 1
 saudavel.com.vc, 1
 saudeealimentos.com, 1
 saudeintimadamulher.com.br, 1
 saudenoclique.com.br, 1
 sauenytt.no, 1
 sauer-systems.net, 1
 sauerbrey.eu, 1
@@ -29467,22 +29463,20 @@ scienceminnesota.com, 1
 sciencemonster.co.uk, 1
 sciencesolutions.eu, 1
 sciencex.com, 1
 scifi.fyi, 1
 scijinks.gov, 1
 scimage.com, 1
 scintilla.nl, 1
 scintillating.stream, 1
-scionasset.com, 1
 scis.com.ua, 1
 scistarter.com, 1
 scitopia.me, 1
 scitopia.net, 1
-sckc.stream, 1
 scm-2017.org, 1
 scoolcode.com, 1
 scoop6.co.uk, 1
 scootaloo.co.uk, 1
 scooterservis.com, 1
 scootfleet.com, 1
 scorobudem.ru, 1
 scorocode.ru, 1
@@ -29540,16 +29534,17 @@ sculpture.support, 1
 scuolaguidalame.ch, 1
 scw.com, 1
 scw.nz, 1
 scwilliams.co.uk, 1
 scwilliams.uk, 1
 sd.af, 1
 sdcardrecovery.de, 1
 sdg-tracker.org, 1
+sdho.org, 1
 sdns.fr, 1
 sdsi.us, 1
 sdsmanagement.me, 1
 sdsmt.engineering, 1
 sdvigpress.org, 1
 sdvx.net, 1
 sdxcentral.com, 1
 se.search.yahoo.com, 0
@@ -30710,17 +30705,16 @@ slapen17.nl, 1
 slaps.be, 1
 slash32.co.uk, 1
 slash64.co.uk, 1
 slash64.com, 1
 slash64.uk, 1
 slashbits.no, 1
 slashcrypto.org, 1
 slatemc.fun, 1
-slatop.org, 0
 slaughter.com, 1
 slaughterhouse.fr, 1
 slavasveta.info, 1
 slaws.io, 1
 sleeplessbeastie.eu, 1
 sleepmap.de, 1
 sleepstar.co.uk, 1
 sleepstar.de, 1
@@ -30775,17 +30769,16 @@ slytech.ch, 1
 sm-supplements.gr, 1
 sm.ms, 1
 sm2016.ch, 1
 sma-gift.com, 1
 smackhappy.com, 1
 smadav.ml, 1
 smallchat.nl, 1
 smalldata.tech, 1
-smalldogbreeds.net, 1
 smalle-voet.de, 1
 smallhadroncollider.com, 1
 smallpath.me, 1
 smallplanet.ch, 1
 smalltalkconsulting.com, 1
 smaltimento-rifiuti.org, 1
 smaltimento.caserta.it, 1
 smaltimento.napoli.it, 1
@@ -31214,17 +31207,16 @@ soybase.org, 1
 sozai-good.com, 1
 sozialy.com, 1
 sozon.ca, 1
 sp-sephiroth.jp, 1
 sp.com.pl, 1
 sp.rw, 1
 space-it.de, 1
 spacebaseapp.com, 1
-spacecafe.org, 1
 spacedirectory.org, 1
 spacedots.net, 1
 spacehighway.ms, 1
 spacehost.de, 0
 spacelabs.io, 1
 spacepage.be, 1
 spaceweather.live, 1
 spaceweatherlive.com, 1
@@ -31542,16 +31534,17 @@ stageirites.fr, 1
 stageirites.org, 1
 stagingjobshq.com, 1
 stagstickets.co.uk, 1
 stahlfors.com, 1
 stainedglass.net.au, 1
 stair.ch, 1
 stairfallgames.com, 1
 stairlin.com, 1
+staklim-malang.info, 1
 staktrace.com, 1
 stalder.work, 1
 stalker-shop.com, 1
 stalkr.net, 1
 stalkthe.net, 1
 stall-zur-linde.de, 1
 stamboommuller.nl, 1
 stamboomvanderwal.nl, 1
@@ -32064,16 +32057,17 @@ suluvir.com, 1
 sumguy.com, 1
 summa-prefis.com, 1
 summa.eu, 0
 summer.ga, 1
 summercampthailand.com, 1
 summershomes.com, 1
 sumthing.com, 1
 sun-leo.co.jp, 1
+sun-wellness-online.com.vn, 1
 sunboxstore.jp, 1
 sunbritetv.com, 1
 sunchasercats.com, 1
 sundanceusa.com, 1
 sundayfundayjapan.com, 1
 suneilpatel.com, 1
 sunfeathers.net, 1
 sunfireshop.com.br, 1
@@ -32404,16 +32398,17 @@ t2i.nl, 1
 t3rror.net, 1
 t47.io, 1
 t7e.de, 0
 ta-65.com, 1
 ta-sports.net, 1
 ta65.com, 1
 taabe.net, 1
 taartbesteld.nl, 1
+taartenfeesies.nl, 1
 tab.watch, 1
 tabarnak.ga, 1
 tabernadovinho.com.br, 1
 tabino.top, 1
 tabithawebb.co.uk, 1
 tabla-periodica.com, 1
 tabledusud.be, 1
 tabledusud.nl, 1
@@ -33288,16 +33283,17 @@ theswissbay.ch, 1
 thetapirsmouth.com, 1
 thetechnical.me, 1
 thetenscrolls.com, 1
 thetomharling.com, 1
 thetrendspotter.net, 1
 thetruthhurvitz.com, 1
 thetuxkeeper.de, 0
 theunitedstates.io, 1
+theuucc.org, 1
 thevacweb.com, 1
 thevalentineconstitution.com, 1
 thevgg.com, 0
 thevoid.one, 1
 thewarrencenter.org, 1
 thewebdexter.com, 1
 thewebflash.com, 1
 thewebsitedoctors.co.uk, 1
@@ -33613,16 +33609,17 @@ tkanemoto.com, 1
 tkat.ch, 1
 tkeycoin.com, 1
 tkgpm.com, 1
 tkn.me, 1
 tkn.tokyo, 1
 tkts.cl, 1
 tkusano.jp, 1
 tkw01536.de, 1
+tlach.cz, 1
 tlca.org, 1
 tlcnet.info, 1
 tlehseasyads.com, 1
 tleng.de, 1
 tlo.xyz, 1
 tloxygen.com, 1
 tls-proxy.de, 1
 tls.builders, 1
@@ -34298,17 +34295,16 @@ trustfield.ch, 1
 trustserv.de, 1
 truthmessages.pw, 1
 trw-reseller.com, 1
 trybabyschoice.com, 1
 trybooking.com, 1
 tryfabulousdiet.com, 1
 tryfabulousskincream.com, 1
 tryfabulousskinserum.com, 1
-tryfm.net, 1
 trygarciniaslimdiet.com, 1
 tryhard.cz, 1
 trymegadrol.com, 1
 trynowrinkleseyeserum.com, 1
 trynta.com, 1
 trynta.net, 1
 tryretool.com, 1
 tryti.me, 1
@@ -34623,16 +34619,17 @@ uhc.gg, 1
 uhlhosting.ch, 1
 uhrenlux.de, 1
 uhuru-market.com, 1
 ui8.net, 1
 uiberlay.cz, 1
 uicchy.com, 1
 uiop.link, 1
 uitgeverij-deviant.nl, 1
+uitslagensoftware.nl, 1
 ujob.com.cn, 1
 uk.dating, 1
 uk.search.yahoo.com, 0
 ukbc.london, 1
 ukchemicalresearch.org, 0
 ukclimbing.com, 1
 ukdefencejournal.org.uk, 1
 ukhas.net, 1
@@ -35618,17 +35615,16 @@ voidshift.com, 1
 voipkb.com, 1
 voipsun.com, 1
 vokativy.cz, 0
 vokeapp.com, 1
 volcain.io, 1
 volcanconcretos.com, 1
 volga.us, 1
 volgavibes.ru, 0
-voliere-info.nl, 0
 volker-gropp.de, 1
 volkergropp.de, 1
 volkerwesselstransfer.nl, 1
 volkswurst.de, 1
 vollans.id.au, 1
 voloevents.com, 1
 volta.io, 1
 voltimax.com, 1
@@ -35775,16 +35771,17 @@ wacky.one, 1
 wadidi.com, 1
 wadsworth.gallery, 1
 wadvisor.com, 1
 waelisch.de, 1
 waelti.xxx, 1
 waf.ninja, 1
 waf.sexy, 1
 wafa4hw.com, 1
+wafairhaven.com.au, 1
 wafelland.be, 1
 waffle.at, 1
 wafni.com, 1
 wahhoi.net, 1
 wahidhasan.com, 1
 wahlman.org, 1
 wahrnehmungswelt.de, 1
 wahrnehmungswelten.de, 1
@@ -35804,17 +35801,16 @@ waka88.com, 1
 waka88.net, 1
 wakamiyasumiyosi.com, 1
 wakatime.com, 1
 wakfu.cc, 1
 wakiminblog.com, 1
 wala-floor.de, 1
 walk.onl, 1
 walkhighlandsandislands.com, 1
-walkingforhealth.org.uk, 1
 walkingrehabilitation.com, 1
 walksedona.com, 1
 wallabies.org, 1
 wallace-group.net, 1
 wallacehigh.org.uk, 1
 wallacequinn.co.uk, 1
 wallet.google.com, 1
 wallet.pp.ua, 1
@@ -35878,17 +35874,16 @@ warringtonkidsbouncycastles.co.uk, 1
 warschild.org, 1
 wartorngalaxy.com, 1
 wasatchconstables.com, 1
 waschpark-hantschel.de, 1
 wasema.com, 1
 wasfestes.de, 1
 washingtonregisteredagent.io, 1
 washingtonviews.com, 1
-wasielewski.com.de, 1
 wasil.org, 1
 waslh.com, 1
 wasserburg.dk, 1
 wasserspucker.de, 1
 wassibauer.com, 1
 wassim.is, 1
 wastrel.ch, 1
 watashi.bid, 1
@@ -36033,16 +36028,17 @@ webjobposting.com, 1
 webkeks.org, 1
 weblagring.se, 1
 weblate.org, 1
 webless.com, 1
 webliberty.ru, 1
 weblogic.pl, 1
 weblogzwolle.nl, 1
 webmail.gigahost.dk, 0
+webmail.info, 0
 webmail.onlime.ch, 0
 webmail.schokokeks.org, 0
 webmail.xalqbank.az, 1
 webmandesign.eu, 1
 webmax.com.tr, 1
 webmedpharmacy.co.uk, 1
 webmel.com, 1
 webmetering.at, 1
@@ -36103,17 +36099,17 @@ webtobesocial.de, 1
 webtorrent.io, 1
 webtrh.cz, 1
 webtropia.com, 0
 webukhost.com, 1
 webwednesday.nl, 1
 webwinkelwestland.nl, 1
 webwit.nl, 1
 webwolf.co.za, 1
-webworkshop.ltd, 1
+webworkshop.ltd, 0
 webyazilimankara.com, 1
 webzanem.com, 1
 wecanvisit.com, 1
 wechatify.com, 1
 wecleanbins.com, 1
 wecobble.com, 1
 wedding-m.jp, 1
 weddingfantasy.ru, 1
@@ -36355,16 +36351,17 @@ whisky-circle.info, 1
 whiskyglazen.nl, 1
 whiskynerd.ca, 1
 whisp.ly, 0
 whispeer.de, 1
 whisperinghoperanch.org, 1
 whisperlab.org, 1
 whistleb.com, 1
 whistleblower.gov, 1
+whistler-transfers.com, 1
 whitby-brewery.com, 1
 whitealps.at, 1
 whitealps.be, 1
 whitealps.ch, 1
 whitealps.de, 1
 whitealps.fr, 1
 whitealps.net, 1
 whitebear.cloud, 1
@@ -37303,17 +37300,16 @@ xps2pdf.co.uk, 1
 xpwn.cz, 1
 xqin.net, 1
 xr.cx, 1
 xrippedhd.com, 1
 xrockx.de, 1
 xroot.org, 1
 xs2a.no, 1
 xscancun.com, 1
-xscapers.com, 1
 xsec.me, 1
 xsmobile.de, 1
 xss.ht, 1
 xss.sk, 1
 xsstime.nl, 1
 xsz.jp, 1
 xt.om, 1
 xtarget.ru, 1
@@ -37393,17 +37389,17 @@ yal.sh, 1
 yalla.jp, 1
 yallamotor.com, 1
 yalook.com, 1
 yama.su, 1
 yamadaya.tv, 1
 yamaken.jp, 1
 yamashita-clinic.org, 1
 yame2.com, 1
-yamm.io, 1
+yamm.io, 0
 yanaduday.com, 1
 yandere.moe, 1
 yangjingwen.cn, 1
 yanngraf.ch, 1
 yanngraf.com, 1
 yannick.cloud, 1
 yanovich.net, 1
 yanqiyu.info, 1
@@ -38044,17 +38040,16 @@ zopy.com.br, 1
 zopyx.com, 1
 zor.com, 1
 zorgclustertool.nl, 1
 zorig.ch, 1
 zorium.org, 1
 zorki.nl, 1
 zorntt.fr, 1
 zorz.info, 1
-zotero.org, 1
 zouk.info, 1
 zouyaoji.top, 1
 zravypapir.cz, 1
 zrn.in, 0
 zrniecka-pre-sny.sk, 1
 zrnieckapresny.sk, 1
 zrt.io, 1
 zs-reporyje.cz, 1
--- a/services/sync/locales/en-US/sync.properties
+++ b/services/sync/locales/en-US/sync.properties
@@ -1,16 +1,16 @@
 # 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/.
 
 # %1: the user name (Ed), %2: the app name (Firefox), %3: the operating system (Android)
 client.name2 = %1$S’s %2$S on %3$S
 
-# %S is the date and time at which the last sync successfully completed
+# %S is the relative time at which the last sync successfully completed (e.g. 5 min. ago)
 lastSync2.label = Last sync: %S
 
 # signInToSync.description is the tooltip for the Sync buttons when Sync is
 # not configured.
 signInToSync.description = Sign In To Sync
 
 syncnow.label = Sync Now
 syncingtabs.label = Syncing Tabs…
--- a/servo/Cargo.lock
+++ b/servo/Cargo.lock
@@ -981,17 +981,17 @@ dependencies = [
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "cstr 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "nsstring 0.1.0",
- "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "servo_arc 0.1.1",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "style 0.0.1",
  "style_traits 0.0.1",
 ]
 
 [[package]]
@@ -1401,17 +1401,17 @@ dependencies = [
  "html5ever 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "msg 0.0.1",
  "net_traits 0.0.1",
  "ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "profile_traits 0.0.1",
  "range 0.0.1",
  "rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "script_layout_interface 0.0.1",
  "script_traits 0.0.1",
  "selectors 0.19.0",
  "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1446,17 +1446,17 @@ dependencies = [
  "layout_traits 0.0.1",
  "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "metrics 0.0.1",
  "msg 0.0.1",
  "net_traits 0.0.1",
- "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "profile_traits 0.0.1",
  "range 0.0.1",
  "rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "script 0.0.1",
  "script_layout_interface 0.0.1",
  "script_traits 0.0.1",
  "selectors 0.19.0",
  "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2118,33 +2118,32 @@ name = "owning_ref"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "stable_deref_trait 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "parking_lot"
-version = "0.4.8"
+version = "0.5.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "parking_lot_core 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot_core 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "parking_lot_core"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
  "libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
- "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "peeking_take_while"
 version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -2494,17 +2493,17 @@ dependencies = [
  "mime_guess 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "mitochondria 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozangle 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozjs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "msg 0.0.1",
  "net_traits 0.0.1",
  "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "offscreen_gl_context 0.15.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "profile_traits 0.0.1",
  "ref_filter_map 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "ref_slice 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "script_layout_interface 0.0.1",
@@ -2999,17 +2998,17 @@ dependencies = [
  "malloc_size_of_derive 0.0.1",
  "matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "nsstring 0.1.0",
  "num-integer 0.1.34 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "num_cpus 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)",
  "servo_arc 0.1.1",
  "servo_atoms 0.0.1",
  "servo_config 0.0.1",
@@ -3042,17 +3041,17 @@ dependencies = [
 name = "style_tests"
 version = "0.0.1"
 dependencies = [
  "app_units 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "html5ever 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
+ "parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "serde_json 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "servo_arc 0.1.1",
  "servo_atoms 0.0.1",
  "servo_config 0.0.1",
  "servo_url 0.0.1",
  "size_of_test 0.0.1",
@@ -3917,18 +3916,18 @@ dependencies = [
 "checksum ogg_metadata 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fc665717454399cba557c55ad226148996e9266ee291f8a37a98bb2cded0a490"
 "checksum openssl 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)" = "419ef26bb651d72b6c5a603bcc4e4856a362460e62352dfffa53de91d2e81181"
 "checksum openssl-sys 0.9.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5483bdc56756041ba6aa37c9cb59cc2219f012a2a1377d97ad35556ac6676ee7"
 "checksum ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "da12c96037889ae0be29dd2bdd260e5a62a7df24e6466d5a15bb8131c1c200a8"
 "checksum osmesa-src 17.3.1-devel (git+https://github.com/servo/osmesa-src)" = "<none>"
 "checksum osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b"
 "checksum ovr-mobile-sys 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a69b517feac6fc640f0679625defa0998bbcb32871a6901e63063c2abf9c4cbe"
 "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37"
-"checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e"
-"checksum parking_lot_core 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6c677d78851950b3aec390e681a411f78cc250cba277d4f578758a377f727970"
+"checksum parking_lot 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd"
+"checksum parking_lot_core 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "538ef00b7317875071d5e00f603f24d16f0b474c1a5fc0ccb8b454ca72eafa79"
 "checksum peeking_take_while 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
 "checksum percent-encoding 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "de154f638187706bde41d9b4738748933d64e6b37bdbffc0b47a97d16a6ae356"
 "checksum phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "cb325642290f28ee14d8c6201159949a872f220c62af6e110a56ea914fbe42fc"
 "checksum phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d62594c0bb54c464f633175d502038177e90309daf2e0158be42ed5f023ce88f"
 "checksum phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "6b07ffcc532ccc85e3afc45865469bf5d9e4ef5bfcf9622e3cfe80c2d275ec03"
 "checksum phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "07e24b0ca9643bdecd0632f2b3da6b1b89bbb0030e0b992afc1113b23a7bc2f2"
 "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
 "checksum plane-split 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "69c557e11e3a1533bc969fa596e5011e1d9f76dd61cd102ef942c9f8654b17a2"
--- a/servo/components/layout/Cargo.toml
+++ b/servo/components/layout/Cargo.toml
@@ -23,17 +23,17 @@ gfx_traits = {path = "../gfx_traits"}
 html5ever = "0.22"
 ipc-channel = "0.10"
 libc = "0.2"
 log = "0.3.5"
 malloc_size_of = { path = "../malloc_size_of" }
 msg = {path = "../msg"}
 net_traits = {path = "../net_traits"}
 ordered-float = "0.4"
-parking_lot = "0.4"
+parking_lot = "0.5"
 profile_traits = {path = "../profile_traits"}
 range = {path = "../range"}
 rayon = "1"
 script_layout_interface = {path = "../script_layout_interface"}
 script_traits = {path = "../script_traits"}
 selectors = { path = "../selectors" }
 serde = "1.0"
 servo_arc = {path = "../servo_arc"}
--- a/servo/components/layout_thread/Cargo.toml
+++ b/servo/components/layout_thread/Cargo.toml
@@ -25,17 +25,17 @@ layout = {path = "../layout"}
 layout_traits = {path = "../layout_traits"}
 lazy_static = "1"
 libc = "0.2"
 log = "0.3.5"
 malloc_size_of = { path = "../malloc_size_of" }
 metrics = {path = "../metrics"}
 msg = {path = "../msg"}
 net_traits = {path = "../net_traits"}
-parking_lot = "0.4"
+parking_lot = "0.5"
 profile_traits = {path = "../profile_traits"}
 range = {path = "../range"}
 rayon = "1"
 script = {path = "../script"}
 script_layout_interface = {path = "../script_layout_interface"}
 script_traits = {path = "../script_traits"}
 selectors = { path = "../selectors" }
 serde_json = "1.0"
--- a/servo/components/script/Cargo.toml
+++ b/servo/components/script/Cargo.toml
@@ -62,17 +62,17 @@ metrics = {path = "../metrics"}
 mitochondria = "1.1.2"
 mime = "0.2.1"
 mime_guess = "1.8.0"
 mozjs = { version = "0.3", features = ["promises"]}
 msg = {path = "../msg"}
 net_traits = {path = "../net_traits"}
 num-traits = "0.1.32"
 offscreen_gl_context = { version = "0.15", features = ["serde"] }
-parking_lot = "0.4"
+parking_lot = "0.5"
 phf = "0.7.18"
 profile_traits = {path = "../profile_traits"}
 ref_filter_map = "1.0.1"
 ref_slice = "1.0"
 regex = "0.2"
 script_layout_interface = {path = "../script_layout_interface"}
 script_plugins = {path = "../script_plugins"}
 script_traits = {path = "../script_traits"}
--- a/servo/components/style/Cargo.toml
+++ b/servo/components/style/Cargo.toml
@@ -47,17 +47,17 @@ malloc_size_of = { path = "../malloc_siz
 malloc_size_of_derive = { path = "../malloc_size_of_derive" }
 matches = "0.1"
 nsstring = {path = "../../support/gecko/nsstring", optional = true}
 num_cpus = {version = "1.1.0", optional = true}
 num-integer = "0.1.32"
 num-traits = "0.1.32"
 ordered-float = "0.4"
 owning_ref = "0.3.3"
-parking_lot = "0.4"
+parking_lot = "0.5"
 precomputed-hash = "0.1.1"
 rayon = "1"
 selectors = { path = "../selectors" }
 serde = {version = "1.0", optional = true, features = ["derive"]}
 servo_arc = { path = "../servo_arc" }
 servo_atoms = {path = "../atoms", optional = true}
 servo_config = {path = "../config", optional = true}
 smallbitvec = "1.0.6"
--- a/servo/ports/geckolib/Cargo.toml
+++ b/servo/ports/geckolib/Cargo.toml
@@ -17,14 +17,14 @@ gecko_debug = ["style/gecko_debug"]
 atomic_refcell = "0.1"
 cssparser = "0.23.0"
 cstr = "0.1.2"
 env_logger = {version = "0.4", default-features = false} # disable `regex` to reduce code size
 libc = "0.2"
 log = {version = "0.3.5", features = ["release_max_level_info"]}
 malloc_size_of = {path = "../../components/malloc_size_of"}
 nsstring = {path = "../../support/gecko/nsstring"}
-parking_lot = "0.4"
+parking_lot = "0.5"
 selectors = {path = "../../components/selectors"}
 servo_arc = {path = "../../components/servo_arc"}
 smallvec = "0.6"
 style = {path = "../../components/style", features = ["gecko"]}
 style_traits = {path = "../../components/style_traits"}
--- a/servo/tests/unit/style/Cargo.toml
+++ b/servo/tests/unit/style/Cargo.toml
@@ -10,17 +10,17 @@ path = "lib.rs"
 doctest = false
 
 [dependencies]
 byteorder = "1.0"
 app_units = "0.6"
 cssparser = "0.23.0"
 euclid = "0.17"
 html5ever = "0.22"
-parking_lot = "0.4"
+parking_lot = "0.5"
 rayon = "1"
 serde_json = "1.0"
 selectors = {path = "../../../components/selectors"}
 servo_arc = {path = "../../../components/servo_arc"}
 servo_atoms = {path = "../../../components/atoms"}
 servo_config = {path = "../../../components/config"}
 servo_url = {path = "../../../components/url"}
 size_of_test = {path = "../../../components/size_of_test"}
--- a/testing/marionette/element.js
+++ b/testing/marionette/element.js
@@ -436,34 +436,36 @@ element.findByXPathAll = function* (docu
  *     Where in the DOM hierarchy to begin searching.
  * @param {string} linkText
  *     Link text to search for.
  *
  * @return {Iterable.<HTMLAnchorElement>}
  *     Sequence of link elements which text is <var>s</var>.
  */
 element.findByLinkText = function(startNode, linkText) {
-  return filterLinks(startNode, link => link.text.trim() === linkText);
+  return filterLinks(startNode,
+      link => atom.getElementText(link).trim() === linkText);
 };
 
 /**
  * Find all hyperlinks descendant of <var>startNode</var> which
  * link text contains <var>linkText</var>.
  *
  * @param {Element} startNode
  *     Where in the DOM hierachy to begin searching.
  * @param {string} linkText
  *     Link text to search for.
  *
  * @return {Iterable.<HTMLAnchorElement>}
  *     Iterator of link elements which text containins
  *     <var>linkText</var>.
  */
 element.findByPartialLinkText = function(startNode, linkText) {
-  return filterLinks(startNode, link => link.text.includes(linkText));
+  return filterLinks(startNode,
+      link => atom.getElementText(link).includes(linkText));
 };
 
 /**
  * Find anonymous nodes of <var>node</var>.
  *
  * @param {XULDocument} document
  *     Root node of the document.
  * @param {XULElement} node
@@ -546,25 +548,25 @@ function findElement(strategy, selector,
     case element.Strategy.TagName:
       return startNode.getElementsByTagName(selector)[0];
 
     case element.Strategy.XPath:
       return element.findByXPath(document, startNode, selector);
 
     case element.Strategy.LinkText:
       for (let link of startNode.getElementsByTagName("a")) {
-        if (link.text.trim() === selector) {
+        if (atom.getElementText(link).trim() === selector) {
           return link;
         }
       }
       return undefined;
 
     case element.Strategy.PartialLinkText:
       for (let link of startNode.getElementsByTagName("a")) {
-        if (link.text.includes(selector)) {
+        if (atom.getElementText(link).includes(selector)) {
           return link;
         }
       }
       return undefined;
 
     case element.Strategy.Selector:
       try {
         return startNode.querySelector(selector);
--- a/testing/marionette/harness/marionette_harness/tests/unit/test_element_retrieval.py
+++ b/testing/marionette/harness/marionette_harness/tests/unit/test_element_retrieval.py
@@ -37,19 +37,16 @@ id_xhtml = inline('<p id="foo"></p>', do
 parent_child_html = inline("<div id=parent><p id=child></p></div>", doctype="html")
 parent_child_xhtml = inline('<div id="parent"><p id="child"></p></div>', doctype="xhtml")
 children_html = inline("<div><p>foo <p>bar</div>", doctype="html")
 children_xhtml = inline("<div><p>foo</p> <p>bar</p></div>", doctype="xhtml")
 class_html = inline("<p class='foo bar'>", doctype="html")
 class_xhtml = inline('<p class="foo bar"></p>', doctype="xhtml")
 name_html = inline("<p name=foo>", doctype="html")
 name_xhtml = inline('<p name="foo"></p>', doctype="xhtml")
-link_html = inline("<p><a href=#>foo bar</a>", doctype="html")
-link_html_with_trailing_space = inline("<p><a href=#>a link with a trailing space </a>")
-link_xhtml = inline('<p><a href="#">foo bar</a></p>', doctype="xhtml")
 
 
 class TestFindElementHTML(MarionetteTestCase):
     def setUp(self):
         MarionetteTestCase.setUp(self)
         self.marionette.timeout.implicit = 0
 
     def test_id(self):
@@ -95,37 +92,16 @@ class TestFindElementHTML(MarionetteTest
         found = self.marionette.find_element(By.CSS_SELECTOR, "p")
         self.assertIsInstance(found, HTMLElement)
         self.assertEqual(el, found)
 
     def test_invalid_css_selector_should_throw(self):
         with self.assertRaises(InvalidSelectorException):
             self.marionette.find_element(By.CSS_SELECTOR, "#")
 
-    def test_link_text(self):
-        self.marionette.navigate(link_html)
-        el = self.marionette.execute_script("return document.querySelector('a')")
-        found = self.marionette.find_element(By.LINK_TEXT, "foo bar")
-        self.assertIsInstance(found, HTMLElement)
-        self.assertEqual(el, found)
-
-    def test_link_text_with_trailing_space(self):
-        self.marionette.navigate(link_html_with_trailing_space)
-        el = self.marionette.execute_script("return document.querySelector('a')")
-        found = self.marionette.find_element(By.LINK_TEXT, "a link with a trailing space")
-        self.assertIsInstance(found, HTMLElement)
-        self.assertEqual(el, found)
-
-    def test_partial_link_text(self):
-        self.marionette.navigate(link_html)
-        el = self.marionette.execute_script("return document.querySelector('a')")
-        found = self.marionette.find_element(By.PARTIAL_LINK_TEXT, "foo")
-        self.assertIsInstance(found, HTMLElement)
-        self.assertEqual(el, found)
-
     def test_xpath(self):
         self.marionette.navigate(id_html)
         el = self.marionette.execute_script("return document.querySelector('#foo')")
         found = self.marionette.find_element(By.XPATH, "id('foo')")
         self.assertIsInstance(found, HTMLElement)
         self.assertEqual(el, found)
 
     def test_not_found(self):
@@ -259,30 +235,16 @@ class TestFindElementXHTML(MarionetteTes
 
     def test_css_selector(self):
         self.marionette.navigate(children_xhtml)
         el = self.marionette.execute_script("return document.querySelector('p')")
         found = self.marionette.find_element(By.CSS_SELECTOR, "p")
         self.assertIsInstance(found, HTMLElement)
         self.assertEqual(el, found)
 
-    def test_link_text(self):
-        self.marionette.navigate(link_xhtml)
-        el = self.marionette.execute_script("return document.querySelector('a')")
-        found = self.marionette.find_element(By.LINK_TEXT, "foo bar")
-        self.assertIsInstance(found, HTMLElement)
-        self.assertEqual(el, found)
-
-    def test_partial_link_text(self):
-        self.marionette.navigate(link_xhtml)
-        el = self.marionette.execute_script("return document.querySelector('a')")
-        found = self.marionette.find_element(By.PARTIAL_LINK_TEXT, "foo")
-        self.assertIsInstance(found, HTMLElement)
-        self.assertEqual(el, found)
-
     def test_xpath(self):
         self.marionette.navigate(id_xhtml)
         el = self.marionette.execute_script("return document.querySelector('#foo')")
         found = self.marionette.find_element(By.XPATH, "id('foo')")
         self.assertIsInstance(found, HTMLElement)
         self.assertEqual(el, found)
 
     def test_css_selector_scope_does_not_start_at_rootnode(self):
@@ -342,38 +304,16 @@ class TestFindElementsHTML(MarionetteTes
         found = self.marionette.find_elements(By.CSS_SELECTOR, "p")
         self.assertItemsIsInstance(found, HTMLElement)
         self.assertSequenceEqual(els, found)
 
     def test_invalid_css_selector_should_throw(self):
         with self.assertRaises(InvalidSelectorException):
             self.marionette.find_elements(By.CSS_SELECTOR, "#")
 
-    def test_link_text(self):
-        self.marionette.navigate(link_html)
-        els = self.marionette.execute_script("return document.querySelectorAll('a')")
-        found = self.marionette.find_elements(By.LINK_TEXT, "foo bar")
-        self.assertItemsIsInstance(found, HTMLElement)
-        self.assertSequenceEqual(els, found)
-
-    def test_link_text_with_trailing_space(self):
-        self.marionette.navigate(link_html_with_trailing_space)
-        els = self.marionette.execute_script("return document.querySelectorAll('a')")
-        found = self.marionette.find_elements(By.LINK_TEXT, "a link with a trailing space")
-        self.assertItemsIsInstance(found, HTMLElement)
-        self.assertSequenceEqual(els, found)
-
-
-    def test_partial_link_text(self):
-        self.marionette.navigate(link_html)
-        els = self.marionette.execute_script("return document.querySelectorAll('a')")
-        found = self.marionette.find_elements(By.PARTIAL_LINK_TEXT, "foo")
-        self.assertItemsIsInstance(found, HTMLElement)
-        self.assertSequenceEqual(els, found)
-
     def test_xpath(self):
         self.marionette.navigate(children_html)
         els = self.marionette.execute_script("return document.querySelectorAll('p')")
         found = self.marionette.find_elements(By.XPATH, ".//p")
         self.assertItemsIsInstance(found, HTMLElement)
         self.assertSequenceEqual(els, found)
 
     def test_css_selector_scope_doesnt_start_at_rootnode(self):
@@ -450,30 +390,16 @@ class TestFindElementsXHTML(MarionetteTe
 
     def test_css_selector(self):
         self.marionette.navigate(children_xhtml)
         els = self.marionette.execute_script("return document.querySelectorAll('p')")
         found = self.marionette.find_elements(By.CSS_SELECTOR, "p")
         self.assertItemsIsInstance(found, HTMLElement)
         self.assertSequenceEqual(els, found)
 
-    def test_link_text(self):
-        self.marionette.navigate(link_xhtml)
-        els = self.marionette.execute_script("return document.querySelectorAll('a')")
-        found = self.marionette.find_elements(By.LINK_TEXT, "foo bar")
-        self.assertItemsIsInstance(found, HTMLElement)
-        self.assertSequenceEqual(els, found)
-
-    def test_partial_link_text(self):
-        self.marionette.navigate(link_xhtml)
-        els = self.marionette.execute_script("return document.querySelectorAll('a')")
-        found = self.marionette.find_elements(By.PARTIAL_LINK_TEXT, "foo")
-        self.assertItemsIsInstance(found, HTMLElement)
-        self.assertSequenceEqual(els, found)
-
     @skip("XHTML namespace not yet supported")
     def test_xpath(self):
         self.marionette.navigate(children_xhtml)
         els = self.marionette.execute_script("return document.querySelectorAll('p')")
         found = self.marionette.find_elements(By.XPATH, "//xhtml:p")
         self.assertItemsIsInstance(found, HTMLElement)
         self.assertSequenceEqual(els, found)
 
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -500889,37 +500889,37 @@
    "a736f68dc602c0fccab56ec5cc6234cb3298c88d",
    "support"
   ],
   "css/css-scoping/shadow-cascade-order-001.html": [
    "46913ea7e47811b11be898de5c3bd0a330ea6637",
    "testharness"
   ],
   "css/css-scoping/shadow-disabled-sheet-001.html": [
-   "a3ddf0fe7fa422f5e712b8771669be76b0e3a798",
+   "3de2d23c1b3339b964ec2c009832a3207a3b9dc4",
    "reftest"
   ],
   "css/css-scoping/shadow-fallback-dynamic-001.html": [
-   "062c99df18077a0205d0170d641b1d1e61199657",
+   "741cd9e29067a4634aa5beb6bd06afa540895d22",
    "reftest"
   ],
   "css/css-scoping/shadow-fallback-dynamic-002.html": [
-   "2f66c8bca48c2ce5c9e82c5d67b152e2d143f4c6",
+   "e9a0d8178387901404030dde1b7ae7b2842f2eca",
    "reftest"
   ],
   "css/css-scoping/shadow-fallback-dynamic-003.html": [
-   "f054b0974277fbee38a96a26559c9a15400266db",
+   "0b75fadbaee366349576e2d6f3ca8d6a49069f66",
    "reftest"
   ],
   "css/css-scoping/shadow-fallback-dynamic-004.html": [
-   "fc33527eaaa7711ecb2c7cd9523e793bce2503f2",
+   "71dcc60c4ff59690927c1575fff2eecf85ee558f",
    "reftest"
   ],
   "css/css-scoping/shadow-fallback-dynamic-005.html": [
-   "46d78b6d6931505bbc4bfc2f83e2bd0bac0d3472",
+   "ab3c3d205e59df800ba5b4217245b83685521c31",
    "reftest"
   ],
   "css/css-scoping/shadow-root-insert-into-document.html": [
    "2cee9fff35c9222074f4ef78dcfcb8a3e02bbc98",
    "reftest"
   ],
   "css/css-scoping/slotted-invalidation.html": [
    "c500e1ceba1b293d45df5f66fd89d4a5d9ceb952",
@@ -593509,29 +593509,29 @@
    "37af63203540dfe11d36fe05d74694f05c6505f2",
    "wdspec"
   ],
   "webdriver/tests/element_retrieval/__init__.py": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
    "support"
   ],
   "webdriver/tests/element_retrieval/find_element.py": [
-   "699b97bd31eed625e2f0bed145aaf94c3e646853",
+   "8c9ed3ac2169f4b65a2e172a6e77b9586d83afa2",
    "wdspec"
   ],
   "webdriver/tests/element_retrieval/find_element_from_element.py": [
-   "34f356f2579391289edb31adf5b4d4eb88ffc643",
+   "ecb74fc793a35481e2aa2456544b8b8f32d08546",
    "wdspec"
   ],
   "webdriver/tests/element_retrieval/find_elements.py": [
-   "284ae53c5c94d02fb46b26dcd70af02d7917e7b4",
+   "fa8c2de1ffd12432bf14368b9c72000567ab8d20",
    "wdspec"
   ],
   "webdriver/tests/element_retrieval/find_elements_from_element.py": [
-   "b062b9f044268f0d9e092def81afae1277a91cd8",
+   "6099bab098d03c0ac17134014b0acaf0b977731a",
    "wdspec"
   ],
   "webdriver/tests/element_retrieval/get_active_element.py": [
    "7d40a7641dbf04cd78f1dba630afa2e8d80dad13",
    "wdspec"
   ],
   "webdriver/tests/element_send_keys/__init__.py": [
    "da39a3ee5e6b4b0d3255bfef95601890afd80709",
@@ -594653,17 +594653,17 @@
    "f3255ca1da5c8e81c37e658cb2dc83e1a7dc2e63",
    "testharness"
   ],
   "websockets/Create-nonAscii-protocol-string.htm": [
    "f556c52a5ba7370dfd94f57331d606b147b0932f",
    "testharness"
   ],
   "websockets/Create-on-worker-shutdown.html": [
-   "75112264efdc3b310f4ba2ab4517b7608aacf2f2",
+   "213d7b23d154b930cc20985c2a86509fcdc09a9a",
    "testharness"
   ],
   "websockets/Create-protocol-with-space.htm": [
    "923fd2681d86812d63347f995f91747ebec18a44",
    "testharness"
   ],
   "websockets/Create-protocols-repeated-case-insensitive.htm": [
    "55a3dbf713cf45900f8af2e9c9bc2f41bb447141",
--- a/testing/web-platform/tests/webdriver/tests/element_retrieval/find_element.py
+++ b/testing/web-platform/tests/webdriver/tests/element_retrieval/find_element.py
@@ -46,31 +46,65 @@ def test_closed_context(session, create_
 def test_find_element(session, using, value):
     # Step 8 - 9
     session.url = inline("<a href=# id=linkText>full link text</a>")
 
     response = find_element(session, using, value)
     assert_success(response)
 
 
+@pytest.mark.parametrize("document,value", [
+    ("<a href=#>link text</a>", "link text"),
+    ("<a href=#>&nbsp;link text&nbsp;</a>", "link text"),
+    ("<a href=#>link<br>text</a>", "link\ntext"),
+    ("<a href=#>link&amp;text</a>", "link&text"),
+    ("<a href=#>LINK TEXT</a>", "LINK TEXT"),
+    ("<a href=# style='text-transform: uppercase'>link text</a>", "LINK TEXT"),
+])
+def test_find_element_link_text(session, document, value):
+    # Step 8 - 9
+    session.url = inline(document)
+
+    response = find_element(session, "link text", value)
+    assert_success(response)
+
+
+@pytest.mark.parametrize("document,value", [
+    ("<a href=#>partial link text</a>", "link"),
+    ("<a href=#>&nbsp;partial link text&nbsp;</a>", "link"),
+    ("<a href=#>partial link text</a>", "k t"),
+    ("<a href=#>partial link<br>text</a>", "k\nt"),
+    ("<a href=#>partial link&amp;text</a>", "k&t"),
+    ("<a href=#>PARTIAL LINK TEXT</a>", "LINK"),
+    ("<a href=# style='text-transform: uppercase'>partial link text</a>", "LINK"),
+])
+def test_find_element_partial_link_text(session, document, value):
+    # Step 8 - 9
+    session.url = inline(document)
+
+    response = find_element(session, "partial link text", value)
+    assert_success(response)
+
+
 @pytest.mark.parametrize("using,value", [("css selector", "#wontExist")])
 def test_no_element(session, using, value):
     # Step 8 - 9
     response = find_element(session, using, value)
     assert_error(response, "no such element")
 
 
 @pytest.mark.parametrize("using,value",
                          [("css selector", "#linkText"),
                           ("link text", "full link text"),
                           ("partial link text", "link text"),
                           ("tag name", "a"),
                           ("xpath", "//*[name()='a']")])
 def test_xhtml_namespace(session, using, value):
-    session.url = inline("""<a href="#" id="linkText">full link text</a>""", doctype="xhtml")
+    session.url = inline("""<a href="#" id="linkText">full link text</a>""",
+                         doctype="xhtml")
     expected = session.execute_script("return document.links[0]")
 
     response = find_element(session, using, value)
     value = assert_success(response)
     assert_same_element(session, value, expected)
 
 
 @pytest.mark.parametrize("using,value",
--- a/testing/web-platform/tests/webdriver/tests/element_retrieval/find_element_from_element.py
+++ b/testing/web-platform/tests/webdriver/tests/element_retrieval/find_element_from_element.py
@@ -26,17 +26,16 @@ def test_invalid_selector_argument(sessi
 
 def test_closed_context(session, create_window):
     # Step 5
     new_window = create_window()
     session.window_handle = new_window
     session.close()
 
     response = find_element(session, "notReal", "css selector", "foo")
-
     assert_error(response, "no such window")
 
 
 @pytest.mark.parametrize("using,value",
                          [("css selector", "#linkText"),
                           ("link text", "full link text"),
                           ("partial link text", "link text"),
                           ("tag name", "a"),
@@ -44,33 +43,69 @@ def test_closed_context(session, create_
 def test_find_element(session, using, value):
     # Step 8 - 9
     session.url = inline("<div><a href=# id=linkText>full link text</a></div>")
     element = session.find.css("div", all=False)
     response = find_element(session, element.id, using, value)
     assert_success(response)
 
 
+@pytest.mark.parametrize("document,value", [
+    ("<a href=#>link text</a>", "link text"),
+    ("<a href=#>&nbsp;link text&nbsp;</a>", "link text"),
+    ("<a href=#>link<br>text</a>", "link\ntext"),
+    ("<a href=#>link&amp;text</a>", "link&text"),
+    ("<a href=#>LINK TEXT</a>", "LINK TEXT"),
+    ("<a href=# style='text-transform: uppercase'>link text</a>", "LINK TEXT"),
+])
+def test_find_element_link_text(session, document, value):
+    # Step 8 - 9
+    session.url = inline("<div>{0}</div>".format(document))
+    element = session.find.css("div", all=False)
+
+    response = find_element(session, element.id, "link text", value)
+    assert_success(response)
+
+
+@pytest.mark.parametrize("document,value", [
+    ("<a href=#>partial link text</a>", "link"),
+    ("<a href=#>&nbsp;partial link text&nbsp;</a>", "link"),
+    ("<a href=#>partial link text</a>", "k t"),
+    ("<a href=#>partial link<br>text</a>", "k\nt"),
+    ("<a href=#>partial link&amp;text</a>", "k&t"),
+    ("<a href=#>PARTIAL LINK TEXT</a>", "LINK"),
+    ("<a href=# style='text-transform: uppercase'>partial link text</a>", "LINK"),
+])
+def test_find_element_partial_link_text(session, document, value):
+    # Step 8 - 9
+    session.url = inline("<div>{0}</div>".format(document))
+    element = session.find.css("div", all=False)
+
+    response = find_element(session, element.id, "partial link text", value)
+    assert_success(response)
+
+
 @pytest.mark.parametrize("using,value",[("css selector", "#wontExist")])
 def test_no_element(session, using, value):
     # Step 8 - 9
     session.url = inline("<div></div>")
     element = session.find.css("div", all=False)
     response = find_element(session, element.id, using, value)
     assert_error(response, "no such element")
 
 
 @pytest.mark.parametrize("using,value",
                          [("css selector", "#linkText"),
                           ("link text", "full link text"),
                           ("partial link text", "link text"),
                           ("tag name", "a"),
                           ("xpath", "//*[name()='a']")])
 def test_xhtml_namespace(session, using, value):
-    session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""", doctype="xhtml")
+    session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""",
+                         doctype="xhtml")
     from_element = session.execute_script("""return document.querySelector("p")""")
     expected = session.execute_script("return document.links[0]")
 
     response = find_element(session, from_element.id, using, value)
     value = assert_success(response)
     assert_same_element(session, value, expected)
 
 
--- a/testing/web-platform/tests/webdriver/tests/element_retrieval/find_elements.py
+++ b/testing/web-platform/tests/webdriver/tests/element_retrieval/find_elements.py
@@ -25,20 +25,17 @@ def test_invalid_selector_argument(sessi
 
 
 def test_closed_context(session, create_window):
     # Step 5
     new_window = create_window()
     session.window_handle = new_window
     session.close()
 
-    response = session.transport.send("POST",
-                                      "session/%s/elements" % session.session_id,
-                                      {"using": "css selector", "value": "foo"})
-
+    response = find_elements(session, "css selector", "foo")
     assert_error(response, "no such window")
 
 
 @pytest.mark.parametrize("using,value",
                          [("css selector", "#linkText"),
                           ("link text", "full link text"),
                           ("partial link text", "link text"),
                           ("tag name", "a"),
@@ -47,33 +44,79 @@ def test_find_elements(session, using, v
     # Step 8 - 9
     session.url = inline("<a href=# id=linkText>full link text</a>")
 
     response = find_elements(session, using, value)
     assert_success(response)
     assert len(response.body["value"]) == 1
 
 
+@pytest.mark.parametrize("document,value", [
+    ("<a href=#>link text</a>", "link text"),
+    ("<a href=#>&nbsp;link text&nbsp;</a>", "link text"),
+    ("<a href=#>link<br>text</a>", "link\ntext"),
+    ("<a href=#>link&amp;text</a>", "link&text"),
+    ("<a href=#>LINK TEXT</a>", "LINK TEXT"),
+    ("<a href=# style='text-transform: uppercase'>link text</a>", "LINK TEXT"),
+])
+def test_find_elements_link_text(session, document, value):
+    # Step 8 - 9
+    session.url = inline("<a href=#>not wanted</a><br/>{0}".format(document))
+    expected = session.execute_script("return document.links[1];")
+
+    response = find_elements(session, "link text", value)
+    value = assert_success(response)
+    assert isinstance(value, list)
+    assert len(value) == 1
+
+    found_element = value[0]
+    assert_same_element(session, found_element, expected)
+
+
+@pytest.mark.parametrize("document,value", [
+    ("<a href=#>partial link text</a>", "link"),
+    ("<a href=#>&nbsp;partial link text&nbsp;</a>", "link"),
+    ("<a href=#>partial link text</a>", "k t"),
+    ("<a href=#>partial link<br>text</a>", "k\nt"),
+    ("<a href=#>partial link&amp;text</a>", "k&t"),
+    ("<a href=#>PARTIAL LINK TEXT</a>", "LINK"),
+    ("<a href=# style='text-transform: uppercase'>partial link text</a>", "LINK"),
+])
+def test_find_elements_partial_link_text(session, document, value):
+    # Step 8 - 9
+    session.url = inline("<a href=#>not wanted</a><br/>{0}".format(document))
+    expected = session.execute_script("return document.links[1];")
+
+    response = find_elements(session, "partial link text", value)
+    value = assert_success(response)
+    assert isinstance(value, list)
+    assert len(value) == 1
+
+    found_element = value[0]
+    assert_same_element(session, found_element, expected)
+
+
 @pytest.mark.parametrize("using,value", [("css selector", "#wontExist")])
 def test_no_element(session, using, value):
     # Step 8 - 9
     response = find_elements(session, using, value)
     assert_success(response)
     assert response.body["value"] == []
 
 
 @pytest.mark.parametrize("using,value",
                          [("css selector", "#linkText"),
                           ("link text", "full link text"),
                           ("partial link text", "link text"),
                           ("tag name", "a"),
                           ("xpath", "//*[name()='a']")])
 def test_xhtml_namespace(session, using, value):
-    session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""", doctype="xhtml")
-    expected = session.execute_script("return document.links[0]")
+    session.url = inline("""<a href="#" id="linkText">full link text</a>""",
+                         doctype="xhtml")
+    expected = session.execute_script("return document.links[0];")
 
     response = find_elements(session, using, value)
     value = assert_success(response)
     assert isinstance(value, list)
     assert len(value) == 1
 
     found_element = value[0]
     assert_same_element(session, found_element, expected)
--- a/testing/web-platform/tests/webdriver/tests/element_retrieval/find_elements_from_element.py
+++ b/testing/web-platform/tests/webdriver/tests/element_retrieval/find_elements_from_element.py
@@ -43,33 +43,81 @@ def test_closed_context(session, create_
 def test_find_elements(session, using, value):
     # Step 8 - 9
     session.url = inline("<div><a href=# id=linkText>full link text</a></div>")
     element = session.find.css("div", all=False)
     response = find_elements(session, element.id, using, value)
     assert_success(response)
 
 
+@pytest.mark.parametrize("document,value", [
+    ("<a href=#>link text</a>", "link text"),
+    ("<a href=#>&nbsp;link text&nbsp;</a>", "link text"),
+    ("<a href=#>link<br>text</a>", "link\ntext"),
+    ("<a href=#>link&amp;text</a>", "link&text"),
+    ("<a href=#>LINK TEXT</a>", "LINK TEXT"),
+    ("<a href=# style='text-transform: uppercase'>link text</a>", "LINK TEXT"),
+])
+def test_find_elements_link_text(session, document, value):
+    # Step 8 - 9
+    session.url = inline("<div><a href=#>not wanted</a><br/>{0}</div>".format(document))
+    element = session.find.css("div", all=False)
+    expected = session.execute_script("return document.links[1];")
+
+    response = find_elements(session, element.id, "link text", value)
+    value = assert_success(response)
+    assert isinstance(value, list)
+    assert len(value) == 1
+
+    found_element = value[0]
+    assert_same_element(session, found_element, expected)
+
+
+@pytest.mark.parametrize("document,value", [
+    ("<a href=#>partial link text</a>", "link"),
+    ("<a href=#>&nbsp;partial link text&nbsp;</a>", "link"),
+    ("<a href=#>partial link text</a>", "k t"),
+    ("<a href=#>partial link<br>text</a>", "k\nt"),
+    ("<a href=#>partial link&amp;text</a>", "k&t"),
+    ("<a href=#>PARTIAL LINK TEXT</a>", "LINK"),
+    ("<a href=# style='text-transform: uppercase'>partial link text</a>", "LINK"),
+])
+def test_find_elements_partial_link_text(session, document, value):
+    # Step 8 - 9
+    session.url = inline("<div><a href=#>not wanted</a><br/>{0}</div>".format(document))
+    element = session.find.css("div", all=False)
+    expected = session.execute_script("return document.links[1];")
+
+    response = find_elements(session, element.id, "partial link text", value)
+    value = assert_success(response)
+    assert isinstance(value, list)
+    assert len(value) == 1
+
+    found_element = value[0]
+    assert_same_element(session, found_element, expected)
+
+
 @pytest.mark.parametrize("using,value", [("css selector", "#wontExist")])
 def test_no_element(session, using, value):
     # Step 8 - 9
     session.url = inline("<div></div>")
     element = session.find.css("div", all=False)
     response = find_elements(session, element.id, using, value)
     assert response.body["value"] == []
 
 
 @pytest.mark.parametrize("using,value",
                          [("css selector", "#linkText"),
                           ("link text", "full link text"),
                           ("partial link text", "link text"),
                           ("tag name", "a"),
                           ("xpath", "//*[name()='a']")])
 def test_xhtml_namespace(session, using, value):
-    session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""", doctype="xhtml")
+    session.url = inline("""<p><a href="#" id="linkText">full link text</a></p>""",
+                         doctype="xhtml")
     from_element = session.execute_script("""return document.querySelector("p")""")
     expected = session.execute_script("return document.links[0]")
 
     response = find_elements(session, from_element.id, using, value)
     value = assert_success(response)
     assert isinstance(value, list)
     assert len(value) == 1
 
--- a/third_party/rust/parking_lot/.cargo-checksum.json
+++ b/third_party/rust/parking_lot/.cargo-checksum.json
@@ -1,1 +1,1 @@
-{"files":{".travis.yml":"8e424960f1e47843f45cae205873e9590e4317b5b2316090f9f94cf2f5d704e8","Cargo.toml":"a31940ea072ae30f6df4c28f4fcbae206929a9e7e8adf19956dd9ed75fa7e75d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"0c248175303f7dc19ce2cb30882c950a55a49da6b8c765c5ba49feb3e6eb7553","appveyor.yml":"cc608360622923f6f693cd68b4d7c1f64daa55f6b38f0df90f270825c6c276bc","src/condvar.rs":"962a3838e95cb664b261a44f536b003a284fe7bfdcb94a80c9a07c7679cae3dd","src/elision.rs":"0fef04d2991afeabafb041e81afeec74e89095d0eca49e5516bdcd5bc90c086f","src/lib.rs":"50951210148941266ce3a7d4017c339f8ad4419a9a8db6f915023890ed27d638","src/mutex.rs":"59cd61dd8deeaacceabd05e15b7fd6d2942e3f6c3c592221898d84a2ca804a6e","src/once.rs":"eada2e82bd8dcb9ed68d4fb2d9f8c336878eeb122f0bf8dde3feb2d77adfb598","src/raw_mutex.rs":"225cbf0ef951be062866da674e5eea8245fcc43ecd8a26da7097dea03b770bf5","src/raw_remutex.rs":"6c6d2aa83abe8f45db04de0efc04c70564cd0c55b6655da8ef4afe841c0add95","src/raw_rwlock.rs":"a7aebf70b8f7a43f96136388be1a54e5ca5b565c9da623f23434c99fb4c0b147","src/remutex.rs":"7f1640fa5a6eb43b592db47d9afa63904895030d246708ec8eac413dc8093514","src/rwlock.rs":"87d648c5fcccda784da165801b888a3592b6a85ddb605c1df3ae0e881dd22417","src/stable.rs":"cc18c58404dc6017924d88fb9f4ed94e5320b8cb0a36985162b23130b8cd7480","src/util.rs":"2d07c0c010a857790ae2ed6a1215eeed8af76859e076797ea1ba8dec82169e84"},"package":"37f364e2ce5efa24c7d0b6646d5bb61145551a0112f107ffd7499f1a3e322fbd"}
\ No newline at end of file
+{"files":{".travis.yml":"04d3d7425ce24e59d25df35da9c54f3ccd429c62ed8c9cf37b5ed2757afe96f1","Cargo.toml":"9e6a70c63617696e07a9130c27a80203180c1f240eb4ebdddde4429570da0c63","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"9d1e4237f1063e54aca1f65fc00a87ad53f75fcc73d054f8dd139f62f4a0b15e","appveyor.yml":"cfa9c3ae2476c879fe4240c306d45de6c2c04025212d8217fa76690888117594","src/condvar.rs":"1a3de60460e832d7ff76a82d5dac3f387fe2255e6a8ad4a686fe37f134c088c7","src/deadlock.rs":"82de990ef5966c852f8019b511e3c60471b562e56fd7ed0ca340399968b44a2d","src/elision.rs":"89072fe0aca87d53abc0f56490ae77bcf9d77e28e291bd13e861b1924bbb079f","src/lib.rs":"02d5716f4f43c2598afa57234e53d1a4c5db4f91ede937a226ee34eabbdc4da5","src/mutex.rs":"d8f557d40c3aab3e36f81961db9eb32831580a3a6a4b2a59674cafe6621e4772","src/once.rs":"1f408083854f918e896fdba8a9ecf25ae79ee06613d8daec75b800fb78dfd3a8","src/raw_mutex.rs":"f98ddd76e1491bc239b7c24e94f3f6a94ae0f5828873e78e1245ef19621a257b","src/raw_remutex.rs":"86e1e339567c12f91e3274ca3126c4af004fd30dff88a6cd261fc67680e33798","src/raw_rwlock.rs":"d3c71098df5e8b22cdfd7f8d7c3f287951d0bac1ac9ede83a94f809576ed9d41","src/remutex.rs":"d73f4a0f22f4a5e8c6126b784c03157f34456b0c1b90570b98db9f1c6b1f4046","src/rwlock.rs":"28e6c3a3d1aea9add4950fa5c67ba79f4aeb2e72830ff4d4a66adc2a9afa12dc","src/util.rs":"2d07c0c010a857790ae2ed6a1215eeed8af76859e076797ea1ba8dec82169e84"},"package":"9fd9d732f2de194336fb02fe11f9eed13d9e76f13f4315b4d88a14ca411750cd"}
\ No newline at end of file
--- a/third_party/rust/parking_lot/.travis.yml
+++ b/third_party/rust/parking_lot/.travis.yml
@@ -1,38 +1,40 @@
 language: rust
 sudo: false
 
 rust:
-- 1.13.0
+- 1.18.0
 - stable
 - beta
 - nightly
 
 before_script:
 - |
   pip install 'travis-cargo<0.2' --user &&
   export PATH=$HOME/.local/bin:$PATH
 
 script:
 - cd core;
 - travis-cargo build;
 - cd ..;
 - travis-cargo build
 - travis-cargo test
-- travis-cargo doc -- --no-deps -p parking_lot -p parking_lot_core
+- travis-cargo test -- --features=deadlock_detection
+- travis-cargo --only nightly doc -- --all-features --no-deps -p parking_lot -p parking_lot_core
 - if [ "$TRAVIS_RUST_VERSION" != "1.8.0" ]; then
       cd benchmark;
       travis-cargo build;
       travis-cargo run -- --release --bin mutex 2 1 0 1;
       travis-cargo run -- --release --bin rwlock 1 1 1 0 1;
       cd ..;
   fi
 
 after_success:
 - travis-cargo --only nightly doc-upload
 
 env:
   global:
   - TRAVIS_CARGO_NIGHTLY_FEATURE=nightly
+  - RUST_TEST_THREADS=1
 
 notifications:
   email: false
--- a/third_party/rust/parking_lot/Cargo.toml
+++ b/third_party/rust/parking_lot/Cargo.toml
@@ -7,30 +7,29 @@
 #
 # If you believe there's an error in this file please file an
 # issue against the rust-lang/cargo repository. If you're
 # editing this file be aware that the upstream Cargo.toml
 # will likely look very different (and much more reasonable)
 
 [package]
 name = "parking_lot"
-version = "0.4.4"
+version = "0.5.4"
 authors = ["Amanieu d'Antras <amanieu@gmail.com>"]
 description = "More compact and efficient implementations of the standard synchronization primitives."
 documentation = "https://amanieu.github.io/parking_lot/parking_lot/index.html"
 readme = "README.md"
 keywords = ["mutex", "condvar", "rwlock", "once", "thread"]
 license = "Apache-2.0/MIT"
 repository = "https://github.com/Amanieu/parking_lot"
 [dependencies.owning_ref]
 version = "0.3"
 optional = true
 
 [dependencies.parking_lot_core]
 version = "0.2"
 [dev-dependencies.rand]
-version = "0.3"
+version = "0.4"
 
 [features]
+deadlock_detection = ["parking_lot_core/deadlock_detection"]
 default = ["owning_ref"]
 nightly = ["parking_lot_core/nightly"]
-[target."cfg(not(target_os = \"emscripten\"))".dependencies.thread-id]
-version = "3.0"
--- a/third_party/rust/parking_lot/README.md
+++ b/third_party/rust/parking_lot/README.md
@@ -42,32 +42,35 @@ 4. Microcontention (a contended lock wit
    lock.
 5. The locks are adaptive and will suspend a thread after a few failed spin
    attempts. This makes the locks suitable for both long and short critical
    sections.
 6. `Condvar`, `RwLock` and `Once` work on Windows XP, unlike the standard
    library versions of those types.
 7. `RwLock` takes advantage of hardware lock elision on processors that
    support it, which can lead to huge performance wins with many readers.
-8. `MutexGuard` (and the `RwLock` equivalents) is `Send`, which means it can
-   be unlocked by a different thread than the one that locked it.
-9. `RwLock` uses a task-fair locking policy, which avoids reader and writer
+8. `RwLock` uses a task-fair locking policy, which avoids reader and writer
    starvation, whereas the standard library version makes no guarantees.
-10. `Condvar` is guaranteed not to produce spurious wakeups. A thread will
+9. `Condvar` is guaranteed not to produce spurious wakeups. A thread will
     only be woken up if it timed out or it was woken up by a notification.
-11. `Condvar::notify_all` will only wake up a single thread and requeue the
+10. `Condvar::notify_all` will only wake up a single thread and requeue the
     rest to wait on the associated `Mutex`. This avoids a thundering herd
     problem where all threads try to acquire the lock at the same time.
-12. `RwLock` supports atomically downgrading a write lock into a read lock.
-13. `Mutex` and `RwLock` allow raw unlocking without a RAII guard object.
-14. `Mutex<()>` and `RwLock<()>` allow raw locking without a RAII guard
+11. `RwLock` supports atomically downgrading a write lock into a read lock.
+12. `Mutex` and `RwLock` allow raw unlocking without a RAII guard object.
+13. `Mutex<()>` and `RwLock<()>` allow raw locking without a RAII guard
     object.
-15. `Mutex` and `RwLock` support [eventual fairness](https://trac.webkit.org/changeset/203350)
+14. `Mutex` and `RwLock` support [eventual fairness](https://trac.webkit.org/changeset/203350)
     which allows them to be fair on average without sacrificing performance.
-16. A `ReentrantMutex` type which supports recursive locking.
+15. A `ReentrantMutex` type which supports recursive locking.
+16. An *experimental* deadlock detector that works for `Mutex`,
+    `RwLock` and `ReentrantMutex`. This feature is disabled by default and
+    can be enabled via the `deadlock_detection` feature.
+17. `RwLock` supports atomically upgrading an "upgradable" read lock into a
+    write lock.
 
 ## The parking lot
 
 To keep these primitives small, all thread queuing and suspending
 functionality is offloaded to the *parking lot*. The idea behind this is
 based on the Webkit [`WTF::ParkingLot`](https://webkit.org/blog/6161/locking-in-webkit/)
 class, which essentially consists of a hash table mapping of lock addresses
 to queues of parked (sleeping) threads. The Webkit parking lot was itself
@@ -82,38 +85,44 @@ There are a few restrictions when using 
 - `Mutex` and `Once` will use 1 word of space instead of 1 byte.
 - You will have to use `lazy_static!` to statically initialize `Mutex`,
   `Condvar` and `RwLock` types instead of `const fn`.
 - `RwLock` will not be able to take advantage of hardware lock elision for
   readers, which improves performance when there are multiple readers.
 - Slightly less efficient code may be generated for `compare_exchange`
   operations. This should not affect architectures like x86 though.
 
+To enable nightly-only functionality, you need to enable the `nightly` feature
+in Cargo (see below).
+
 ## Usage
 
 Add this to your `Cargo.toml`:
 
 ```toml
 [dependencies]
-parking_lot = "0.4"
+parking_lot = "0.5"
 ```
 
 and this to your crate root:
 
 ```rust
 extern crate parking_lot;
 ```
 
 To enable nightly-only features, add this to your `Cargo.toml` instead:
 
 ```toml
 [dependencies]
-parking_lot = {version = "0.4", features = ["nightly"]}
+parking_lot = {version = "0.5", features = ["nightly"]}
 ```
 
+The experimental deadlock detector can be enabled with the
+`deadlock_detection` Cargo feature.
+
 The core parking lot API is provided by the `parking_lot_core` crate. It is
 separate from the synchronization primitives in the `parking_lot` crate so that
 changes to the core API do not cause breaking changes for users of `parking_lot`.
 
 ## License
 
 Licensed under either of
 
--- a/third_party/rust/parking_lot/appveyor.yml
+++ b/third_party/rust/parking_lot/appveyor.yml
@@ -1,27 +1,29 @@
 environment:
   TRAVIS_CARGO_NIGHTLY_FEATURE: nightly
+  RUST_TEST_THREADS: 1
   matrix:
   - TARGET: nightly-x86_64-pc-windows-msvc
   - TARGET: nightly-i686-pc-windows-msvc
   - TARGET: nightly-x86_64-pc-windows-gnu
   - TARGET: nightly-i686-pc-windows-gnu
-  - TARGET: 1.13.0-x86_64-pc-windows-msvc
-  - TARGET: 1.13.0-i686-pc-windows-msvc
-  - TARGET: 1.13.0-x86_64-pc-windows-gnu
-  - TARGET: 1.13.0-i686-pc-windows-gnu
+  - TARGET: 1.18.0-x86_64-pc-windows-msvc
+  - TARGET: 1.18.0-i686-pc-windows-msvc
+  - TARGET: 1.18.0-x86_64-pc-windows-gnu
+  - TARGET: 1.18.0-i686-pc-windows-gnu
 
 install:
   - SET PATH=C:\Python27;C:\Python27\Scripts;%PATH%;%APPDATA%\Python\Scripts
   - pip install "travis-cargo<0.2" --user
   - ps: Start-FileDownload "https://static.rust-lang.org/dist/rust-${env:TARGET}.exe" -FileName "rust-install.exe"
   - ps: .\rust-install.exe /VERYSILENT /NORESTART /DIR="C:\rust" | Out-Null
   - ps: $env:PATH="$env:PATH;C:\rust\bin"
   - rustc -vV
   - cargo -vV
 
 build_script:
   - travis-cargo build
 
 test_script:
   - travis-cargo test
+  - travis-cargo test -- --features=deadlock_detection
   - travis-cargo doc
--- a/third_party/rust/parking_lot/src/condvar.rs
+++ b/third_party/rust/parking_lot/src/condvar.rs
@@ -3,19 +3,20 @@
 // Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
 // http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
 // http://opensource.org/licenses/MIT>, at your option. This file may not be
 // copied, modified, or distributed except according to those terms.
 
 use std::sync::atomic::{AtomicPtr, Ordering};
 use std::time::{Duration, Instant};
 use std::ptr;
-use parking_lot_core::{self, ParkResult, UnparkResult, RequeueOp, DEFAULT_PARK_TOKEN};
-use mutex::{MutexGuard, guard_lock};
-use raw_mutex::{RawMutex, TOKEN_NORMAL, TOKEN_HANDOFF};
+use parking_lot_core::{self, ParkResult, RequeueOp, UnparkResult, DEFAULT_PARK_TOKEN};
+use mutex::{guard_lock, MutexGuard};
+use raw_mutex::{RawMutex, TOKEN_HANDOFF, TOKEN_NORMAL};
+use deadlock;
 
 /// A type indicating whether a timed wait on a condition variable returned
 /// due to a time out or not.
 #[derive(Debug, PartialEq, Eq, Copy, Clone)]
 pub struct WaitTimeoutResult(bool);
 
 impl WaitTimeoutResult {
     /// Returns whether the wait was known to have timed out.
@@ -83,25 +84,29 @@ pub struct Condvar {
 }
 
 impl Condvar {
     /// Creates a new condition variable which is ready to be waited on and
     /// notified.
     #[cfg(feature = "nightly")]
     #[inline]
     pub const fn new() -> Condvar {
-        Condvar { state: AtomicPtr::new(ptr::null_mut()) }
+        Condvar {
+            state: AtomicPtr::new(ptr::null_mut()),
+        }
     }
 
     /// Creates a new condition variable which is ready to be waited on and
     /// notified.
     #[cfg(not(feature = "nightly"))]
     #[inline]
     pub fn new() -> Condvar {
-        Condvar { state: AtomicPtr::new(ptr::null_mut()) }
+        Condvar {
+            state: AtomicPtr::new(ptr::null_mut()),
+        }
     }
 
     /// Wakes up one blocked thread on this condvar.
     ///
     /// If there is a blocked thread on this condition variable, then it will
     /// be woken up from its call to `wait` or `wait_timeout`. Calls to
     /// `notify_one` are not buffered in any way.
     ///
@@ -233,20 +238,21 @@ impl Condvar {
     /// Like `wait`, the lock specified will be re-acquired when this function
     /// returns, regardless of whether the timeout elapsed or not.
     ///
     /// # Panics
     ///
     /// This function will panic if another thread is waiting on the `Condvar`
     /// with a different `Mutex` object.
     #[inline]
-    pub fn wait_until<T: ?Sized>(&self,
-                                 mutex_guard: &mut MutexGuard<T>,
-                                 timeout: Instant)
-                                 -> WaitTimeoutResult {
+    pub fn wait_until<T: ?Sized>(
+        &self,
+        mutex_guard: &mut MutexGuard<T>,
+        timeout: Instant,
+    ) -> WaitTimeoutResult {
         self.wait_until_internal(guard_lock(mutex_guard), Some(timeout))
     }
 
     // This is a non-generic function to reduce the monomorphization cost of
     // using `wait_until`.
     fn wait_until_internal(&self, mutex: &RawMutex, timeout: Option<Instant>) -> WaitTimeoutResult {
         unsafe {
             let result;
@@ -280,33 +286,37 @@ impl Condvar {
 
                     // If we were the last thread on the queue then we need to
                     // clear our state. This is normally done by the
                     // notify_{one,all} functions when not timing out.
                     if !requeued && was_last_thread {
                         self.state.store(ptr::null_mut(), Ordering::Relaxed);
                     }
                 };
-                result = parking_lot_core::park(addr,
-                                                validate,
-                                                before_sleep,
-                                                timed_out,
-                                                DEFAULT_PARK_TOKEN,
-                                                timeout);
+                result = parking_lot_core::park(
+                    addr,
+                    validate,
+                    before_sleep,
+                    timed_out,
+                    DEFAULT_PARK_TOKEN,
+                    timeout,
+                );
             }
 
             // Panic if we tried to use multiple mutexes with a Condvar. Note
             // that at this point the MutexGuard is still locked. It will be
             // unlocked by the unwinding logic.
             if bad_mutex {
                 panic!("attempted to use a condition variable with more than one mutex");
             }
 
             // ... and re-lock it once we are done sleeping
-            if result != ParkResult::Unparked(TOKEN_HANDOFF) {
+            if result == ParkResult::Unparked(TOKEN_HANDOFF) {
+                deadlock::acquire_resource(mutex as *const _ as usize);
+            } else {
                 mutex.lock();
             }
 
             WaitTimeoutResult(!(result.is_unparked() || requeued))
         }
     }
 
     /// Waits on this condition variable for a notification, timing out after a
@@ -323,20 +333,21 @@ impl Condvar {
     /// the system time.
     ///
     /// The returned `WaitTimeoutResult` value indicates if the timeout is
     /// known to have elapsed.
     ///
     /// Like `wait`, the lock specified will be re-acquired when this function
     /// returns, regardless of whether the timeout elapsed or not.
     #[inline]
-    pub fn wait_for<T: ?Sized>(&self,
-                               guard: &mut MutexGuard<T>,
-                               timeout: Duration)
-                               -> WaitTimeoutResult {
+    pub fn wait_for<T: ?Sized>(
+        &self,
+        guard: &mut MutexGuard<T>,
+        timeout: Duration,
+    ) -> WaitTimeoutResult {
         self.wait_until(guard, Instant::now() + timeout)
     }
 }
 
 impl Default for Condvar {
     #[inline]
     fn default() -> Condvar {
         Condvar::new()
@@ -437,19 +448,20 @@ mod tests {
 
         let mut g = m.lock();
         let no_timeout = c.wait_until(&mut g, Instant::now() + Duration::from_millis(1));
         assert!(no_timeout.timed_out());
         let _t = thread::spawn(move || {
             let _g = m2.lock();
             c2.notify_one();
         });
-        let timeout_res = c.wait_until(&mut g,
-                                       Instant::now() +
-                                       Duration::from_millis(u32::max_value() as u64));
+        let timeout_res = c.wait_until(
+            &mut g,
+            Instant::now() + Duration::from_millis(u32::max_value() as u64),
+        );
         assert!(!timeout_res.timed_out());
         drop(g);
     }
 
     #[test]
     #[should_panic]
     fn two_mutexes() {
         let m = Arc::new(Mutex::new(()));
new file mode 100644
--- /dev/null
+++ b/third_party/rust/parking_lot/src/deadlock.rs
@@ -0,0 +1,218 @@
+//! [Experimental] Deadlock detection
+//!
+//! This feature is optional and can be enabled via the `deadlock_detection` feature flag.
+//!
+//! # Example
+//!
+//! ```
+//! #[cfg(feature = "deadlock_detection")]
+//! { // only for #[cfg]
+//! use std::thread;
+//! use std::time::Duration;
+//! use parking_lot::deadlock;
+//!
+//! // Create a background thread which checks for deadlocks every 10s
+//! thread::spawn(move || {
+//!     loop {
+//!         thread::sleep(Duration::from_secs(10));
+//!         let deadlocks = deadlock::check_deadlock();
+//!         if deadlocks.is_empty() {
+//!             continue;
+//!         }
+//!
+//!         println!("{} deadlocks detected", deadlocks.len());
+//!         for (i, threads) in deadlocks.iter().enumerate() {
+//!             println!("Deadlock #{}", i);
+//!             for t in threads {
+//!                 println!("Thread Id {:#?}", t.thread_id());
+//!                 println!("{:#?}", t.backtrace());
+//!             }
+//!         }
+//!     }
+//! });
+//! } // only for #[cfg]
+//! ```
+
+#[cfg(feature = "deadlock_detection")]
+pub use parking_lot_core::deadlock::check_deadlock;
+pub(crate) use parking_lot_core::deadlock::{acquire_resource, release_resource};
+
+#[cfg(test)]
+#[cfg(feature = "deadlock_detection")]
+mod tests {
+    use std::thread::{self, sleep};
+    use std::sync::{Arc, Barrier};
+    use std::time::Duration;
+    use {Mutex, ReentrantMutex, RwLock};
+
+    fn check_deadlock() -> bool {
+        use parking_lot_core::deadlock::check_deadlock;
+        !check_deadlock().is_empty()
+    }
+
+    #[test]
+    fn test_mutex_deadlock() {
+        let m1: Arc<Mutex<()>> = Default::default();
+        let m2: Arc<Mutex<()>> = Default::default();
+        let m3: Arc<Mutex<()>> = Default::default();
+        let b = Arc::new(Barrier::new(4));
+
+        let m1_ = m1.clone();
+        let m2_ = m2.clone();
+        let m3_ = m3.clone();
+        let b1 = b.clone();
+        let b2 = b.clone();
+        let b3 = b.clone();
+
+        assert!(!check_deadlock());
+
+        let _t1 = thread::spawn(move || {
+            let _g = m1.lock();
+            b1.wait();
+            let _ = m2_.lock();
+        });
+
+        let _t2 = thread::spawn(move || {
+            let _g = m2.lock();
+            b2.wait();
+            let _ = m3_.lock();
+        });
+
+        let _t3 = thread::spawn(move || {
+            let _g = m3.lock();
+            b3.wait();
+            let _ = m1_.lock();
+        });
+
+        assert!(!check_deadlock());
+
+        b.wait();
+        sleep(Duration::from_millis(50));
+        assert!(check_deadlock());
+
+        assert!(!check_deadlock());
+    }
+
+    #[test]
+    fn test_mutex_deadlock_reentrant() {
+        let m1: Arc<Mutex<()>> = Default::default();
+
+        assert!(!check_deadlock());
+
+        let _t1 = thread::spawn(move || {
+            let _g = m1.lock();
+            let _ = m1.lock();
+        });
+
+        sleep(Duration::from_millis(50));
+        assert!(check_deadlock());
+
+        assert!(!check_deadlock());
+    }
+
+    #[test]
+    fn test_remutex_deadlock() {
+        let m1: Arc<ReentrantMutex<()>> = Default::default();
+        let m2: Arc<ReentrantMutex<()>> = Default::default();
+        let m3: Arc<ReentrantMutex<()>> = Default::default();
+        let b = Arc::new(Barrier::new(4));
+
+        let m1_ = m1.clone();
+        let m2_ = m2.clone();
+        let m3_ = m3.clone();
+        let b1 = b.clone();
+        let b2 = b.clone();
+        let b3 = b.clone();
+
+        assert!(!check_deadlock());
+
+        let _t1 = thread::spawn(move || {
+            let _g = m1.lock();
+            let _g = m1.lock();
+            b1.wait();
+            let _ = m2_.lock();
+        });
+
+        let _t2 = thread::spawn(move || {
+            let _g = m2.lock();
+            let _g = m2.lock();
+            b2.wait();
+            let _ = m3_.lock();
+        });
+
+        let _t3 = thread::spawn(move || {
+            let _g = m3.lock();
+            let _g = m3.lock();
+            b3.wait();
+            let _ = m1_.lock();
+        });
+
+        assert!(!check_deadlock());
+
+        b.wait();
+        sleep(Duration::from_millis(50));
+        assert!(check_deadlock());
+
+        assert!(!check_deadlock());
+    }
+
+    #[test]
+    fn test_rwlock_deadlock() {
+        let m1: Arc<RwLock<()>> = Default::default();
+        let m2: Arc<RwLock<()>> = Default::default();
+        let m3: Arc<RwLock<()>> = Default::default();
+        let b = Arc::new(Barrier::new(4));
+
+        let m1_ = m1.clone();
+        let m2_ = m2.clone();
+        let m3_ = m3.clone();
+        let b1 = b.clone();
+        let b2 = b.clone();
+        let b3 = b.clone();
+
+        assert!(!check_deadlock());
+
+        let _t1 = thread::spawn(move || {
+            let _g = m1.read();
+            b1.wait();
+            let _g = m2_.write();
+        });
+
+        let _t2 = thread::spawn(move || {
+            let _g = m2.read();
+            b2.wait();
+            let _g = m3_.write();
+        });
+
+        let _t3 = thread::spawn(move || {
+            let _g = m3.read();
+            b3.wait();
+            let _ = m1_.write();
+        });
+
+        assert!(!check_deadlock());
+
+        b.wait();
+        sleep(Duration::from_millis(50));
+        assert!(check_deadlock());
+
+        assert!(!check_deadlock());
+    }
+
+    #[test]
+    fn test_rwlock_deadlock_reentrant() {
+        let m1: Arc<RwLock<()>> = Default::default();
+
+        assert!(!check_deadlock());
+
+        let _t1 = thread::spawn(move || {
+            let _g = m1.read();
+            let _ = m1.write();
+        });
+
+        sleep(Duration::from_millis(50));
+        assert!(check_deadlock());
+
+        assert!(!check_deadlock());
+    }
+}
--- a/third_party/rust/parking_lot/src/elision.rs
+++ b/third_party/rust/parking_lot/src/elision.rs
@@ -1,41 +1,42 @@
 // Copyright 2016 Amanieu d'Antras
 //
 // Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
 // http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
 // http://opensource.org/licenses/MIT>, at your option. This file may not be
 // copied, modified, or distributed except according to those terms.
 
-#[cfg(feature = "nightly")]
 use std::sync::atomic::AtomicUsize;
-#[cfg(not(feature = "nightly"))]
-use stable::AtomicUsize;
 
 // Extension trait to add lock elision primitives to atomic types
 pub trait AtomicElisionExt {
     type IntType;
 
     // Perform a compare_exchange and start a transaction
-    fn elision_acquire(&self,
-                       current: Self::IntType,
-                       new: Self::IntType)
-                       -> Result<Self::IntType, Self::IntType>;
+    fn elision_acquire(
+        &self,
+        current: Self::IntType,
+        new: Self::IntType,
+    ) -> Result<Self::IntType, Self::IntType>;
     // Perform a compare_exchange and end a transaction
-    fn elision_release(&self,
-                       current: Self::IntType,
-                       new: Self::IntType)
-                       -> Result<Self::IntType, Self::IntType>;
+    fn elision_release(
+        &self,
+        current: Self::IntType,
+        new: Self::IntType,
+    ) -> Result<Self::IntType, Self::IntType>;
 }
 
 // Indicates whether the target architecture supports lock elision
 #[inline]
 pub fn have_elision() -> bool {
-    cfg!(all(feature = "nightly",
-             any(target_arch = "x86", target_arch = "x86_64")))
+    cfg!(all(
+        feature = "nightly",
+        any(target_arch = "x86", target_arch = "x86_64"),
+    ))
 }
 
 // This implementation is never actually called because it is guarded by
 // have_elision().
 #[cfg(not(all(feature = "nightly", any(target_arch = "x86", target_arch = "x86_64"))))]
 impl AtomicElisionExt for AtomicUsize {
     type IntType = usize;
 
@@ -58,56 +59,111 @@ impl AtomicElisionExt for AtomicUsize {
     fn elision_acquire(&self, current: usize, new: usize) -> Result<usize, usize> {
         unsafe {
             let prev: usize;
             asm!("xacquire; lock; cmpxchgl $2, $1"
                  : "={eax}" (prev), "+*m" (self)
                  : "r" (new), "{eax}" (current)
                  : "memory"
                  : "volatile");
-            if prev == current { Ok(prev) } else { Err(prev) }
+            if prev == current {
+                Ok(prev)
+            } else {
+                Err(prev)
+            }
         }
     }
 
     #[inline]
     fn elision_release(&self, current: usize, new: usize) -> Result<usize, usize> {
         unsafe {
             let prev: usize;
             asm!("xrelease; lock; cmpxchgl $2, $1"
                  : "={eax}" (prev), "+*m" (self)
                  : "r" (new), "{eax}" (current)
                  : "memory"
                  : "volatile");
-            if prev == current { Ok(prev) } else { Err(prev) }
+            if prev == current {
+                Ok(prev)
+            } else {
+                Err(prev)
+            }
         }
     }
 }
 
-#[cfg(all(feature = "nightly", target_arch = "x86_64"))]
+#[cfg(all(feature = "nightly", target_arch = "x86_64", target_pointer_width = "32"))]
+impl AtomicElisionExt for AtomicUsize {
+    type IntType = usize;
+
+    #[inline]
+    fn elision_acquire(&self, current: usize, new: usize) -> Result<usize, usize> {
+        unsafe {
+            let prev: usize;
+            asm!("xacquire; lock; cmpxchgl $2, $1"
+                 : "={rax}" (prev), "+*m" (self)
+                 : "r" (new), "{rax}" (current)
+                 : "memory"
+                 : "volatile");
+            if prev == current {
+                Ok(prev)
+            } else {
+                Err(prev)
+            }
+        }
+    }
+
+    #[inline]
+    fn elision_release(&self, current: usize, new: usize) -> Result<usize, usize> {
+        unsafe {
+            let prev: usize;
+            asm!("xrelease; lock; cmpxchgl $2, $1"
+                 : "={rax}" (prev), "+*m" (self)
+                 : "r" (new), "{rax}" (current)
+                 : "memory"
+                 : "volatile");
+            if prev == current {
+                Ok(prev)
+            } else {
+                Err(prev)
+            }
+        }
+    }
+}
+
+#[cfg(all(feature = "nightly", target_arch = "x86_64", target_pointer_width = "64"))]
 impl AtomicElisionExt for AtomicUsize {
     type IntType = usize;
 
     #[inline]
     fn elision_acquire(&self, current: usize, new: usize) -> Result<usize, usize> {
         unsafe {
             let prev: usize;
             asm!("xacquire; lock; cmpxchgq $2, $1"
                  : "={rax}" (prev), "+*m" (self)
                  : "r" (new), "{rax}" (current)
                  : "memory"
                  : "volatile");
-            if prev == current { Ok(prev) } else { Err(prev) }
+            if prev == current {
+                Ok(prev)
+            } else {
+                Err(prev)
+            }
         }
     }
 
     #[inline]
     fn elision_release(&self, current: usize, new: usize) -> Result<usize, usize> {
         unsafe {
             let prev: usize;
             asm!("xrelease; lock; cmpxchgq $2, $1"
                  : "={rax}" (prev), "+*m" (self)
                  : "r" (new), "{rax}" (current)
                  : "memory"
                  : "volatile");
-            if prev == current { Ok(prev) } else { Err(prev) }
+            if prev == current {
+                Ok(prev)
+            } else {
+                Err(prev)
+            }
         }
     }
 }
--- a/third_party/rust/parking_lot/src/lib.rs
+++ b/third_party/rust/parking_lot/src/lib.rs
@@ -12,40 +12,39 @@
 #![warn(missing_docs)]
 #![cfg_attr(feature = "nightly", feature(const_fn))]
 #![cfg_attr(feature = "nightly", feature(integer_atomics))]
 #![cfg_attr(feature = "nightly", feature(asm))]
 
 #[cfg(feature = "owning_ref")]
 extern crate owning_ref;
 
-#[cfg(not(target_os = "emscripten"))]
-extern crate thread_id;
-
 extern crate parking_lot_core;
 
-#[cfg(not(feature = "nightly"))]
-mod stable;
-
 mod util;
 mod elision;
 mod raw_mutex;
 mod raw_remutex;
 mod raw_rwlock;
 mod condvar;
 mod mutex;
 mod remutex;
 mod rwlock;
 mod once;
 
-pub use once::{Once, ONCE_INIT, OnceState};
+#[cfg(feature = "deadlock_detection")]
+pub mod deadlock;
+#[cfg(not(feature = "deadlock_detection"))]
+mod deadlock;
+
+pub use once::{Once, OnceState, ONCE_INIT};
 pub use mutex::{Mutex, MutexGuard};
 pub use remutex::{ReentrantMutex, ReentrantMutexGuard};
 pub use condvar::{Condvar, WaitTimeoutResult};
-pub use rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard};
+pub use rwlock::{RwLock, RwLockReadGuard, RwLockUpgradableReadGuard, RwLockWriteGuard};
 
 #[cfg(feature = "owning_ref")]
 use owning_ref::OwningRef;
 
 /// Typedef of an owning reference that uses a `MutexGuard` as the owner.
 #[cfg(feature = "owning_ref")]
 pub type MutexGuardRef<'a, T, U = T> = OwningRef<MutexGuard<'a, T>, U>;
 
@@ -55,8 +54,13 @@ pub type ReentrantMutexGuardRef<'a, T, U
 
 /// Typedef of an owning reference that uses a `RwLockReadGuard` as the owner.
 #[cfg(feature = "owning_ref")]
 pub type RwLockReadGuardRef<'a, T, U = T> = OwningRef<RwLockReadGuard<'a, T>, U>;
 
 /// Typedef of an owning reference that uses a `RwLockWriteGuard` as the owner.
 #[cfg(feature = "owning_ref")]
 pub type RwLockWriteGuardRef<'a, T, U = T> = OwningRef<RwLockWriteGuard<'a, T>, U>;
+
+/// Typedef of an owning reference that uses a `RwLockUpgradableReadGuard` as the owner.
+#[cfg(feature = "owning_ref")]
+pub type RwLockUpgradableReadGuardRef<'a, T, U = T> =
+    OwningRef<RwLockUpgradableReadGuard<'a, T>, U>;
--- a/third_party/rust/parking_lot/src/mutex.rs
+++ b/third_party/rust/parking_lot/src/mutex.rs
@@ -45,17 +45,16 @@ use owning_ref::StableAddress;
 /// You can also force a fair unlock by calling `MutexGuard::unlock_fair` when
 /// unlocking a mutex instead of simply dropping the `MutexGuard`.
 ///
 /// # Differences from the standard library `Mutex`
 ///
 /// - No poisoning, the lock is released normally on panic.
 /// - Only requires 1 byte of space, whereas the standard library boxes the
 ///   `Mutex` due to platform limitations.
-/// - A `MutexGuard` can be sent to another thread and unlocked there.
 /// - Can be statically constructed (requires the `const_fn` nightly feature).
 /// - Does not require any drop glue when dropped.
 /// - Inline fast path for the uncontended case.
 /// - Efficient handling of micro-contention using adaptive spinning.
 /// - Allows raw locking & unlocking without a guard.
 /// - Supports eventual fairness so that the mutex is fair on average.
 /// - Optionally allows making the mutex fair by calling `MutexGuard::unlock_fair`.
 ///
@@ -94,30 +93,33 @@ use owning_ref::StableAddress;
 ///
 /// rx.recv().unwrap();
 /// ```
 pub struct Mutex<T: ?Sized> {
     raw: RawMutex,
     data: UnsafeCell<T>,
 }
 
-unsafe impl<T: Send> Send for Mutex<T> {}
-unsafe impl<T: Send> Sync for Mutex<T> {}
+unsafe impl<T: ?Sized + Send> Send for Mutex<T> {}
+unsafe impl<T: ?Sized + Send> Sync for Mutex<T> {}
 
 /// An RAII implementation of a "scoped lock" of a mutex. When this structure is
 /// dropped (falls out of scope), the lock will be unlocked.
 ///
 /// The data protected by the mutex can be accessed through this guard via its
 /// `Deref` and `DerefMut` implementations.
 #[must_use]
 pub struct MutexGuard<'a, T: ?Sized + 'a> {
-    mutex: &'a Mutex<T>,
+    raw: &'a RawMutex,
+    data: *mut T,
     marker: PhantomData<&'a mut T>,
 }
 
+unsafe impl<'a, T: ?Sized + Sync + 'a> Sync for MutexGuard<'a, T> {}
+
 impl<T> Mutex<T> {
     /// Creates a new mutex in an unlocked state ready for use.
     #[cfg(feature = "nightly")]
     #[inline]
     pub const fn new(val: T) -> Mutex<T> {
         Mutex {
             data: UnsafeCell::new(val),
             raw: RawMutex::new(),
@@ -137,82 +139,79 @@ impl<T> Mutex<T> {
     /// Consumes this mutex, returning the underlying data.
     #[inline]
     pub fn into_inner(self) -> T {
         unsafe { self.data.into_inner() }
     }
 }
 
 impl<T: ?Sized> Mutex<T> {
+    #[inline]
+    fn guard(&self) -> MutexGuard<T> {
+        MutexGuard {
+            raw: &self.raw,
+            data: self.data.get(),
+            marker: PhantomData,
+        }
+    }
+
     /// Acquires a mutex, blocking the current thread until it is able to do so.
     ///
     /// This function will block the local thread until it is available to acquire
     /// the mutex. Upon returning, the thread is the only thread with the mutex
     /// held. An RAII guard is returned to allow scoped unlock of the lock. When
     /// the guard goes out of scope, the mutex will be unlocked.
     ///
     /// Attempts to lock a mutex in the thread which already holds the lock will
     /// result in a deadlock.
     #[inline]
     pub fn lock(&self) -> MutexGuard<T> {
         self.raw.lock();
-        MutexGuard {
-            mutex: self,
-            marker: PhantomData,
-        }
+        self.guard()
     }
 
     /// Attempts to acquire this lock.
     ///
     /// If the lock could not be acquired at this time, then `None` is returned.
     /// Otherwise, an RAII guard is returned. The lock will be unlocked when the
     /// guard is dropped.
     ///
     /// This function does not block.
     #[inline]
     pub fn try_lock(&self) -> Option<MutexGuard<T>> {
         if self.raw.try_lock() {
-            Some(MutexGuard {
-                mutex: self,
-                marker: PhantomData,
-            })
+            Some(self.guard())
         } else {
             None
         }
     }
 
     /// Attempts to acquire this lock until a timeout is reached.
     ///
     /// If the lock could not be acquired before the timeout expired, then
     /// `None` is returned. Otherwise, an RAII guard is returned. The lock will
     /// be unlocked when the guard is dropped.
     #[inline]
     pub fn try_lock_for(&self, timeout: Duration) -> Option<MutexGuard<T>> {
         if self.raw.try_lock_for(timeout) {
-            Some(MutexGuard {
-                mutex: self,
-                marker: PhantomData,
-            })
+            Some(self.guard())
         } else {
             None
         }
     }
 
     /// Attempts to acquire this lock until a timeout is reached.
     ///
     /// If the lock could not be acquired before the timeout expired, then
     /// `None` is returned. Otherwise, an RAII guard is returned. The lock will
     /// be unlocked when the guard is dropped.
     #[inline]
     pub fn try_lock_until(&self, timeout: Instant) -> Option<MutexGuard<T>> {
         if self.raw.try_lock_until(timeout) {
-            Some(MutexGuard {
-                mutex: self,
-                marker: PhantomData,
-            })
+            Some(self.guard())
         } else {
             None
         }
     }
 
     /// Returns a mutable reference to the underlying data.
     ///
     /// Since this call borrows the `Mutex` mutably, no actual locking needs to
@@ -295,59 +294,82 @@ impl<'a, T: ?Sized + 'a> MutexGuard<'a, 
     /// context switch on every mutex unlock. This can result in one thread
     /// acquiring a mutex many more times than other threads.
     ///
     /// However in some cases it can be beneficial to ensure fairness by forcing
     /// the lock to pass on to a waiting thread if there is one. This is done by
     /// using this method instead of dropping the `MutexGuard` normally.
     #[inline]
     pub fn unlock_fair(self) {
-        self.mutex.raw.unlock(true);
+        self.raw.unlock(true);
         mem::forget(self);
     }
+
+    /// Make a new `MutexGuard` for a component of the locked data.
+    ///
+    /// This operation cannot fail as the `MutexGuard` passed
+    /// in already locked the mutex.
+    ///
+    /// This is an associated function that needs to be
+    /// used as `MutexGuard::map(...)`. A method would interfere with methods of
+    /// the same name on the contents of the locked data.
+    #[inline]
+    pub fn map<U: ?Sized, F>(orig: Self, f: F) -> MutexGuard<'a, U>
+    where
+        F: FnOnce(&mut T) -> &mut U,
+    {
+        let raw = orig.raw;
+        let data = f(unsafe { &mut *orig.data });
+        mem::forget(orig);
+        MutexGuard {
+            raw,
+            data,
+            marker: PhantomData,
+        }
+    }
 }
 
 impl<'a, T: ?Sized + 'a> Deref for MutexGuard<'a, T> {
     type Target = T;
     #[inline]
     fn deref(&self) -> &T {
-        unsafe { &*self.mutex.data.get() }
+        unsafe { &*self.data }
     }
 }
 
 impl<'a, T: ?Sized + 'a> DerefMut for MutexGuard<'a, T> {
     #[inline]
     fn deref_mut(&mut self) -> &mut T {
-        unsafe { &mut *self.mutex.data.get() }
+        unsafe { &mut *self.data }
     }
 }
 
 impl<'a, T: ?Sized + 'a> Drop for MutexGuard<'a, T> {
     #[inline]
     fn drop(&mut self) {
-        self.mutex.raw.unlock(false);
+        self.raw.unlock(false);
     }
 }
 
 #[cfg(feature = "owning_ref")]
 unsafe impl<'a, T: ?Sized> StableAddress for MutexGuard<'a, T> {}
 
 // Helper function used by Condvar, not publicly exported
 #[inline]
-pub fn guard_lock<'a, T: ?Sized>(guard: &MutexGuard<'a, T>) -> &'a RawMutex {
-    &guard.mutex.raw
+pub(crate) fn guard_lock<'a, T: ?Sized>(guard: &MutexGuard<'a, T>) -> &'a RawMutex {
+    &guard.raw
 }
 
 #[cfg(test)]
 mod tests {
     use std::sync::mpsc::channel;
     use std::sync::Arc;
     use std::sync::atomic::{AtomicUsize, Ordering};
     use std::thread;
-    use {Mutex, Condvar};
+    use {Condvar, Mutex};
 
     struct Packet<T>(Arc<(Mutex<T>, Condvar)>);
 
     #[derive(Eq, PartialEq, Debug)]
     struct NonCopy(i32);
 
     unsafe impl<T: Send> Send for Packet<T> {}
     unsafe impl<T> Sync for Packet<T> {}
@@ -471,28 +493,27 @@ mod tests {
         rx.recv().unwrap();
     }
 
     #[test]
     fn test_mutex_arc_access_in_unwind() {
         let arc = Arc::new(Mutex::new(1));
         let arc2 = arc.clone();
         let _ = thread::spawn(move || -> () {
-                struct Unwinder {
-                    i: Arc<Mutex<i32>>,
+            struct Unwinder {
+                i: Arc<Mutex<i32>>,
+            }
+            impl Drop for Unwinder {
+                fn drop(&mut self) {
+                    *self.i.lock() += 1;
                 }
-                impl Drop for Unwinder {
-                    fn drop(&mut self) {
-                        *self.i.lock() += 1;
-                    }
-                }
-                let _u = Unwinder { i: arc2 };
-                panic!();
-            })
-            .join();
+            }
+            let _u = Unwinder { i: arc2 };
+            panic!();
+        }).join();
         let lock = arc.lock();
         assert_eq!(*lock, 2);
     }
 
     #[test]
     fn test_mutex_unsized() {
         let mutex: &Mutex<[i32]> = &Mutex::new([1, 2, 3]);
         {
@@ -500,15 +521,15 @@ mod tests {
             b[0] = 4;