Merge m-c to inbound, a=merge CLOSED TREE
authorWes Kocher <wkocher@mozilla.com>
Fri, 14 Oct 2016 14:51:44 -0700
changeset 318133 afdefb5fc27ef4ed65f08d881fd46456e8ac7be5
parent 318132 238cebc6be2e93c87133709ae19f28ee23f508b2 (current diff)
parent 318017 de5d73a0568d1c3d50da32169026cc68ee09b1ae (diff)
child 318134 df356e7c537e64562a719abe377a5c8871c5f863
push id30830
push usercbook@mozilla.com
push dateMon, 17 Oct 2016 09:19:24 +0000
treeherdermozilla-central@94b0fddf96b4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone52.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 m-c to inbound, a=merge CLOSED TREE
layout/base/nsDisplayList.cpp
--- a/browser/components/extensions/ext-windows.js
+++ b/browser/components/extensions/ext-windows.js
@@ -155,38 +155,34 @@ extensions.registerSchemaAPI("windows", 
 
         WindowManager.updateGeometry(window, createData);
 
         // TODO: focused, type
 
         return new Promise(resolve => {
           window.addEventListener("load", function listener() {
             window.removeEventListener("load", listener);
-
-            if (createData.state == "maximized" || createData.state == "normal" ||
-                (createData.state == "fullscreen" && AppConstants.platform != "macosx")) {
+            if (["maximized", "normal"].includes(createData.state)) {
               window.document.documentElement.setAttribute("sizemode", createData.state);
-            } else if (createData.state !== null) {
-              // window.minimize() has no effect until the window has been shown.
-              return promiseObserved("document-shown", doc => doc == window.document).then(() => {
-                WindowManager.setState(window, createData.state);
-                resolve();
-              });
             }
-            resolve();
+            resolve(promiseObserved("browser-delayed-startup-finished", win => win == window));
           });
         }).then(() => {
+          // Some states only work after delayed-startup-finished
+          if (["minimized", "fullscreen", "docked"].includes(createData.state)) {
+            WindowManager.setState(window, createData.state);
+          }
           if (allowScriptsToClose) {
             for (let {linkedBrowser} of window.gBrowser.tabs) {
               onXULFrameLoaderCreated({target: linkedBrowser});
               linkedBrowser.addEventListener( // eslint-disable-line mozilla/balanced-listeners
                                              "XULFrameLoaderCreated", onXULFrameLoaderCreated);
             }
           }
-          return WindowManager.convert(extension, window);
+          return WindowManager.convert(extension, window, {populate: true});
         });
       },
 
       update: function(windowId, updateInfo) {
         if (updateInfo.state !== null && updateInfo.state != "normal") {
           if (updateInfo.left !== null || updateInfo.top !== null ||
               updateInfo.width !== null || updateInfo.height !== null) {
             return Promise.reject({message: `"state": "${updateInfo.state}" may not be combined with "left", "top", "width", or "height"`});
--- a/browser/components/extensions/test/browser/browser_ext_windows_create.js
+++ b/browser/components/extensions/test/browser/browser_ext_windows_create.js
@@ -30,16 +30,17 @@ add_task(function* testWindowCreate() {
               // "maximized" states.
               browser.test.assertTrue(window.state == "normal" || window.state == "maximized",
                                       `Expected window.state (currently ${window.state}) to be "normal" but will accept "maximized"`);
             } else {
               browser.test.assertEq(params[key], window[key], `Got expected value for window.${key}`);
             }
           }
 
+          browser.test.assertEq(1, window.tabs.length, "tabs property got populated");
           return checkWindow(expected).then(() => {
             if (keep) {
               return window;
             }
             if (params.state == "fullscreen" && os == "win") {
               // FIXME: Closing a fullscreen window causes a window leak in
               // Windows tests.
               return browser.windows.update(window.id, {state: "normal"}).then(() => {
--- a/browser/components/extensions/test/browser/browser_ext_windows_create_tabId.js
+++ b/browser/components/extensions/test/browser/browser_ext_windows_create_tabId.js
@@ -19,35 +19,37 @@ add_task(function* testWindowCreate() {
           if (changeInfo.url === expected) {
             browser.tabs.onUpdated.removeListener(listener);
             resolve();
           }
         });
       });
     };
 
-    let windowId;
+    let windowId, tabId;
     browser.windows.getCurrent().then(window => {
       windowId = window.id;
 
       browser.test.log("Create additional tab in window 1");
       return browser.tabs.create({windowId, url: "about:blank"});
     }).then(tab => {
+      tabId = tab.id;
       browser.test.log("Create a new window, adopting the new tab");
 
       // Note that we want to check against actual boolean values for
       // all of the `incognito` property tests.
       browser.test.assertEq(false, tab.incognito, "Tab is not private");
 
       return Promise.all([
         promiseTabAttached(),
-        browser.windows.create({tabId: tab.id}),
+        browser.windows.create({tabId: tabId}),
       ]);
     }).then(([, window]) => {
       browser.test.assertEq(false, window.incognito, "New window is not private");
+      browser.test.assertEq(tabId, window.tabs[0].id, "tabs property populated correctly");
 
       browser.test.log("Close the new window");
       return browser.windows.remove(window.id);
     }).then(() => {
       browser.test.log("Create a new private window");
 
       return browser.windows.create({incognito: true});
     }).then(privateWindow => {
@@ -108,16 +110,20 @@ add_task(function* testWindowCreate() {
                                   "Create call failed as expected");
         }
       );
     }).then(() => {
       browser.test.log("Try to create a window with two URLs");
 
       return browser.windows.create({url: ["http://example.com/", "http://example.org/"]});
     }).then(window => {
+      browser.test.assertEq(2, window.tabs.length, "2 tabs were opened in new window");
+      browser.test.assertEq("about:blank", window.tabs[0].url, "about:blank, page not loaded yet");
+      browser.test.assertEq("about:blank", window.tabs[1].url, "about:blank, page not loaded yet");
+
       return Promise.all([
         promiseTabUpdated("http://example.com/"),
         promiseTabUpdated("http://example.org/"),
         Promise.resolve(window),
       ]);
     }).then(([, , window]) => {
       return browser.windows.get(window.id, {populate: true});
     }).then(window => {
@@ -140,9 +146,8 @@ add_task(function* testWindowCreate() {
 
     background,
   });
 
   yield extension.startup();
   yield extension.awaitFinish("window-create");
   yield extension.unload();
 });
-
--- a/devtools/client/debugger/debugger-view.js
+++ b/devtools/client/debugger/debugger-view.js
@@ -447,17 +447,17 @@ var DebuggerView = {
    */
   _setEditorMode: function (aUrl, aContentType = "", aTextContent = "") {
     // Use JS mode for files with .js and .jsm extensions.
     if (SourceUtils.isJavaScript(aUrl, aContentType)) {
       return void this.editor.setMode(Editor.modes.js);
     }
 
     if (aContentType === "text/wasm") {
-      return void this.editor.setMode(Editor.modes.wasm);
+      return void this.editor.setMode(Editor.modes.text);
     }
 
     // Use HTML mode for files in which the first non whitespace character is
     // &lt;, regardless of extension.
     if (aTextContent.match(/^\s*</)) {
       return void this.editor.setMode(Editor.modes.html);
     }
 
--- a/devtools/client/locales/en-US/netmonitor.properties
+++ b/devtools/client/locales/en-US/netmonitor.properties
@@ -300,8 +300,56 @@ netRequest.cookies=Cookies
 # LOCALIZATION NOTE (netRequest.params): A label used for URL parameters tab
 # This tab displays data parsed from URL query string.
 netRequest.params=Params
 
 # LOCALIZATION NOTE (netRequest.callstack): A label used for request stacktrace tab
 # This tab displays the request's JavaScript stack trace. Should be identical to
 # debuggerUI.tabs.callstack
 netRequest.callstack=Call Stack
+
+# LOCALIZATION NOTE (certmgr.subjectinfo.label):
+# A label used for a certificate section in security tab.
+# This section displays Name and organization who has been assigned the fingerprints
+certmgr.subjectinfo.label=Issued To
+
+# LOCALIZATION NOTE (certmgr.certdetail.cn):
+# A label used for Issued To and Issued By sub-section in security tab
+certmgr.certdetail.cn=Common Name (CN):
+
+# LOCALIZATION NOTE (certmgr.certdetail.o):
+# A label used for Issued To and Issued By sub-section in security tab
+certmgr.certdetail.o=Organization (O):
+
+# LOCALIZATION NOTE (certmgr.certdetail.ou):
+# A label used for Issued To and Issued By sub-section in security tab
+certmgr.certdetail.ou=Organizational Unit (OU):
+
+# LOCALIZATION NOTE (certmgr.issuerinfo.label):
+# A label used for a certificate section in security tab
+# This section displays Name and organization who issued the fingerprints
+certmgr.issuerinfo.label=Issued By
+
+# LOCALIZATION NOTE (certmgr.periodofvalidity.label):
+# A label used for a certificate section in security tab
+# This section displays the valide period of this fingerprints
+certmgr.periodofvalidity.label=Period of Validity
+
+# LOCALIZATION NOTE (certmgr.certdetail.cn):
+# A label used for Period of Validity sub-section in security tab
+certmgr.begins=Begins On:
+
+# LOCALIZATION NOTE (certmgr.certdetail.cn):
+# A label used for Period of Validity sub-section in security tab
+certmgr.expires=Expires On:
+
+# LOCALIZATION NOTE (certmgr.fingerprints.label):
+# A label used for a certificate section in security tab
+# This section displays the valide period of this fingerprints
+certmgr.fingerprints.label=Fingerprints
+
+# LOCALIZATION NOTE (certmgr.certdetail.sha256fingerprint):
+# A label used for Fingerprints sub-section in security tab
+certmgr.certdetail.sha256fingerprint=SHA-256 Fingerprint:
+
+# LOCALIZATION NOTE (certmgr.certdetail.sha1fingerprint):
+# A label used for Fingerprints sub-section in security tab
+certmgr.certdetail.sha1fingerprint=SHA1 Fingerprint:
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/.eslintrc
@@ -0,0 +1,12 @@
+{
+  // Extend from the devtools eslintrc.
+  "extends": "../../.eslintrc",
+
+  "rules": {
+    // The netmonitor is being migrated to HTML and cleaned of
+    // chrome-privileged code, so this rule disallows requiring chrome
+    // code. Some files in the netmonitor disable this rule still. The
+    // goal is to enable the rule globally on all files.
+    "mozilla/reject-some-requires": [2, "^(chrome|chrome:.*|resource:.*|devtools/server/.*|.*\\.jsm|devtools/shared/platform/(chome|content)/.*)$"],
+  },
+}
--- a/devtools/client/netmonitor/har/har-automation.js
+++ b/devtools/client/netmonitor/har/har-automation.js
@@ -1,13 +1,13 @@
 /* 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";
-
+/* eslint-disable mozilla/reject-some-requires */
 const { Ci } = require("chrome");
 const { Class } = require("sdk/core/heritage");
 const { resolve } = require("promise");
 const Services = require("Services");
 
 loader.lazyRequireGetter(this, "HarCollector", "devtools/client/netmonitor/har/har-collector", true);
 loader.lazyRequireGetter(this, "HarExporter", "devtools/client/netmonitor/har/har-exporter", true);
 loader.lazyRequireGetter(this, "HarUtils", "devtools/client/netmonitor/har/har-utils", true);
--- a/devtools/client/netmonitor/har/har-exporter.js
+++ b/devtools/client/netmonitor/har/har-exporter.js
@@ -1,16 +1,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
-
+/* eslint-disable mozilla/reject-some-requires */
 const { Cc, Ci } = require("chrome");
 const Services = require("Services");
+/* eslint-disable mozilla/reject-some-requires */
 const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
 const { resolve } = require("promise");
 const { HarUtils } = require("./har-utils.js");
 const { HarBuilder } = require("./har-builder.js");
 
 XPCOMUtils.defineLazyGetter(this, "clipboardHelper", function () {
   return Cc["@mozilla.org/widget/clipboardhelper;1"]
     .getService(Ci.nsIClipboardHelper);
--- a/devtools/client/netmonitor/har/har-utils.js
+++ b/devtools/client/netmonitor/har/har-utils.js
@@ -1,15 +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/. */
 
 "use strict";
-
+/* eslint-disable mozilla/reject-some-requires */
 const { Ci, Cc, CC } = require("chrome");
+/* eslint-disable mozilla/reject-some-requires */
 const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
 
 XPCOMUtils.defineLazyGetter(this, "dirService", function () {
   return Cc["@mozilla.org/file/directory_service;1"]
     .getService(Ci.nsIProperties);
 });
 
 XPCOMUtils.defineLazyGetter(this, "ZipWriter", function () {
--- a/devtools/client/netmonitor/netmonitor-controller.js
+++ b/devtools/client/netmonitor/netmonitor-controller.js
@@ -30,16 +30,17 @@ var BrowserLoaderModule = {};
 Cu.import("resource://devtools/client/shared/browser-loader.js", BrowserLoaderModule);
 var { loader, require } = BrowserLoaderModule.BrowserLoader({
   baseURI: "resource://devtools/client/netmonitor/",
   window
 });
 
 const promise = require("promise");
 const Services = require("Services");
+/* eslint-disable mozilla/reject-some-requires */
 const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
 const EventEmitter = require("devtools/shared/event-emitter");
 const Editor = require("devtools/client/sourceeditor/editor");
 const {TimelineFront} = require("devtools/shared/fronts/timeline");
 const {Task} = require("devtools/shared/task");
 const {Prefs} = require("./prefs");
 const {EVENTS} = require("./events");
 
--- a/devtools/client/netmonitor/netmonitor-view.js
+++ b/devtools/client/netmonitor/netmonitor-view.js
@@ -7,17 +7,19 @@
 /* globals Prefs, gNetwork, setInterval, setTimeout, clearInterval, clearTimeout, btoa */
 /* exported $, $all */
 "use strict";
 
 XPCOMUtils.defineLazyGetter(this, "NetworkHelper", function () {
   return require("devtools/shared/webconsole/network-helper");
 });
 
+/* eslint-disable mozilla/reject-some-requires */
 const {VariablesView} = require("resource://devtools/client/shared/widgets/VariablesView.jsm");
+/* eslint-disable mozilla/reject-some-requires */
 const {VariablesViewController} = require("resource://devtools/client/shared/widgets/VariablesViewController.jsm");
 const {ToolSidebar} = require("devtools/client/framework/sidebar");
 const {testing: isTesting} = require("devtools/shared/flags");
 const {ViewHelpers, Heritage} = require("devtools/client/shared/widgets/view-helpers");
 const {PluralForm} = require("devtools/shared/plural-form");
 const {Filters} = require("./filter-predicates");
 const {getFormDataSections,
        formDataURI,
--- a/devtools/client/netmonitor/netmonitor.xul
+++ b/devtools/client/netmonitor/netmonitor.xul
@@ -4,18 +4,16 @@
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
 <?xml-stylesheet href="chrome://devtools/content/shared/widgets/widgets.css" type="text/css"?>
 <?xml-stylesheet href="chrome://devtools/skin/widgets.css" type="text/css"?>
 <?xml-stylesheet href="chrome://devtools/skin/netmonitor.css" type="text/css"?>
 <!DOCTYPE window [
   <!ENTITY % netmonitorDTD SYSTEM "chrome://devtools/locale/netmonitor.dtd">
   %netmonitorDTD;
-  <!ENTITY % certManagerDTD SYSTEM "chrome://pippki/locale/certManager.dtd">
-  %certManagerDTD;
 ]>
 
 <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
         xmlns:html="http://www.w3.org/1999/xhtml">
 
   <script type="application/javascript;version=1.8"
           src="chrome://devtools/content/shared/theme-switching.js"/>
   <script type="text/javascript" src="netmonitor-controller.js"/>
@@ -83,17 +81,20 @@
 
   <keyset>
     <key id="freeTextFilterKey"
          key="&netmonitorUI.footer.filterFreetext.key;"
          modifiers="accel"
          command="freeTextFilterCommand"/>
   </keyset>
 
-  <deck id="body" class="theme-sidebar" flex="1">
+  <deck id="body"
+        class="theme-sidebar"
+        data-localization-bundle="devtools/locale/netmonitor.properties"
+        flex="1">
 
     <vbox id="network-inspector-view" flex="1">
       <hbox id="netmonitor-toolbar" class="devtools-toolbar">
         <toolbarbutton id="requests-menu-clear-button"
                        class="devtools-toolbarbutton devtools-clear-icon"
                        tooltiptext="&netmonitorUI.footer.clear;"/>
         <hbox id="requests-menu-filter-buttons">
           <button id="requests-menu-filter-all-button"
@@ -715,122 +716,125 @@
                     </vbox>
                     <vbox id="security-info-certificate"
                           class="tabpanel-summary-container">
                         <label class="plain tabpanel-summary-label"
                                value="&netmonitorUI.security.certificate;"/>
                       <vbox class="security-info-section">
                         <vbox class="tabpanel-summary-container">
                           <label class="plain tabpanel-summary-label"
-                                 value="&certmgr.subjectinfo.label;" flex="1"/>
+                                 data-localization="content=certmgr.subjectinfo.label" flex="1"/>
                         </vbox>
                         <vbox class="security-info-section">
                           <hbox class="tabpanel-summary-container"
                                 align="baseline">
                             <label class="plain tabpanel-summary-label"
-                                   value="&certmgr.certdetail.cn;:"/>
+                                   data-localization="content=certmgr.certdetail.cn"/>
                             <textbox id="security-cert-subject-cn"
                                      class="plain tabpanel-summary-value devtools-monospace cropped-textbox"
                                      flex="1"
                                      readonly="true"/>
                           </hbox>
                           <hbox class="tabpanel-summary-container"
                                 align="baseline">
                             <label class="plain tabpanel-summary-label"
-                                   value="&certmgr.certdetail.o;:"/>
+                                   data-localization="content=certmgr.certdetail.o"/>
                             <textbox id="security-cert-subject-o"
                                      class="plain tabpanel-summary-value devtools-monospace cropped-textbox"
                                      flex="1"
                                      readonly="true"/>
                           </hbox>
                           <hbox class="tabpanel-summary-container"
                                 align="baseline">
                             <label class="plain tabpanel-summary-label"
-                                   value="&certmgr.certdetail.ou;:"/>
+                                   data-localization="content=certmgr.certdetail.ou"/>
                             <textbox id="security-cert-subject-ou"
                                      class="plain tabpanel-summary-value devtools-monospace cropped-textbox"
                                      flex="1"
                                      readonly="true"/>
                           </hbox>
                         </vbox>
                         <vbox class="tabpanel-summary-container">
                           <label class="plain tabpanel-summary-label"
-                                 value="&certmgr.issuerinfo.label;" flex="1"/>
+                                 data-localization="content=certmgr.issuerinfo.label"
+                                 flex="1"/>
                         </vbox>
                         <vbox class="security-info-section">
                           <hbox class="tabpanel-summary-container"
                                 align="baseline">
                             <label class="plain tabpanel-summary-label"
-                                   value="&certmgr.certdetail.cn;:"/>
+                                   data-localization="content=certmgr.certdetail.cn"/>
                             <textbox id="security-cert-issuer-cn"
                                      class="plain tabpanel-summary-value devtools-monospace cropped-textbox"
                                      flex="1"
                                      readonly="true"/>
                           </hbox>
                           <hbox class="tabpanel-summary-container"
                                 align="baseline">
                             <label class="plain tabpanel-summary-label"
-                                   value="&certmgr.certdetail.o;:"/>
+                                   data-localization="content=certmgr.certdetail.o"/>
                             <textbox id="security-cert-issuer-o"
                                      class="plain tabpanel-summary-value devtools-monospace cropped-textbox"
                                      flex="1"
                                      readonly="true"/>
                           </hbox>
                           <hbox class="tabpanel-summary-container"
                                 align="baseline">
                             <label class="plain tabpanel-summary-label"
-                                   value="&certmgr.certdetail.ou;:"/>
+                                   data-localization="content=certmgr.certdetail.ou"/>
                             <textbox id="security-cert-issuer-ou"
                                      class="plain tabpanel-summary-value devtools-monospace cropped-textbox"
                                      flex="1"
                                      readonly="true"/>
                           </hbox>
                         </vbox>
                         <vbox class="tabpanel-summary-container">
                           <label class="plain tabpanel-summary-label"
-                                 value="&certmgr.periodofvalidity.label;" flex="1"/>
+                                 data-localization="content=certmgr.periodofvalidity.label"
+                                 flex="1"/>
                         </vbox>
                         <vbox class="security-info-section">
                           <hbox class="tabpanel-summary-container"
                                 align="baseline">
                             <label class="plain tabpanel-summary-label"
-                                   value="&certmgr.begins;:"/>
+                                   data-localization="content=certmgr.begins"/>
                             <textbox id="security-cert-validity-begins"
                                      class="plain tabpanel-summary-value devtools-monospace cropped-textbox"
                                      flex="1"
                                      readonly="true"/>
                           </hbox>
                           <hbox class="tabpanel-summary-container"
                                 align="baseline">
                             <label class="plain tabpanel-summary-label"
-                                   value="&certmgr.expires;:"/>
+                                   data-localization="content=certmgr.expires"/>
                             <textbox id="security-cert-validity-expires"
                                      class="plain tabpanel-summary-value devtools-monospace cropped-textbox"
                                      flex="1"
                                      readonly="true"/>
                           </hbox>
                         </vbox>
                         <vbox class="tabpanel-summary-container">
                           <label class="plain tabpanel-summary-label"
-                                 value="&certmgr.fingerprints.label;" flex="1"/>
+                                 data-localization="content=certmgr.fingerprints.label"
+                                 flex="1"/>
                         </vbox>
                         <vbox class="security-info-section">
                           <hbox class="tabpanel-summary-container"
                                 align="baseline">
                             <label class="plain tabpanel-summary-label"
-                                   value="&certmgr.certdetail.sha256fingerprint;:"/>
+                                   data-localization="content=certmgr.certdetail.sha256fingerprint"/>
                             <textbox id="security-cert-sha256-fingerprint"
                                      class="plain tabpanel-summary-value devtools-monospace cropped-textbox"
                                      flex="1"
                                      readonly="true"/>
                           </hbox>
                           <hbox class="tabpanel-summary-container"
                                 align="baseline">
                             <label class="plain tabpanel-summary-label"
-                                   value="&certmgr.certdetail.sha1fingerprint;:"/>
+                                   data-localization="content=certmgr.certdetail.sha1fingerprint"/>
                             <textbox id="security-cert-sha1-fingerprint"
                                      class="plain tabpanel-summary-value devtools-monospace cropped-textbox"
                                      flex="1"
                                      readonly="true"/>
                           </hbox>
                         </vbox>
                       </vbox>
                     </vbox>
--- a/devtools/client/netmonitor/panel.js
+++ b/devtools/client/netmonitor/panel.js
@@ -3,19 +3,21 @@
 /* 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 promise = require("promise");
 const EventEmitter = require("devtools/shared/event-emitter");
 const { Task } = require("devtools/shared/task");
+const { localizeMarkup } = require("devtools/shared/l10n");
 
 function NetMonitorPanel(iframeWindow, toolbox) {
   this.panelWin = iframeWindow;
+  this.panelDoc = iframeWindow.document;
   this._toolbox = toolbox;
 
   this._view = this.panelWin.NetMonitorView;
   this._controller = this.panelWin.NetMonitorController;
   this._controller._target = this.target;
   this._controller._toolbox = this._toolbox;
 
   EventEmitter.decorate(this);
@@ -29,16 +31,19 @@ NetMonitorPanel.prototype = {
    *
    * @return object
    *         A promise that is resolved when the NetMonitor completes opening.
    */
   open: Task.async(function* () {
     if (this._opening) {
       return this._opening;
     }
+    // Localize all the nodes containing a data-localization attribute.
+    localizeMarkup(this.panelDoc);
+
     let deferred = promise.defer();
     this._opening = deferred.promise;
 
     // Local monitoring needs to make the target remote.
     if (!this.target.isRemote) {
       yield this.target.makeRemote();
     }
 
--- a/devtools/client/netmonitor/request-utils.js
+++ b/devtools/client/netmonitor/request-utils.js
@@ -1,10 +1,10 @@
 "use strict";
-
+/* eslint-disable mozilla/reject-some-requires */
 const { Ci } = require("chrome");
 const { KeyCodes } = require("devtools/client/shared/keycodes");
 const { Task } = require("devtools/shared/task");
 const NetworkHelper = require("devtools/shared/webconsole/network-helper");
 
 /**
  * Helper method to get a wrapped function which can be bound to as
  * an event listener directly and is executed only when data-key is
--- a/devtools/client/netmonitor/requests-menu-view.js
+++ b/devtools/client/netmonitor/requests-menu-view.js
@@ -1,16 +1,17 @@
 /* globals document, window, dumpn, $, $all, gNetwork, EVENTS, Prefs,
            NetMonitorController, NetMonitorView */
 "use strict";
-
+/* eslint-disable mozilla/reject-some-requires */
 const { Cc, Ci, Cu } = require("chrome");
 const Services = require("Services");
 const {Task} = require("devtools/shared/task");
 const {DeferredTask} = Cu.import("resource://gre/modules/DeferredTask.jsm", {});
+/* eslint-disable mozilla/reject-some-requires */
 const {SideMenuWidget} = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
 const {HTMLTooltip} = require("devtools/client/shared/widgets/tooltip/HTMLTooltip");
 const {setImageTooltip, getImageDimensions} =
   require("devtools/client/shared/widgets/tooltip/ImageTooltipHelper");
 const {Heritage, WidgetMethods, setNamedTimeout} =
   require("devtools/client/shared/widgets/view-helpers");
 const {gDevTools} = require("devtools/client/framework/devtools");
 const {Curl, CurlUtils} = require("devtools/client/shared/curl");
--- a/dom/animation/Animation.cpp
+++ b/dom/animation/Animation.cpp
@@ -659,22 +659,32 @@ Animation::GetCurrentOrPendingStartTime(
     return result;
   }
 
   if (mPendingReadyTime.IsNull() || mHoldTime.IsNull()) {
     return result;
   }
 
   // Calculate the equivalent start time from the pending ready time.
-  // This is the same as the calculation performed in ResumeAt and will
-  // need to incorporate the playbackRate when implemented (bug 1127380).
-  result.SetValue(mPendingReadyTime.Value() - mHoldTime.Value());
+  result = StartTimeFromReadyTime(mPendingReadyTime.Value());
+
   return result;
 }
 
+TimeDuration
+Animation::StartTimeFromReadyTime(const TimeDuration& aReadyTime) const
+{
+  MOZ_ASSERT(!mHoldTime.IsNull(), "Hold time should be set in order to"
+                                  " convert a ready time to a start time");
+  if (mPlaybackRate == 0) {
+    return aReadyTime;
+  }
+  return aReadyTime - mHoldTime.Value().MultDouble(1 / mPlaybackRate);
+}
+
 TimeStamp
 Animation::AnimationTimeToTimeStamp(const StickyTimeDuration& aTime) const
 {
   // Initializes to null. Return the same object every time to benefit from
   // return-value-optimization.
   TimeStamp result;
 
   // We *don't* check for mTimeline->TracksWallclockTime() here because that
@@ -1061,22 +1071,19 @@ Animation::ResumeAt(const TimeDuration& 
              "Expected to resume a play-pending animation");
   MOZ_ASSERT(mHoldTime.IsNull() != mStartTime.IsNull(),
              "An animation in the play-pending state should have either a"
              " resolved hold time or resolved start time (but not both)");
 
   // If we aborted a pending pause operation we will already have a start time
   // we should use. In all other cases, we resolve it from the ready time.
   if (mStartTime.IsNull()) {
+    mStartTime = StartTimeFromReadyTime(aReadyTime);
     if (mPlaybackRate != 0) {
-      mStartTime.SetValue(aReadyTime -
-                          (mHoldTime.Value().MultDouble(1 / mPlaybackRate)));
       mHoldTime.SetNull();
-    } else {
-      mStartTime.SetValue(aReadyTime);
     }
   }
   mPendingState = PendingState::NotPending;
 
   UpdateTiming(SeekFlag::NoSeek, SyncNotifyFlag::Async);
 
   if (mReady) {
     mReady->MaybeResolve(this);
--- a/dom/animation/Animation.h
+++ b/dom/animation/Animation.h
@@ -235,59 +235,63 @@ public:
    *
    * This method returns the start time, if resolved. Otherwise, if we have
    * a pending ready time, it returns the corresponding start time. If neither
    * of those are available, it returns null.
    */
   Nullable<TimeDuration> GetCurrentOrPendingStartTime() const;
 
   /**
+   * Calculates the corresponding start time to use for an animation that is
+   * currently pending with current time |mHoldTime| but should behave
+   * as if it began or resumed playback at timeline time |aReadyTime|.
+   */
+  TimeDuration StartTimeFromReadyTime(const TimeDuration& aReadyTime) const;
+
+  /**
    * Converts a time in the timescale of this Animation's currentTime, to a
    * TimeStamp. Returns a null TimeStamp if the conversion cannot be performed
    * because of the current state of this Animation (e.g. it has no timeline, a
    * zero playbackRate, an unresolved start time etc.) or the value of the time
    * passed-in (e.g. an infinite time).
    */
   TimeStamp AnimationTimeToTimeStamp(const StickyTimeDuration& aTime) const;
 
   bool IsPausedOrPausing() const
   {
     return PlayState() == AnimationPlayState::Paused ||
            mPendingState == PendingState::PausePending;
   }
 
-  bool HasInPlayEffect() const
-  {
-    return GetEffect() && GetEffect()->IsInPlay();
-  }
   bool HasCurrentEffect() const
   {
     return GetEffect() && GetEffect()->IsCurrent();
   }
   bool IsInEffect() const
   {
     return GetEffect() && GetEffect()->IsInEffect();
   }
 
   /**
-   * "Playing" is different to "running". An animation in its delay phase is
-   * still running but we only consider it playing when it is in its active
-   * interval. This definition is used for fetching the animations that are
-   * candidates for running on the compositor (since we don't ship animations
-   * to the compositor when they are in their delay phase or paused including
-   * being effectively paused due to having a zero playback rate).
+   * Returns true if this animation's playback state makes it a candidate for
+   * running on the compositor.
+   * We send animations to the compositor when their target effect is 'current'
+   * (a definition that is roughly equivalent to when they are in their before
+   * or active phase). However, we don't send animations to the compositor when
+   * they are paused/pausing (including being effectively paused due to
+   * having a zero playback rate), have a zero-duration active interval, or have
+   * no target effect at all.
    */
-  bool IsPlaying() const
+  bool IsPlayableOnCompositor() const
   {
-    // We need to have an effect in its active interval, and
-    // be either running or waiting to run with a non-zero playback rate.
-    return HasInPlayEffect() &&
+    return HasCurrentEffect() &&
            mPlaybackRate != 0.0 &&
            (PlayState() == AnimationPlayState::Running ||
-            mPendingState == PendingState::PlayPending);
+            mPendingState == PendingState::PlayPending) &&
+           !GetEffect()->IsActiveDurationZero();
   }
   bool IsRelevant() const { return mIsRelevant; }
   void UpdateRelevance();
 
   /**
    * Returns true if this Animation has a lower composite order than aOther.
    */
   bool HasLowerCompositeOrderThan(const Animation& aOther) const;
--- a/dom/animation/AnimationEffectReadOnly.cpp
+++ b/dom/animation/AnimationEffectReadOnly.cpp
@@ -39,27 +39,16 @@ NS_INTERFACE_MAP_END
 AnimationEffectReadOnly::AnimationEffectReadOnly(
   nsIDocument* aDocument, AnimationEffectTimingReadOnly* aTiming)
   : mDocument(aDocument)
   , mTiming(aTiming)
 {
   MOZ_ASSERT(aTiming);
 }
 
-// https://w3c.github.io/web-animations/#in-play
-bool
-AnimationEffectReadOnly::IsInPlay() const
-{
-  if (!mAnimation || mAnimation->PlayState() == AnimationPlayState::Finished) {
-    return false;
-  }
-
-  return GetComputedTiming().mPhase == ComputedTiming::AnimationPhase::Active;
-}
-
 // https://w3c.github.io/web-animations/#current
 bool
 AnimationEffectReadOnly::IsCurrent() const
 {
   if (!mAnimation || mAnimation->PlayState() == AnimationPlayState::Finished) {
     return false;
   }
 
--- a/dom/animation/AnimationEffectReadOnly.h
+++ b/dom/animation/AnimationEffectReadOnly.h
@@ -44,19 +44,22 @@ public:
   virtual ElementPropertyTransition* AsTransition() { return nullptr; }
   virtual const ElementPropertyTransition* AsTransition() const
   {
     return nullptr;
   }
 
   nsISupports* GetParentObject() const { return mDocument; }
 
-  bool IsInPlay() const;
   bool IsCurrent() const;
   bool IsInEffect() const;
+  bool IsActiveDurationZero() const
+  {
+    return SpecifiedTiming().ActiveDuration() == StickyTimeDuration();
+  }
 
   already_AddRefed<AnimationEffectTimingReadOnly> Timing();
   const TimingParams& SpecifiedTiming() const
   {
     return mTiming->AsTimingParams();
   }
   void SetSpecifiedTiming(const TimingParams& aTiming);
 
--- a/dom/animation/EffectCompositor.cpp
+++ b/dom/animation/EffectCompositor.cpp
@@ -126,17 +126,17 @@ FindAnimationsForCompositor(const nsIFra
     content = content->GetParent();
   }
 
   bool foundSome = false;
   for (KeyframeEffectReadOnly* effect : *effects) {
     MOZ_ASSERT(effect && effect->GetAnimation());
     Animation* animation = effect->GetAnimation();
 
-    if (!animation->IsPlaying()) {
+    if (!animation->IsPlayableOnCompositor()) {
       continue;
     }
 
     AnimationPerformanceWarning::Type warningType;
     if (aProperty == eCSSProperty_transform &&
         effect->ShouldBlockAsyncTransformAnimations(aFrame,
                                                     warningType)) {
       if (aMatches) {
--- a/dom/animation/KeyframeEffectReadOnly.cpp
+++ b/dom/animation/KeyframeEffectReadOnly.cpp
@@ -190,20 +190,16 @@ KeyframeEffectReadOnly::SetKeyframes(nsT
     MaybeUpdateFrameForCompositor();
   }
 }
 
 const AnimationProperty*
 KeyframeEffectReadOnly::GetEffectiveAnimationOfProperty(
   nsCSSPropertyID aProperty) const
 {
-  if (!IsInEffect()) {
-    return nullptr;
-  }
-
   EffectSet* effectSet =
     EffectSet::GetEffectSet(mTarget->mElement, mTarget->mPseudoType);
   for (size_t propIdx = 0, propEnd = mProperties.Length();
        propIdx != propEnd; ++propIdx) {
     if (aProperty == mProperties[propIdx].mProperty) {
       const AnimationProperty* result = &mProperties[propIdx];
       // Skip if there is a property of animation level that is overridden
       // by !important rules.
@@ -1133,27 +1129,21 @@ KeyframeEffectReadOnly::CanAnimateTransf
   return true;
 }
 
 bool
 KeyframeEffectReadOnly::ShouldBlockAsyncTransformAnimations(
   const nsIFrame* aFrame,
   AnimationPerformanceWarning::Type& aPerformanceWarning) const
 {
-  // We currently only expect this method to be called when this effect
-  // is attached to a playing Animation. If that ever changes we'll need
-  // to update this to only return true when that is the case since paused,
-  // filling, cancelled Animations etc. shouldn't stop other Animations from
+  // We currently only expect this method to be called for effects whose
+  // animations are eligible for the compositor since, Animations that are
+  // paused, zero-duration, finished etc. should not block other animations from
   // running on the compositor.
-  MOZ_ASSERT(mAnimation && mAnimation->IsPlaying());
-
-  // Should not block other animations if this effect is not in-effect.
-  if (!IsInEffect()) {
-    return false;
-  }
+  MOZ_ASSERT(mAnimation && mAnimation->IsPlayableOnCompositor());
 
   EffectSet* effectSet =
     EffectSet::GetEffectSet(mTarget->mElement, mTarget->mPseudoType);
   for (const AnimationProperty& property : mProperties) {
     // If there is a property for animations level that is overridden by
     // !important rules, it should not block other animations from running
     // on the compositor.
     // NOTE: We don't currently check for !important rules for properties that
--- a/dom/animation/test/chrome/test_running_on_compositor.html
+++ b/dom/animation/test/chrome/test_running_on_compositor.html
@@ -5,27 +5,35 @@
        running on the compositor or not</title>
 <script type="application/javascript" src="../testharness.js"></script>
 <script type="application/javascript" src="../testharnessreport.js"></script>
 <script type="application/javascript" src="../testcommon.js"></script>
 <style>
 @keyframes anim {
   to { transform: translate(100px) }
 }
+@keyframes transform-starts-with-none {
+    0% { transform: none }
+   99% { transform: none }
+  100% { transform: translate(100px) }
+}
+@keyframes opacity {
+  to { opacity: 0 }
+}
 @keyframes background_and_translate {
   to { background-color: red; transform: translate(100px); }
 }
 @keyframes background {
   to { background-color: red; }
 }
 @keyframes rotate {
   from { transform: rotate(0deg); }
   to { transform: rotate(360deg); }
 }
-@keyframes rotate_and_opacity {
+@keyframes rotate-and-opacity {
   from { transform: rotate(0deg); opacity: 1;}
   to { transform: rotate(360deg); opacity: 0;}
 }
 div {
   /* Element needs geometry to be eligible for layerization */
   width: 100px;
   height: 100px;
   background-color: white;
@@ -165,27 +173,16 @@ promise_test(function(t) {
     return waitForFrame();
   }).then(function() {
     assert_animation_is_not_running_on_compositor(animation,
        'Animation reports that it is NOT running on the compositor'
        + ' on the next tick after animation.cancel() is called');
   });
 }, 'isRunningOnCompositor is false when animation.cancel() is called');
 
-promise_test(function(t) {
-  var div = addDiv(t, { style: 'animation: anim 100s 100s' });
-  var animation = div.getAnimations()[0];
-
-  return animation.ready.then(function() {
-    assert_animation_is_not_running_on_compositor(animation,
-       'Animation reports that it is NOT running on the compositor'
-       + ' while in the delay phase');
-  });
-}, 'isRunningOnCompositor is false while in the delay phase');
-
 // This is to test that we don't simply clobber the flag when ticking
 // animations and then set it again during painting.
 promise_test(function(t) {
   var div = addDiv(t, { style: 'animation: anim 100s' });
   var animation = div.getAnimations()[0];
 
   return animation.ready.then(function() {
     return new Promise(function(resolve) {
@@ -286,17 +283,17 @@ promise_test(function(t) {
   return animation.ready.then(function() {
     assert_animation_is_running_on_compositor(animation,
        'Transition reports that it is running on the compositor'
        + ' during playback for opacity transition');
   });
 }, 'isRunningOnCompositor for transitions');
 
 promise_test(function(t) {
-  var div = addDiv(t, { style: 'animation: rotate_and_opacity 100s; ' +
+  var div = addDiv(t, { style: 'animation: rotate-and-opacity 100s; ' +
                                'backface-visibility: hidden; ' +
                                'transform: none !important;' });
   var animation = div.getAnimations()[0];
 
   return animation.ready.then(function() {
     assert_animation_is_running_on_compositor(animation,
        'If an animation has a property that can run on the compositor and a '
        + 'property that cannot (due to Gecko limitations) but where the latter'
@@ -460,20 +457,19 @@ promise_test(function(t) {
 promise_test(function(t) {
   var div = addDiv(t);
   var animation = div.animate({ opacity: [ 0, 1 ] },
                               { duration: 100 * MS_PER_SEC,
                                 delay: 100 * MS_PER_SEC,
                                 fill: 'backwards' });
 
   return animation.ready.then(function() {
-    // Will be fixed in bug 1223658.
-    assert_animation_is_not_running_on_compositor(animation,
+    assert_animation_is_running_on_compositor(animation,
                   'Animation with fill:backwards in delay phase reports ' +
-                  'that it is NOT running on the compositor');
+                  'that it is running on the compositor');
 
     animation.currentTime = 100 * MS_PER_SEC;
     return waitForFrame();
  }).then(function() {
     assert_animation_is_running_on_compositor(animation,
                   'Animation with fill:backwards in delay phase reports ' +
                   'that it is running on the compositor after delay phase');
   });
@@ -704,16 +700,235 @@ promise_test(function(t) {
                   'A higher-priority animation begins to running on the ' +
                   'compositor after being applied to an element which has ' +
                   'a lower-priority-animation');
   });
 }, 'Animation begins running on the compositor after being applied ' +
    'to an element which has a lower-priority animation once after ' +
    'disassociating with an element');
 
+var delayPhaseTests = [
+  {
+    desc: 'script animation of opacity',
+    setupAnimation: function(t) {
+      return addDiv(t).animate(
+        { opacity: [0, 1] },
+        { delay: 100 * MS_PER_SEC, duration: 100 * MS_PER_SEC });
+    },
+  },
+  {
+    desc: 'script animation of transform',
+    setupAnimation: function(t) {
+      return addDiv(t).animate(
+        { transform: ['translateX(0px)', 'translateX(100px)'] },
+        { delay: 100 * MS_PER_SEC, duration: 100 * MS_PER_SEC });
+    },
+  },
+  {
+    desc: 'CSS animation of opacity',
+    setupAnimation: function(t) {
+      return addDiv(t, { style: 'animation: opacity 100s 100s' })
+        .getAnimations()[0];
+    },
+  },
+  {
+    desc: 'CSS animation of transform',
+    setupAnimation: function(t) {
+      return addDiv(t, { style: 'animation: anim 100s 100s' })
+        .getAnimations()[0];
+    },
+  },
+  {
+    desc: 'CSS transition of opacity',
+    setupAnimation: function(t) {
+      var div = addDiv(t, { style: 'transition: opacity 100s 100s' });
+      getComputedStyle(div).opacity;
+
+      div.style.opacity = 0;
+      return div.getAnimations()[0];
+    },
+  },
+  {
+    desc: 'CSS transition of transform',
+    setupAnimation: function(t) {
+      var div = addDiv(t, { style: 'transition: transform 100s 100s' });
+      getComputedStyle(div).transform;
+
+      div.style.transform = 'translateX(100px)';
+      return div.getAnimations()[0];
+    },
+  },
+];
+
+delayPhaseTests.forEach(function(test) {
+  promise_test(function(t) {
+    var animation = test.setupAnimation(t);
+
+    return animation.ready.then(function() {
+      assert_animation_is_running_on_compositor(animation,
+         test.desc + ' reports that it is running on the '
+         + 'compositor even though it is in the delay phase');
+    });
+  }, 'isRunningOnCompositor for ' + test.desc + ' is true even though ' +
+     'it is in the delay phase');
+});
+
+// The purpose of thie test cases is to check that
+// NS_FRAME_MAY_BE_TRANSFORMED flag on the associated nsIFrame persists
+// after transform style on the frame is removed.
+var delayPhaseWithTransformStyleTests = [
+  {
+    desc: 'script animation of transform with transform style',
+    setupAnimation: function(t) {
+      return addDiv(t, { style: 'transform: translateX(10px)' }).animate(
+        { transform: ['translateX(0px)', 'translateX(100px)'] },
+        { delay: 100 * MS_PER_SEC, duration: 100 * MS_PER_SEC });
+    },
+  },
+  {
+    desc: 'CSS animation of transform with transform style',
+    setupAnimation: function(t) {
+      return addDiv(t, { style: 'animation: anim 100s 100s;' +
+                                'transform: translateX(10px)' })
+        .getAnimations()[0];
+    },
+  },
+  {
+    desc: 'CSS transition of transform with transform style',
+    setupAnimation: function(t) {
+      var div = addDiv(t, { style: 'transition: transform 100s 100s;' +
+                                   'transform: translateX(10px)'});
+      getComputedStyle(div).transform;
+
+      div.style.transform = 'translateX(100px)';
+      return div.getAnimations()[0];
+    },
+  },
+];
+
+delayPhaseWithTransformStyleTests.forEach(function(test) {
+  promise_test(function(t) {
+    var animation = test.setupAnimation(t);
+
+    return animation.ready.then(function() {
+      assert_animation_is_running_on_compositor(animation,
+         test.desc + ' reports that it is running on the '
+         + 'compositor even though it is in the delay phase');
+    }).then(function() {
+      // Remove the initial transform style during delay phase.
+      animation.effect.target.style.transform = 'none';
+      return animation.ready;
+    }).then(function() {
+      assert_animation_is_running_on_compositor(animation,
+         test.desc + ' reports that it keeps running on the '
+         + 'compositor after removing the initial transform style');
+    });
+  }, 'isRunningOnCompositor for ' + test.desc + ' is true after removing ' +
+     'the initial transform style during the delay phase');
+});
+
+var startsWithNoneTests = [
+  {
+    desc: 'script animation of transform starts with transform:none segment',
+    setupAnimation: function(t) {
+      return addDiv(t).animate(
+        { transform: ['none', 'none', 'translateX(100px)'] }, 100 * MS_PER_SEC);
+    },
+  },
+  {
+    desc: 'CSS animation of transform starts with transform:none segment',
+    setupAnimation: function(t) {
+      return addDiv(t,
+        { style: 'animation: transform-starts-with-none 100s 100s' })
+          .getAnimations()[0];
+    },
+  },
+];
+
+startsWithNoneTests.forEach(function(test) {
+  promise_test(function(t) {
+    var animation = test.setupAnimation(t);
+
+    return animation.ready.then(function() {
+      assert_animation_is_running_on_compositor(animation,
+         test.desc + ' reports that it is running on the '
+         + 'compositor even though it is in transform:none segment');
+    });
+  }, 'isRunningOnCompositor for ' + test.desc + ' is true even though ' +
+     'it is in transform:none segment');
+});
+
+promise_test(function(t) {
+  var div = addDiv(t, { style: 'opacity: 1 ! important' });
+
+  var animation = div.animate(
+    { opacity: [0, 1] },
+    { delay: 100 * MS_PER_SEC, duration: 100 * MS_PER_SEC });
+
+  return animation.ready.then(function() {
+    assert_animation_is_not_running_on_compositor(animation,
+      'Opacity animation on an element which has opacity:1 important style'
+      + 'reports that it is not running on the compositor');
+    // Clear the opacity style on the target element.
+    div.style.setProperty("opacity", "1", "");
+    return waitForFrame();
+  }).then(function() {
+    assert_animation_is_running_on_compositor(animation,
+      'Opacity animations reports that it is running on the compositor after '
+      + 'clearing the opacity style on the element');
+  });
+}, 'Clearing *important* opacity style on the target element sends the ' +
+   'animation to the compositor even if the animation is in the delay phase');
+
+promise_test(function(t) {
+  var opaqueDiv = addDiv(t, { style: 'opacity: 1 ! important' });
+  var anotherDiv = addDiv(t);
+
+  var animation = opaqueDiv.animate(
+    { opacity: [0, 1] },
+    { delay: 100 * MS_PER_SEC, duration: 100 * MS_PER_SEC });
+
+  return animation.ready.then(function() {
+    assert_animation_is_not_running_on_compositor(animation,
+      'Opacity animation on an element which has opacity:1 important style'
+      + 'reports that it is not running on the compositor');
+    // Changing target element to another element which has no opacity style.
+    animation.effect.target = anotherDiv;
+    return waitForFrame();
+  }).then(function() {
+    assert_animation_is_running_on_compositor(animation,
+      'Opacity animations reports that it is running on the compositor after '
+      + 'changing the target element to another elemenent having no '
+      + 'opacity style');
+  });
+}, 'Changing target element of opacity animation sends the animation to the ' +
+   'the compositor even if the animation is in the delay phase');
+
+promise_test(function(t) {
+  var animation =
+    addDivAndAnimate(t,
+                     {},
+                     { width: ['100px', '200px'] },
+                     { duration: 100 * MS_PER_SEC, delay: 100 * MS_PER_SEC });
+
+  return animation.ready.then(function() {
+    assert_animation_is_not_running_on_compositor(animation,
+      'Width animation reports that it is not running on the compositor '
+      + 'in the delay phase');
+    // Changing to property runnable on the compositor.
+    animation.effect.setKeyframes({ opacity: [0, 1] });
+    return waitForFrame();
+  }).then(function() {
+    assert_animation_is_running_on_compositor(animation,
+      'Opacity animation reports that it is running on the compositor '
+      + 'after changing the property from width property in the delay phase');
+  });
+}, 'Dynamic change to a property runnable on the compositor ' +
+   'in the delay phase');
+
 promise_test(function(t) {
   var div = addDiv(t, { style: 'transition: opacity 100s; ' +
                                'opacity: 0 !important' });
   getComputedStyle(div).opacity;
 
   div.style.setProperty('opacity', '1', 'important');
   getComputedStyle(div).opacity;
 
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -190,32 +190,17 @@ public:
   virtual ~StateObject() {}
   virtual void Enter() {}; // Entry action.
   virtual void Exit() {};  // Exit action.
   virtual void Step() {}   // Perform a 'cycle' of this state object.
   virtual State GetState() const = 0;
 
   // Event handlers for various events.
   // Return true if the event is handled by this state object.
-  virtual bool HandleDormant(bool aDormant)
-  {
-    if (!aDormant) {
-      return true;
-    }
-    mMaster->mQueuedSeek.mTarget =
-      SeekTarget(mMaster->mCurrentPosition,
-                 SeekTarget::Accurate,
-                 MediaDecoderEventVisibility::Suppressed);
-    // SeekJob asserts |mTarget.IsValid() == !mPromise.IsEmpty()| so we
-    // need to create the promise even it is not used at all.
-    RefPtr<MediaDecoder::SeekPromise> unused =
-      mMaster->mQueuedSeek.mPromise.Ensure(__func__);
-    SetState(DECODER_STATE_DORMANT);
-    return true;
-  }
+  virtual bool HandleDormant(bool aDormant);
 
   virtual bool HandleCDMProxyReady() { return false; }
 
   virtual bool HandleAudioDecoded(MediaData* aAudio) { return false; }
 
   virtual bool HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart)
   {
     return false;
@@ -224,30 +209,57 @@ public:
   virtual bool HandleEndOfStream() { return false; }
 
   virtual bool HandleWaitingForData() { return false; }
 
   virtual RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) = 0;
 
   virtual bool HandleAudioCaptured() { return false; }
 
+  virtual RefPtr<ShutdownPromise> HandleShutdown();
+
   virtual void DumpDebugInfo() {}
 
 protected:
   using Master = MediaDecoderStateMachine;
   explicit StateObject(Master* aPtr) : mMaster(aPtr) {}
   TaskQueue* OwnerThread() const { return mMaster->mTaskQueue; }
   MediaResource* Resource() const { return mMaster->mResource; }
   MediaDecoderReaderWrapper* Reader() const { return mMaster->mReader; }
   const MediaInfo& Info() const { return mMaster->Info(); }
 
+public:
+  // TODO: this function is public because VisibilityChanged() calls it.
+  // We should handle visibility changes in state objects so this function
+  // can be made protected again.
+  //
   // Note this function will delete the current state object.
   // Don't access members to avoid UAF after this call.
-  void SetState(State aState) { mMaster->SetState(aState); }
-
+  template <class S, typename... Ts>
+  void SetState(Ts&&... aArgs)
+  {
+    // keep mMaster in a local object because mMaster will become invalid after
+    // the current state object is deleted.
+    auto master = mMaster;
+
+    UniquePtr<StateObject> s = MakeUnique<S>(master, Forward<Ts>(aArgs)...);
+    if (master->mState == s->GetState() &&
+        master->mState != DECODER_STATE_SEEKING) {
+      return;
+    }
+
+    SLOG("change state to: %s", ToStateStr(s->GetState()));
+
+    Exit();
+    master->mState = s->GetState();
+    master->mStateObj = Move(s); // Will delete |this|!
+    master->mStateObj->Enter();
+  }
+
+protected:
   // Take a raw pointer in order not to change the life cycle of MDSM.
   // It is guaranteed to be valid by MDSM.
   Master* mMaster;
 };
 
 class MediaDecoderStateMachine::DecodeMetadataState
   : public MediaDecoderStateMachine::StateObject
 {
@@ -292,81 +304,17 @@ public:
 
   RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
   {
     MOZ_DIAGNOSTIC_ASSERT(false, "Can't seek while decoding metadata.");
     return MediaDecoder::SeekPromise::CreateAndReject(true, __func__);
   }
 
 private:
-  void OnMetadataRead(MetadataHolder* aMetadata)
-  {
-    mMetadataRequest.Complete();
-
-    // Set mode to PLAYBACK after reading metadata.
-    Resource()->SetReadMode(MediaCacheStream::MODE_PLAYBACK);
-
-    mMaster->mInfo = Some(aMetadata->mInfo);
-    mMaster->mMetadataTags = aMetadata->mTags.forget();
-
-    if (Info().mMetadataDuration.isSome()) {
-      mMaster->RecomputeDuration();
-    } else if (Info().mUnadjustedMetadataEndTime.isSome()) {
-      RefPtr<Master> master = mMaster;
-      Reader()->AwaitStartTime()->Then(OwnerThread(), __func__,
-        [master] () {
-          NS_ENSURE_TRUE_VOID(!master->IsShutdown());
-          auto& info = master->mInfo.ref();
-          TimeUnit unadjusted = info.mUnadjustedMetadataEndTime.ref();
-          TimeUnit adjustment = master->mReader->StartTime();
-          info.mMetadataDuration.emplace(unadjusted - adjustment);
-          master->RecomputeDuration();
-        }, [master, this] () {
-          SWARN("Adjusting metadata end time failed");
-        }
-      );
-    }
-
-    if (mMaster->HasVideo()) {
-      SLOG("Video decode isAsync=%d HWAccel=%d videoQueueSize=%d",
-           Reader()->IsAsync(),
-           Reader()->VideoIsHardwareAccelerated(),
-           mMaster->GetAmpleVideoFrames());
-    }
-
-    // In general, we wait until we know the duration before notifying the decoder.
-    // However, we notify  unconditionally in this case without waiting for the start
-    // time, since the caller might be waiting on metadataloaded to be fired before
-    // feeding in the CDM, which we need to decode the first frame (and
-    // thus get the metadata). We could fix this if we could compute the start
-    // time by demuxing without necessaring decoding.
-    bool waitingForCDM = Info().IsEncrypted() && !mMaster->mCDMProxy;
-
-    mMaster->mNotifyMetadataBeforeFirstFrame =
-      mMaster->mDuration.Ref().isSome() || waitingForCDM;
-
-    if (mMaster->mNotifyMetadataBeforeFirstFrame) {
-      mMaster->EnqueueLoadedMetadataEvent();
-    }
-
-    if (mPendingDormant) {
-      // No need to store mQueuedSeek because we are at position 0.
-      SetState(DECODER_STATE_DORMANT);
-      return;
-    }
-
-    if (waitingForCDM) {
-      // Metadata parsing was successful but we're still waiting for CDM caps
-      // to become available so that we can build the correct decryptor/decoder.
-      SetState(DECODER_STATE_WAIT_FOR_CDM);
-      return;
-    }
-
-    SetState(DECODER_STATE_DECODING_FIRSTFRAME);
-  }
+  void OnMetadataRead(MetadataHolder* aMetadata);
 
   void OnMetadataNotRead(const MediaResult& aError)
   {
     mMetadataRequest.Complete();
     SWARN("Decode metadata failed, shutting down decoder");
     mMaster->DecodeError(aError);
   }
 
@@ -384,30 +332,19 @@ class MediaDecoderStateMachine::WaitForC
 public:
   explicit WaitForCDMState(Master* aPtr) : StateObject(aPtr) {}
 
   State GetState() const override
   {
     return DECODER_STATE_WAIT_FOR_CDM;
   }
 
-  bool HandleDormant(bool aDormant) override
-  {
-    if (aDormant) {
-      // No need to store mQueuedSeek because we are at position 0.
-      SetState(DECODER_STATE_DORMANT);
-    }
-    return true;
-  }
-
-  bool HandleCDMProxyReady() override
-  {
-    SetState(DECODER_STATE_DECODING_FIRSTFRAME);
-    return true;
-  }
+  bool HandleDormant(bool aDormant) override;
+
+  bool HandleCDMProxyReady() override;
 
   RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
   {
     SLOG("Not Enough Data to seek at this stage, queuing seek");
     mMaster->mQueuedSeek.RejectIfExists(__func__);
     mMaster->mQueuedSeek.mTarget = aTarget;
     return mMaster->mQueuedSeek.mPromise.Ensure(__func__);
   }
@@ -428,61 +365,34 @@ public:
     mMaster->mReader->ReleaseResources();
   }
 
   State GetState() const override
   {
     return DECODER_STATE_DORMANT;
   }
 
-  bool HandleDormant(bool aDormant) override
-  {
-    if (!aDormant) {
-      // Exit dormant state. Check if we need the CDMProxy to start decoding.
-      SetState(Info().IsEncrypted() && !mMaster->mCDMProxy
-        ? DECODER_STATE_WAIT_FOR_CDM
-        : DECODER_STATE_DECODING_FIRSTFRAME);
-    }
-    return true;
-  }
+  bool HandleDormant(bool aDormant) override;
 
   RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
   {
     SLOG("Not Enough Data to seek at this stage, queuing seek");
     mMaster->mQueuedSeek.RejectIfExists(__func__);
     mMaster->mQueuedSeek.mTarget = aTarget;
     return mMaster->mQueuedSeek.mPromise.Ensure(__func__);
   }
 };
 
 class MediaDecoderStateMachine::DecodingFirstFrameState
   : public MediaDecoderStateMachine::StateObject
 {
 public:
   explicit DecodingFirstFrameState(Master* aPtr) : StateObject(aPtr) {}
 
-  void Enter() override
-  {
-    // Handle pending seek.
-    if (mMaster->mQueuedSeek.Exists() &&
-        (mMaster->mSentFirstFrameLoadedEvent ||
-         Reader()->ForceZeroStartTime())) {
-      mMaster->InitiateSeek(Move(mMaster->mQueuedSeek));
-      return;
-    }
-
-    // Transition to DECODING if we've decoded first frames.
-    if (mMaster->mSentFirstFrameLoadedEvent) {
-      SetState(DECODER_STATE_DECODING);
-      return;
-    }
-
-    // Dispatch tasks to decode first frames.
-    mMaster->DispatchDecodeTasksIfNeeded();
-  }
+  void Enter() override;
 
   State GetState() const override
   {
     return DECODER_STATE_DECODING_FIRSTFRAME;
   }
 
   bool HandleAudioDecoded(MediaData* aAudio) override
   {
@@ -499,90 +409,31 @@ public:
   }
 
   bool HandleEndOfStream() override
   {
     MaybeFinishDecodeFirstFrame();
     return true;
   }
 
-  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
-  {
-    // Should've transitioned to DECODING in Enter()
-    // if mSentFirstFrameLoadedEvent is true.
-    MOZ_ASSERT(!mMaster->mSentFirstFrameLoadedEvent);
-
-    if (!Reader()->ForceZeroStartTime()) {
-      SLOG("Not Enough Data to seek at this stage, queuing seek");
-      mMaster->mQueuedSeek.RejectIfExists(__func__);
-      mMaster->mQueuedSeek.mTarget = aTarget;
-      return mMaster->mQueuedSeek.mPromise.Ensure(__func__);
-    }
-
-    // Since ForceZeroStartTime() is true, we should've transitioned to SEEKING
-    // in Enter() if there is any queued seek.
-    MOZ_ASSERT(!mMaster->mQueuedSeek.Exists());
-
-    SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
-    SeekJob seekJob;
-    seekJob.mTarget = aTarget;
-    RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
-    mMaster->InitiateSeek(Move(seekJob));
-    return p.forget();
-  }
+  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
 
 private:
   // Notify FirstFrameLoaded if having decoded first frames and
   // transition to SEEKING if there is any pending seek, or DECODING otherwise.
-  void MaybeFinishDecodeFirstFrame()
-  {
-    MOZ_ASSERT(!mMaster->mSentFirstFrameLoadedEvent);
-
-    if ((mMaster->IsAudioDecoding() && mMaster->AudioQueue().GetSize() == 0) ||
-        (mMaster->IsVideoDecoding() && mMaster->VideoQueue().GetSize() == 0)) {
-      return;
-    }
-
-    mMaster->FinishDecodeFirstFrame();
-
-    if (mMaster->mQueuedSeek.Exists()) {
-      mMaster->InitiateSeek(Move(mMaster->mQueuedSeek));
-    } else {
-      SetState(DECODER_STATE_DECODING);
-    }
-  }
+  void MaybeFinishDecodeFirstFrame();
 };
 
 class MediaDecoderStateMachine::DecodingState
   : public MediaDecoderStateMachine::StateObject
 {
 public:
   explicit DecodingState(Master* aPtr) : StateObject(aPtr) {}
 
-  void Enter() override
-  {
-    MOZ_ASSERT(mMaster->mSentFirstFrameLoadedEvent);
-    // Pending seek should've been handled by DECODING_FIRSTFRAME before
-    // transitioning to DECODING.
-    MOZ_ASSERT(!mMaster->mQueuedSeek.Exists());
-
-    if (mMaster->CheckIfDecodeComplete()) {
-      SetState(DECODER_STATE_COMPLETED);
-      return;
-    }
-
-    mDecodeStartTime = TimeStamp::Now();
-
-    MaybeStopPrerolling();
-
-    // Ensure that we've got tasks enqueued to decode data if we need to.
-    mMaster->DispatchDecodeTasksIfNeeded();
-
-    mMaster->ScheduleStateMachine();
-  }
+  void Enter() override;
 
   void Exit() override
   {
     if (!mDecodeStartTime.IsNull()) {
       TimeDuration decodeDuration = TimeStamp::Now() - mDecodeStartTime;
       SLOG("Exiting DECODING, decoded for %.3lfs", decodeDuration.ToSeconds());
     }
   }
@@ -602,17 +453,17 @@ public:
     }
 
     mMaster->UpdatePlaybackPositionPeriodically();
 
     MOZ_ASSERT(!mMaster->IsPlaying() ||
                mMaster->IsStateMachineScheduled(),
                "Must have timer scheduled");
 
-    mMaster->MaybeStartBuffering();
+    MaybeStartBuffering();
   }
 
   State GetState() const override
   {
     return DECODER_STATE_DECODING;
   }
 
   bool HandleAudioDecoded(MediaData* aAudio) override
@@ -625,36 +476,19 @@ public:
   bool HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
   {
     mMaster->Push(aVideo, MediaData::VIDEO_DATA);
     MaybeStopPrerolling();
     CheckSlowDecoding(aDecodeStart);
     return true;
   }
 
-  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
-  {
-    mMaster->mQueuedSeek.RejectIfExists(__func__);
-    SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
-    SeekJob seekJob;
-    seekJob.mTarget = aTarget;
-    RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
-    mMaster->InitiateSeek(Move(seekJob));
-    return p.forget();
-  }
-
-  bool HandleEndOfStream() override
-  {
-    if (mMaster->CheckIfDecodeComplete()) {
-      SetState(DECODER_STATE_COMPLETED);
-    } else {
-      MaybeStopPrerolling();
-    }
-    return true;
-  }
+  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
+
+  bool HandleEndOfStream() override;
 
   bool HandleWaitingForData() override
   {
     MaybeStopPrerolling();
     return true;
   }
 
   bool HandleAudioCaptured() override
@@ -666,16 +500,18 @@ public:
   }
 
   void DumpDebugInfo() override
   {
     SDUMP("mIsPrerolling=%d", mIsPrerolling);
   }
 
 private:
+  void MaybeStartBuffering();
+
   void CheckSlowDecoding(TimeStamp aDecodeStart)
   {
     // For non async readers, if the requested video sample was slow to
     // arrive, increase the amount of audio we buffer to ensure that we
     // don't run out of audio. This is unnecessary for async readers,
     // since they decode audio and video on different threads so they
     // are unlikely to run out of decoded audio.
     if (Reader()->IsAsync()) {
@@ -816,58 +652,31 @@ public:
     mMaster->SetMediaDecoderReaderWrapperCallback();
   }
 
   State GetState() const override
   {
     return DECODER_STATE_SEEKING;
   }
 
-  bool HandleDormant(bool aDormant) override
-  {
-    if (!aDormant) {
-      return true;
-    }
-    MOZ_ASSERT(!mMaster->mQueuedSeek.Exists());
-    MOZ_ASSERT(mSeekJob.Exists());
-    // Because both audio and video decoders are going to be reset in this
-    // method later, we treat a VideoOnly seek task as a normal Accurate
-    // seek task so that while it is resumed, both audio and video playback
-    // are handled.
-    if (mSeekJob.mTarget.IsVideoOnly()) {
-      mSeekJob.mTarget.SetType(SeekTarget::Accurate);
-      mSeekJob.mTarget.SetVideoOnly(false);
-    }
-    mMaster->mQueuedSeek = Move(mSeekJob);
-    SetState(DECODER_STATE_DORMANT);
-    return true;
-  }
+  bool HandleDormant(bool aDormant) override;
 
   bool HandleAudioDecoded(MediaData* aAudio) override
   {
     MOZ_ASSERT(false);
     return true;
   }
 
   bool HandleVideoDecoded(MediaData* aVideo, TimeStamp aDecodeStart) override
   {
     MOZ_ASSERT(false);
     return true;
   }
 
-  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
-  {
-    mMaster->mQueuedSeek.RejectIfExists(__func__);
-    SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
-    SeekJob seekJob;
-    seekJob.mTarget = aTarget;
-    RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
-    mMaster->InitiateSeek(Move(seekJob));
-    return p.forget();
-  }
+  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
 
 private:
   void OnSeekTaskResolved(const SeekTaskResolveValue& aValue)
   {
     mSeekTaskRequest.Complete();
 
     if (aValue.mSeekedAudioData) {
       mMaster->Push(aValue.mSeekedAudioData, MediaData::AUDIO_DATA);
@@ -902,89 +711,17 @@ private:
 
     if (aValue.mIsVideoQueueFinished) {
       mMaster->VideoQueue().Finish();
     }
 
     mMaster->DecodeError(aValue.mError);
   }
 
-  void SeekCompleted()
-  {
-    int64_t seekTime = mSeekTask->GetSeekTarget().GetTime().ToMicroseconds();
-    int64_t newCurrentTime = seekTime;
-
-    // Setup timestamp state.
-    RefPtr<MediaData> video = mMaster->VideoQueue().PeekFront();
-    if (seekTime == mMaster->Duration().ToMicroseconds()) {
-      newCurrentTime = seekTime;
-    } else if (mMaster->HasAudio()) {
-      RefPtr<MediaData> audio = mMaster->AudioQueue().PeekFront();
-      // Though we adjust the newCurrentTime in audio-based, and supplemented
-      // by video. For better UX, should NOT bind the slide position to
-      // the first audio data timestamp directly.
-      // While seeking to a position where there's only either audio or video, or
-      // seeking to a position lies before audio or video, we need to check if
-      // seekTime is bounded in suitable duration. See Bug 1112438.
-      int64_t audioStart = audio ? audio->mTime : seekTime;
-      // We only pin the seek time to the video start time if the video frame
-      // contains the seek time.
-      if (video && video->mTime <= seekTime && video->GetEndTime() > seekTime) {
-        newCurrentTime = std::min(audioStart, video->mTime);
-      } else {
-        newCurrentTime = audioStart;
-      }
-    } else {
-      newCurrentTime = video ? video->mTime : seekTime;
-    }
-
-    // Change state to DECODING or COMPLETED now.
-    bool isLiveStream = Resource()->IsLiveStream();
-    State nextState;
-    if (newCurrentTime == mMaster->Duration().ToMicroseconds() && !isLiveStream) {
-      // Seeked to end of media, move to COMPLETED state. Note we don't do
-      // this when playing a live stream, since the end of media will advance
-      // once we download more data!
-      // Explicitly set our state so we don't decode further, and so
-      // we report playback ended to the media element.
-      nextState = DECODER_STATE_COMPLETED;
-    } else {
-      nextState = DECODER_STATE_DECODING;
-    }
-
-    // We want to resolve the seek request prior finishing the first frame
-    // to ensure that the seeked event is fired prior loadeded.
-    mSeekJob.Resolve(nextState == DECODER_STATE_COMPLETED, __func__);
-
-    // Notify FirstFrameLoaded now if we haven't since we've decoded some data
-    // for readyState to transition to HAVE_CURRENT_DATA and fire 'loadeddata'.
-    if (!mMaster->mSentFirstFrameLoadedEvent) {
-      // Only MSE can start seeking before finishing decoding first frames.
-      MOZ_ASSERT(Reader()->ForceZeroStartTime());
-      mMaster->FinishDecodeFirstFrame();
-    }
-
-    // Ensure timestamps are up to date.
-    if (!mSeekJob.mTarget.IsVideoOnly()) {
-      // Don't update playback position for video-only seek.
-      // Otherwise we might have |newCurrentTime > mMediaSink->GetPosition()|
-      // and fail the assertion in GetClock() since we didn't stop MediaSink.
-      mMaster->UpdatePlaybackPositionInternal(newCurrentTime);
-    }
-
-    // Try to decode another frame to detect if we're at the end...
-    SLOG("Seek completed, mCurrentPosition=%lld", mMaster->mCurrentPosition.Ref());
-
-    if (video) {
-      mMaster->mMediaSink->Redraw(Info().mVideo);
-      mMaster->mOnPlaybackEvent.Notify(MediaEventType::Invalidate);
-    }
-
-    SetState(nextState);
-  }
+  void SeekCompleted();
 
   SeekJob mSeekJob;
   MozPromiseRequestHolder<SeekTask::SeekTaskPromise> mSeekTaskRequest;
   RefPtr<SeekTask> mSeekTask;
 };
 
 class MediaDecoderStateMachine::BufferingState
   : public MediaDecoderStateMachine::StateObject
@@ -1003,58 +740,17 @@ public:
     MediaStatistics stats = mMaster->GetStatistics();
     SLOG("Playback rate: %.1lfKB/s%s download rate: %.1lfKB/s%s",
          stats.mPlaybackRate/1024, stats.mPlaybackRateReliable ? "" : " (unreliable)",
          stats.mDownloadRate/1024, stats.mDownloadRateReliable ? "" : " (unreliable)");
 
     mMaster->ScheduleStateMachineIn(USECS_PER_S);
   }
 
-  void Step() override
-  {
-    TimeStamp now = TimeStamp::Now();
-    MOZ_ASSERT(!mBufferingStart.IsNull(), "Must know buffering start time.");
-
-    // With buffering heuristics we will remain in the buffering state if
-    // we've not decoded enough data to begin playback, or if we've not
-    // downloaded a reasonable amount of data inside our buffering time.
-    if (Reader()->UseBufferingHeuristics()) {
-      TimeDuration elapsed = now - mBufferingStart;
-      bool isLiveStream = Resource()->IsLiveStream();
-      if ((isLiveStream || !mMaster->CanPlayThrough()) &&
-          elapsed < TimeDuration::FromSeconds(mBufferingWait * mMaster->mPlaybackRate) &&
-          mMaster->HasLowBufferedData(mBufferingWait * USECS_PER_S) &&
-          Resource()->IsExpectingMoreData()) {
-        SLOG("Buffering: wait %ds, timeout in %.3lfs",
-             mBufferingWait, mBufferingWait - elapsed.ToSeconds());
-        mMaster->ScheduleStateMachineIn(USECS_PER_S);
-        return;
-      }
-    } else if (mMaster->OutOfDecodedAudio() || mMaster->OutOfDecodedVideo()) {
-      MOZ_ASSERT(Reader()->IsWaitForDataSupported(),
-                 "Don't yet have a strategy for non-heuristic + non-WaitForData");
-      mMaster->DispatchDecodeTasksIfNeeded();
-      MOZ_ASSERT(mMaster->mMinimizePreroll ||
-                 !mMaster->OutOfDecodedAudio() ||
-                 Reader()->IsRequestingAudioData() ||
-                 Reader()->IsWaitingAudioData());
-      MOZ_ASSERT(mMaster->mMinimizePreroll ||
-                 !mMaster->OutOfDecodedVideo() ||
-                 Reader()->IsRequestingVideoData() ||
-                 Reader()->IsWaitingVideoData());
-      SLOG("In buffering mode, waiting to be notified: outOfAudio: %d, "
-           "mAudioStatus: %s, outOfVideo: %d, mVideoStatus: %s",
-           mMaster->OutOfDecodedAudio(), mMaster->AudioRequestStatus(),
-           mMaster->OutOfDecodedVideo(), mMaster->VideoRequestStatus());
-      return;
-    }
-
-    SLOG("Buffered for %.3lfs", (now - mBufferingStart).ToSeconds());
-    SetState(DECODER_STATE_DECODING);
-  }
+  void Step() override;
 
   State GetState() const override
   {
     return DECODER_STATE_BUFFERING;
   }
 
   bool HandleAudioDecoded(MediaData* aAudio) override
   {
@@ -1069,37 +765,19 @@ public:
   {
     // This might be the sample we need to exit buffering.
     // Schedule Step() to check it.
     mMaster->Push(aVideo, MediaData::VIDEO_DATA);
     mMaster->ScheduleStateMachine();
     return true;
   }
 
-  bool HandleEndOfStream() override
-  {
-    if (mMaster->CheckIfDecodeComplete()) {
-      SetState(DECODER_STATE_COMPLETED);
-    } else {
-      // Check if we can exit buffering.
-      mMaster->ScheduleStateMachine();
-    }
-    return true;
-  }
-
-  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
-  {
-    mMaster->mQueuedSeek.RejectIfExists(__func__);
-    SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
-    SeekJob seekJob;
-    seekJob.mTarget = aTarget;
-    RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
-    mMaster->InitiateSeek(Move(seekJob));
-    return p.forget();
-  }
+  bool HandleEndOfStream() override;
+
+  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
 
 private:
   TimeStamp mBufferingStart;
 
   // The maximum number of second we spend buffering when we are short on
   // unbuffered data.
   const uint32_t mBufferingWait = 15;
 };
@@ -1163,26 +841,17 @@ public:
     }
   }
 
   State GetState() const override
   {
     return DECODER_STATE_COMPLETED;
   }
 
-  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
-  {
-    mMaster->mQueuedSeek.RejectIfExists(__func__);
-    SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
-    SeekJob seekJob;
-    seekJob.mTarget = aTarget;
-    RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
-    mMaster->InitiateSeek(Move(seekJob));
-    return p.forget();
-  }
+  RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override;
 
   bool HandleAudioCaptured() override
   {
     // MediaSink is changed. Schedule Step() to check if we can start playback.
     mMaster->ScheduleStateMachine();
     return true;
   }
 
@@ -1191,20 +860,17 @@ private:
 };
 
 class MediaDecoderStateMachine::ShutdownState
   : public MediaDecoderStateMachine::StateObject
 {
 public:
   explicit ShutdownState(Master* aPtr) : StateObject(aPtr) {}
 
-  void Enter() override
-  {
-    mMaster->mIsShutdown = true;
-  }
+  void Enter() override;
 
   void Exit() override
   {
     MOZ_DIAGNOSTIC_ASSERT(false, "Shouldn't escape the SHUTDOWN state.");
   }
 
   State GetState() const override
   {
@@ -1216,18 +882,575 @@ public:
     return true;
   }
 
   RefPtr<MediaDecoder::SeekPromise> HandleSeek(SeekTarget aTarget) override
   {
     MOZ_DIAGNOSTIC_ASSERT(false, "Can't seek in shutdown state.");
     return MediaDecoder::SeekPromise::CreateAndReject(true, __func__);
   }
+
+  RefPtr<ShutdownPromise> HandleShutdown() override
+  {
+    MOZ_DIAGNOSTIC_ASSERT(false, "Already shutting down.");
+    return nullptr;
+  }
 };
 
+bool
+MediaDecoderStateMachine::
+StateObject::HandleDormant(bool aDormant)
+{
+  if (!aDormant) {
+    return true;
+  }
+  mMaster->mQueuedSeek.mTarget =
+    SeekTarget(mMaster->mCurrentPosition,
+               SeekTarget::Accurate,
+               MediaDecoderEventVisibility::Suppressed);
+  // SeekJob asserts |mTarget.IsValid() == !mPromise.IsEmpty()| so we
+  // need to create the promise even it is not used at all.
+  RefPtr<MediaDecoder::SeekPromise> unused =
+    mMaster->mQueuedSeek.mPromise.Ensure(__func__);
+  SetState<DormantState>();
+  return true;
+}
+
+RefPtr<ShutdownPromise>
+MediaDecoderStateMachine::
+StateObject::HandleShutdown()
+{
+  auto master = mMaster;
+  SetState<ShutdownState>();
+
+  return master->mReader->Shutdown()
+    ->Then(master->OwnerThread(), __func__, master,
+           &MediaDecoderStateMachine::FinishShutdown,
+           &MediaDecoderStateMachine::FinishShutdown)
+    ->CompletionPromise();
+}
+
+void
+MediaDecoderStateMachine::
+DecodeMetadataState::OnMetadataRead(MetadataHolder* aMetadata)
+{
+  mMetadataRequest.Complete();
+
+  // Set mode to PLAYBACK after reading metadata.
+  Resource()->SetReadMode(MediaCacheStream::MODE_PLAYBACK);
+
+  mMaster->mInfo = Some(aMetadata->mInfo);
+  mMaster->mMetadataTags = aMetadata->mTags.forget();
+
+  if (Info().mMetadataDuration.isSome()) {
+    mMaster->RecomputeDuration();
+  } else if (Info().mUnadjustedMetadataEndTime.isSome()) {
+    RefPtr<Master> master = mMaster;
+    Reader()->AwaitStartTime()->Then(OwnerThread(), __func__,
+      [master] () {
+        NS_ENSURE_TRUE_VOID(!master->IsShutdown());
+        auto& info = master->mInfo.ref();
+        TimeUnit unadjusted = info.mUnadjustedMetadataEndTime.ref();
+        TimeUnit adjustment = master->mReader->StartTime();
+        info.mMetadataDuration.emplace(unadjusted - adjustment);
+        master->RecomputeDuration();
+      }, [master, this] () {
+        SWARN("Adjusting metadata end time failed");
+      }
+    );
+  }
+
+  if (mMaster->HasVideo()) {
+    SLOG("Video decode isAsync=%d HWAccel=%d videoQueueSize=%d",
+         Reader()->IsAsync(),
+         Reader()->VideoIsHardwareAccelerated(),
+         mMaster->GetAmpleVideoFrames());
+  }
+
+  // In general, we wait until we know the duration before notifying the decoder.
+  // However, we notify  unconditionally in this case without waiting for the start
+  // time, since the caller might be waiting on metadataloaded to be fired before
+  // feeding in the CDM, which we need to decode the first frame (and
+  // thus get the metadata). We could fix this if we could compute the start
+  // time by demuxing without necessaring decoding.
+  bool waitingForCDM = Info().IsEncrypted() && !mMaster->mCDMProxy;
+
+  mMaster->mNotifyMetadataBeforeFirstFrame =
+    mMaster->mDuration.Ref().isSome() || waitingForCDM;
+
+  if (mMaster->mNotifyMetadataBeforeFirstFrame) {
+    mMaster->EnqueueLoadedMetadataEvent();
+  }
+
+  if (mPendingDormant) {
+    // No need to store mQueuedSeek because we are at position 0.
+    SetState<DormantState>();
+    return;
+  }
+
+  if (waitingForCDM) {
+    // Metadata parsing was successful but we're still waiting for CDM caps
+    // to become available so that we can build the correct decryptor/decoder.
+    SetState<WaitForCDMState>();
+    return;
+  }
+
+  SetState<DecodingFirstFrameState>();
+}
+
+bool
+MediaDecoderStateMachine::
+WaitForCDMState::HandleDormant(bool aDormant)
+{
+  if (aDormant) {
+    // No need to store mQueuedSeek because we are at position 0.
+    SetState<DormantState>();
+  }
+  return true;
+}
+
+bool
+MediaDecoderStateMachine::
+DormantState::HandleDormant(bool aDormant)
+{
+  if (!aDormant) {
+    // Exit dormant state. Check if we need the CDMProxy to start decoding.
+    if (Info().IsEncrypted() && !mMaster->mCDMProxy) {
+      SetState<WaitForCDMState>();
+    } else {
+      SetState<DecodingFirstFrameState>();
+    }
+  }
+  return true;
+}
+
+bool
+MediaDecoderStateMachine::
+WaitForCDMState::HandleCDMProxyReady()
+{
+  SetState<DecodingFirstFrameState>();
+  return true;
+}
+
+void
+MediaDecoderStateMachine::
+DecodingFirstFrameState::Enter()
+{
+  // Handle pending seek.
+  if (mMaster->mQueuedSeek.Exists() &&
+      (mMaster->mSentFirstFrameLoadedEvent ||
+       Reader()->ForceZeroStartTime())) {
+    SetState<SeekingState>(Move(mMaster->mQueuedSeek));
+    return;
+  }
+
+  // Transition to DECODING if we've decoded first frames.
+  if (mMaster->mSentFirstFrameLoadedEvent) {
+    SetState<DecodingState>();
+    return;
+  }
+
+  // Dispatch tasks to decode first frames.
+  mMaster->DispatchDecodeTasksIfNeeded();
+}
+
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::
+DecodingFirstFrameState::HandleSeek(SeekTarget aTarget)
+{
+  // Should've transitioned to DECODING in Enter()
+  // if mSentFirstFrameLoadedEvent is true.
+  MOZ_ASSERT(!mMaster->mSentFirstFrameLoadedEvent);
+
+  if (!Reader()->ForceZeroStartTime()) {
+    SLOG("Not Enough Data to seek at this stage, queuing seek");
+    mMaster->mQueuedSeek.RejectIfExists(__func__);
+    mMaster->mQueuedSeek.mTarget = aTarget;
+    return mMaster->mQueuedSeek.mPromise.Ensure(__func__);
+  }
+
+  // Since ForceZeroStartTime() is true, we should've transitioned to SEEKING
+  // in Enter() if there is any queued seek.
+  MOZ_ASSERT(!mMaster->mQueuedSeek.Exists());
+
+  SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
+  SeekJob seekJob;
+  seekJob.mTarget = aTarget;
+  RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
+  SetState<SeekingState>(Move(seekJob));
+  return p.forget();
+}
+
+void
+MediaDecoderStateMachine::
+DecodingFirstFrameState::MaybeFinishDecodeFirstFrame()
+{
+  MOZ_ASSERT(!mMaster->mSentFirstFrameLoadedEvent);
+
+  if ((mMaster->IsAudioDecoding() && mMaster->AudioQueue().GetSize() == 0) ||
+      (mMaster->IsVideoDecoding() && mMaster->VideoQueue().GetSize() == 0)) {
+    return;
+  }
+
+  mMaster->FinishDecodeFirstFrame();
+
+  if (mMaster->mQueuedSeek.Exists()) {
+    SetState<SeekingState>(Move(mMaster->mQueuedSeek));
+  } else {
+    SetState<DecodingState>();
+  }
+}
+
+void
+MediaDecoderStateMachine::
+DecodingState::Enter()
+{
+  MOZ_ASSERT(mMaster->mSentFirstFrameLoadedEvent);
+  // Pending seek should've been handled by DECODING_FIRSTFRAME before
+  // transitioning to DECODING.
+  MOZ_ASSERT(!mMaster->mQueuedSeek.Exists());
+
+  if (mMaster->CheckIfDecodeComplete()) {
+    SetState<CompletedState>();
+    return;
+  }
+
+  mDecodeStartTime = TimeStamp::Now();
+
+  MaybeStopPrerolling();
+
+  // Ensure that we've got tasks enqueued to decode data if we need to.
+  mMaster->DispatchDecodeTasksIfNeeded();
+
+  mMaster->ScheduleStateMachine();
+}
+
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::
+DecodingState::HandleSeek(SeekTarget aTarget)
+{
+  mMaster->mQueuedSeek.RejectIfExists(__func__);
+  SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
+  SeekJob seekJob;
+  seekJob.mTarget = aTarget;
+  RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
+  SetState<SeekingState>(Move(seekJob));
+  return p.forget();
+}
+
+bool
+MediaDecoderStateMachine::
+DecodingState::HandleEndOfStream()
+{
+  if (mMaster->CheckIfDecodeComplete()) {
+    SetState<CompletedState>();
+  } else {
+    MaybeStopPrerolling();
+  }
+  return true;
+}
+
+void
+MediaDecoderStateMachine::
+DecodingState::MaybeStartBuffering()
+{
+  // Buffering makes senses only after decoding first frames.
+  MOZ_ASSERT(mMaster->mSentFirstFrameLoadedEvent);
+
+  // Don't enter buffering when MediaDecoder is not playing.
+  if (mMaster->mPlayState != MediaDecoder::PLAY_STATE_PLAYING) {
+    return;
+  }
+
+  // Don't enter buffering while prerolling so that the decoder has a chance to
+  // enqueue some decoded data before we give up and start buffering.
+  if (!mMaster->IsPlaying()) {
+    return;
+  }
+
+  // No more data to download. No need to enter buffering.
+  if (!Resource()->IsExpectingMoreData()) {
+    return;
+  }
+
+  bool shouldBuffer;
+  if (Reader()->UseBufferingHeuristics()) {
+    shouldBuffer = mMaster->HasLowDecodedData() && mMaster->HasLowBufferedData();
+  } else {
+    MOZ_ASSERT(Reader()->IsWaitForDataSupported());
+    shouldBuffer =
+      (mMaster->OutOfDecodedAudio() && Reader()->IsWaitingAudioData()) ||
+      (mMaster->OutOfDecodedVideo() && Reader()->IsWaitingVideoData());
+  }
+  if (shouldBuffer) {
+    SetState<BufferingState>();
+  }
+}
+
+bool
+MediaDecoderStateMachine::
+SeekingState::HandleDormant(bool aDormant)
+{
+  if (!aDormant) {
+    return true;
+  }
+  MOZ_ASSERT(!mMaster->mQueuedSeek.Exists());
+  MOZ_ASSERT(mSeekJob.Exists());
+  // Because both audio and video decoders are going to be reset in this
+  // method later, we treat a VideoOnly seek task as a normal Accurate
+  // seek task so that while it is resumed, both audio and video playback
+  // are handled.
+  if (mSeekJob.mTarget.IsVideoOnly()) {
+    mSeekJob.mTarget.SetType(SeekTarget::Accurate);
+    mSeekJob.mTarget.SetVideoOnly(false);
+  }
+  mMaster->mQueuedSeek = Move(mSeekJob);
+  SetState<DormantState>();
+  return true;
+}
+
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::
+SeekingState::HandleSeek(SeekTarget aTarget)
+{
+  mMaster->mQueuedSeek.RejectIfExists(__func__);
+  SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
+  SeekJob seekJob;
+  seekJob.mTarget = aTarget;
+  RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
+  SetState<SeekingState>(Move(seekJob));
+  return p.forget();
+}
+
+void
+MediaDecoderStateMachine::
+SeekingState::SeekCompleted()
+{
+  int64_t seekTime = mSeekTask->GetSeekTarget().GetTime().ToMicroseconds();
+  int64_t newCurrentTime = seekTime;
+
+  // Setup timestamp state.
+  RefPtr<MediaData> video = mMaster->VideoQueue().PeekFront();
+  if (seekTime == mMaster->Duration().ToMicroseconds()) {
+    newCurrentTime = seekTime;
+  } else if (mMaster->HasAudio()) {
+    RefPtr<MediaData> audio = mMaster->AudioQueue().PeekFront();
+    // Though we adjust the newCurrentTime in audio-based, and supplemented
+    // by video. For better UX, should NOT bind the slide position to
+    // the first audio data timestamp directly.
+    // While seeking to a position where there's only either audio or video, or
+    // seeking to a position lies before audio or video, we need to check if
+    // seekTime is bounded in suitable duration. See Bug 1112438.
+    int64_t audioStart = audio ? audio->mTime : seekTime;
+    // We only pin the seek time to the video start time if the video frame
+    // contains the seek time.
+    if (video && video->mTime <= seekTime && video->GetEndTime() > seekTime) {
+      newCurrentTime = std::min(audioStart, video->mTime);
+    } else {
+      newCurrentTime = audioStart;
+    }
+  } else {
+    newCurrentTime = video ? video->mTime : seekTime;
+  }
+
+  // Change state to DECODING or COMPLETED now.
+  bool isLiveStream = Resource()->IsLiveStream();
+  State nextState;
+  if (newCurrentTime == mMaster->Duration().ToMicroseconds() && !isLiveStream) {
+    // Seeked to end of media, move to COMPLETED state. Note we don't do
+    // this when playing a live stream, since the end of media will advance
+    // once we download more data!
+    // Explicitly set our state so we don't decode further, and so
+    // we report playback ended to the media element.
+    nextState = DECODER_STATE_COMPLETED;
+  } else {
+    nextState = DECODER_STATE_DECODING;
+  }
+
+  // We want to resolve the seek request prior finishing the first frame
+  // to ensure that the seeked event is fired prior loadeded.
+  mSeekJob.Resolve(nextState == DECODER_STATE_COMPLETED, __func__);
+
+  // Notify FirstFrameLoaded now if we haven't since we've decoded some data
+  // for readyState to transition to HAVE_CURRENT_DATA and fire 'loadeddata'.
+  if (!mMaster->mSentFirstFrameLoadedEvent) {
+    // Only MSE can start seeking before finishing decoding first frames.
+    MOZ_ASSERT(Reader()->ForceZeroStartTime());
+    mMaster->FinishDecodeFirstFrame();
+  }
+
+  // Ensure timestamps are up to date.
+  if (!mSeekJob.mTarget.IsVideoOnly()) {
+    // Don't update playback position for video-only seek.
+    // Otherwise we might have |newCurrentTime > mMediaSink->GetPosition()|
+    // and fail the assertion in GetClock() since we didn't stop MediaSink.
+    mMaster->UpdatePlaybackPositionInternal(newCurrentTime);
+  }
+
+  // Try to decode another frame to detect if we're at the end...
+  SLOG("Seek completed, mCurrentPosition=%lld", mMaster->mCurrentPosition.Ref());
+
+  if (video) {
+    mMaster->mMediaSink->Redraw(Info().mVideo);
+    mMaster->mOnPlaybackEvent.Notify(MediaEventType::Invalidate);
+  }
+
+  if (nextState == DECODER_STATE_COMPLETED) {
+    SetState<CompletedState>();
+  } else {
+    SetState<DecodingState>();
+  }
+}
+
+void
+MediaDecoderStateMachine::
+BufferingState::Step()
+{
+  TimeStamp now = TimeStamp::Now();
+  MOZ_ASSERT(!mBufferingStart.IsNull(), "Must know buffering start time.");
+
+  // With buffering heuristics we will remain in the buffering state if
+  // we've not decoded enough data to begin playback, or if we've not
+  // downloaded a reasonable amount of data inside our buffering time.
+  if (Reader()->UseBufferingHeuristics()) {
+    TimeDuration elapsed = now - mBufferingStart;
+    bool isLiveStream = Resource()->IsLiveStream();
+    if ((isLiveStream || !mMaster->CanPlayThrough()) &&
+        elapsed < TimeDuration::FromSeconds(mBufferingWait * mMaster->mPlaybackRate) &&
+        mMaster->HasLowBufferedData(mBufferingWait * USECS_PER_S) &&
+        Resource()->IsExpectingMoreData()) {
+      SLOG("Buffering: wait %ds, timeout in %.3lfs",
+           mBufferingWait, mBufferingWait - elapsed.ToSeconds());
+      mMaster->ScheduleStateMachineIn(USECS_PER_S);
+      return;
+    }
+  } else if (mMaster->OutOfDecodedAudio() || mMaster->OutOfDecodedVideo()) {
+    MOZ_ASSERT(Reader()->IsWaitForDataSupported(),
+               "Don't yet have a strategy for non-heuristic + non-WaitForData");
+    mMaster->DispatchDecodeTasksIfNeeded();
+    MOZ_ASSERT(mMaster->mMinimizePreroll ||
+               !mMaster->OutOfDecodedAudio() ||
+               Reader()->IsRequestingAudioData() ||
+               Reader()->IsWaitingAudioData());
+    MOZ_ASSERT(mMaster->mMinimizePreroll ||
+               !mMaster->OutOfDecodedVideo() ||
+               Reader()->IsRequestingVideoData() ||
+               Reader()->IsWaitingVideoData());
+    SLOG("In buffering mode, waiting to be notified: outOfAudio: %d, "
+         "mAudioStatus: %s, outOfVideo: %d, mVideoStatus: %s",
+         mMaster->OutOfDecodedAudio(), mMaster->AudioRequestStatus(),
+         mMaster->OutOfDecodedVideo(), mMaster->VideoRequestStatus());
+    return;
+  }
+
+  SLOG("Buffered for %.3lfs", (now - mBufferingStart).ToSeconds());
+  SetState<DecodingState>();
+}
+
+bool
+MediaDecoderStateMachine::
+BufferingState::HandleEndOfStream()
+{
+  if (mMaster->CheckIfDecodeComplete()) {
+    SetState<CompletedState>();
+  } else {
+    // Check if we can exit buffering.
+    mMaster->ScheduleStateMachine();
+  }
+  return true;
+}
+
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::
+BufferingState::HandleSeek(SeekTarget aTarget)
+{
+  mMaster->mQueuedSeek.RejectIfExists(__func__);
+  SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
+  SeekJob seekJob;
+  seekJob.mTarget = aTarget;
+  RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
+  SetState<SeekingState>(Move(seekJob));
+  return p.forget();
+}
+
+RefPtr<MediaDecoder::SeekPromise>
+MediaDecoderStateMachine::
+CompletedState::HandleSeek(SeekTarget aTarget)
+{
+  mMaster->mQueuedSeek.RejectIfExists(__func__);
+  SLOG("Changed state to SEEKING (to %lld)", aTarget.GetTime().ToMicroseconds());
+  SeekJob seekJob;
+  seekJob.mTarget = aTarget;
+  RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
+  SetState<SeekingState>(Move(seekJob));
+  return p.forget();
+}
+
+void
+MediaDecoderStateMachine::
+ShutdownState::Enter()
+{
+  auto master = mMaster;
+
+  master->mIsShutdown = true;
+  master->mDelayedScheduler.Reset();
+  master->mBufferedUpdateRequest.DisconnectIfExists();
+  master->mQueuedSeek.RejectIfExists(__func__);
+
+  // Shutdown happens while decode timer is active, we need to disconnect and
+  // dispose of the timer.
+  master->mVideoDecodeSuspendTimer.Reset();
+
+  master->mCDMProxyPromise.DisconnectIfExists();
+
+  if (master->IsPlaying()) {
+    master->StopPlayback();
+  }
+
+  // To break the cycle-reference between MediaDecoderReaderWrapper and MDSM.
+  master->CancelMediaDecoderReaderWrapperCallback();
+
+  master->Reset();
+
+  master->mMediaSink->Shutdown();
+
+  // Prevent dangling pointers by disconnecting the listeners.
+  master->mAudioQueueListener.Disconnect();
+  master->mVideoQueueListener.Disconnect();
+  master->mMetadataManager.Disconnect();
+
+  // Disconnect canonicals and mirrors before shutting down our task queue.
+  master->mBuffered.DisconnectIfConnected();
+  master->mIsReaderSuspended.DisconnectIfConnected();
+  master->mEstimatedDuration.DisconnectIfConnected();
+  master->mExplicitDuration.DisconnectIfConnected();
+  master->mPlayState.DisconnectIfConnected();
+  master->mNextPlayState.DisconnectIfConnected();
+  master->mVolume.DisconnectIfConnected();
+  master->mPreservesPitch.DisconnectIfConnected();
+  master->mSameOriginMedia.DisconnectIfConnected();
+  master->mMediaPrincipalHandle.DisconnectIfConnected();
+  master->mPlaybackBytesPerSecond.DisconnectIfConnected();
+  master->mPlaybackRateReliable.DisconnectIfConnected();
+  master->mDecoderPosition.DisconnectIfConnected();
+  master->mMediaSeekable.DisconnectIfConnected();
+  master->mMediaSeekableOnlyInBufferedRanges.DisconnectIfConnected();
+  master->mIsVisible.DisconnectIfConnected();
+
+  master->mDuration.DisconnectAll();
+  master->mIsShutdown.DisconnectAll();
+  master->mNextFrameStatus.DisconnectAll();
+  master->mCurrentPosition.DisconnectAll();
+  master->mPlaybackOffset.DisconnectAll();
+  master->mIsAudioDataAudible.DisconnectAll();
+
+  // Shut down the watch manager to stop further notifications.
+  master->mWatchManager.Shutdown();
+}
+
 #define INIT_WATCHABLE(name, val) \
   name(val, "MediaDecoderStateMachine::" #name)
 #define INIT_MIRROR(name, val) \
   name(mTaskQueue, val, "MediaDecoderStateMachine::" #name " (Mirror)")
 #define INIT_CANONICAL(name, val) \
   name(mTaskQueue, val, "MediaDecoderStateMachine::" #name " (Canonical)")
 
 MediaDecoderStateMachine::MediaDecoderStateMachine(MediaDecoder* aDecoder,
@@ -1828,53 +2051,16 @@ void MediaDecoderStateMachine::MaybeStar
   if (!IsPlaying()) {
     mMediaSink->SetPlaying(true);
     MOZ_ASSERT(IsPlaying());
   }
 
   DispatchDecodeTasksIfNeeded();
 }
 
-void
-MediaDecoderStateMachine::MaybeStartBuffering()
-{
-  MOZ_ASSERT(OnTaskQueue());
-  // Buffering makes senses only after decoding first frames.
-  MOZ_ASSERT(mSentFirstFrameLoadedEvent);
-  MOZ_ASSERT(mState == DECODER_STATE_DECODING);
-
-  // Don't enter buffering when MediaDecoder is not playing.
-  if (mPlayState != MediaDecoder::PLAY_STATE_PLAYING) {
-    return;
-  }
-
-  // Don't enter buffering while prerolling so that the decoder has a chance to
-  // enqueue some decoded data before we give up and start buffering.
-  if (!IsPlaying()) {
-    return;
-  }
-
-  // No more data to download. No need to enter buffering.
-  if (!mResource->IsExpectingMoreData()) {
-    return;
-  }
-
-  bool shouldBuffer;
-  if (mReader->UseBufferingHeuristics()) {
-    shouldBuffer = HasLowDecodedData() && HasLowBufferedData();
-  } else {
-    MOZ_ASSERT(mReader->IsWaitForDataSupported());
-    shouldBuffer = (OutOfDecodedAudio() && mReader->IsWaitingAudioData()) ||
-                   (OutOfDecodedVideo() && mReader->IsWaitingVideoData());
-  }
-  if (shouldBuffer) {
-    SetState(DECODER_STATE_BUFFERING);
-  }
-}
-
 void MediaDecoderStateMachine::UpdatePlaybackPositionInternal(int64_t aTime)
 {
   MOZ_ASSERT(OnTaskQueue());
   SAMPLE_LOG("UpdatePlaybackPositionInternal(%lld)", aTime);
 
   mCurrentPosition = aTime;
   NS_ASSERTION(mCurrentPosition >= 0, "CurrentTime should be positive!");
   mObservedDuration = std::max(mObservedDuration.Ref(),
@@ -1914,64 +2100,16 @@ MediaDecoderStateMachine::ToStateStr(Sta
 
 const char*
 MediaDecoderStateMachine::ToStateStr()
 {
   MOZ_ASSERT(OnTaskQueue());
   return ToStateStr(mState);
 }
 
-void
-MediaDecoderStateMachine::SetState(State aState)
-{
-  MOZ_ASSERT(OnTaskQueue());
-  if (mState == aState) {
-    return;
-  }
-
-  DECODER_LOG("MDSM state: %s -> %s", ToStateStr(), ToStateStr(aState));
-
-  MOZ_ASSERT(mState == mStateObj->GetState());
-  mStateObj->Exit();
-  mState = aState;
-
-  switch (mState) {
-    case DECODER_STATE_DECODING_METADATA:
-      mStateObj = MakeUnique<DecodeMetadataState>(this);
-      break;
-    case DECODER_STATE_WAIT_FOR_CDM:
-      mStateObj = MakeUnique<WaitForCDMState>(this);
-      break;
-    case DECODER_STATE_DORMANT:
-      mStateObj = MakeUnique<DormantState>(this);
-      break;
-    case DECODER_STATE_DECODING_FIRSTFRAME:
-      mStateObj = MakeUnique<DecodingFirstFrameState>(this);
-      break;
-    case DECODER_STATE_DECODING:
-      mStateObj = MakeUnique<DecodingState>(this);
-      break;
-    case DECODER_STATE_BUFFERING:
-      mStateObj = MakeUnique<BufferingState>(this);
-      break;
-    case DECODER_STATE_COMPLETED:
-      mStateObj = MakeUnique<CompletedState>(this);
-      break;
-    case DECODER_STATE_SHUTDOWN:
-      mStateObj = MakeUnique<ShutdownState>(this);
-      break;
-    default:
-      MOZ_ASSERT_UNREACHABLE("Invalid state.");
-      break;
-  }
-
-  MOZ_ASSERT(mState == mStateObj->GetState());
-  mStateObj->Enter();
-}
-
 void MediaDecoderStateMachine::VolumeChanged()
 {
   MOZ_ASSERT(OnTaskQueue());
   mMediaSink->SetVolume(mVolume);
 }
 
 void MediaDecoderStateMachine::RecomputeDuration()
 {
@@ -2023,84 +2161,17 @@ MediaDecoderStateMachine::SetDormant(boo
   MOZ_ASSERT(OnTaskQueue());
   mStateObj->HandleDormant(aDormant);
 }
 
 RefPtr<ShutdownPromise>
 MediaDecoderStateMachine::Shutdown()
 {
   MOZ_ASSERT(OnTaskQueue());
-
-  SetState(DECODER_STATE_SHUTDOWN);
-
-  mDelayedScheduler.Reset();
-
-  mBufferedUpdateRequest.DisconnectIfExists();
-
-  mQueuedSeek.RejectIfExists(__func__);
-
-  // Shutdown happens will decode timer is active, we need to disconnect and
-  // dispose of the timer.
-  mVideoDecodeSuspendTimer.Reset();
-
-  mCDMProxyPromise.DisconnectIfExists();
-
-  if (IsPlaying()) {
-    StopPlayback();
-  }
-
-  // To break the cycle-reference between MediaDecoderReaderWrapper and MDSM.
-  CancelMediaDecoderReaderWrapperCallback();
-
-  Reset();
-
-  mMediaSink->Shutdown();
-
-  // Prevent dangling pointers by disconnecting the listeners.
-  mAudioQueueListener.Disconnect();
-  mVideoQueueListener.Disconnect();
-  mMetadataManager.Disconnect();
-
-  // Disconnect canonicals and mirrors before shutting down our task queue.
-  mBuffered.DisconnectIfConnected();
-  mIsReaderSuspended.DisconnectIfConnected();
-  mEstimatedDuration.DisconnectIfConnected();
-  mExplicitDuration.DisconnectIfConnected();
-  mPlayState.DisconnectIfConnected();
-  mNextPlayState.DisconnectIfConnected();
-  mVolume.DisconnectIfConnected();
-  mPreservesPitch.DisconnectIfConnected();
-  mSameOriginMedia.DisconnectIfConnected();
-  mMediaPrincipalHandle.DisconnectIfConnected();
-  mPlaybackBytesPerSecond.DisconnectIfConnected();
-  mPlaybackRateReliable.DisconnectIfConnected();
-  mDecoderPosition.DisconnectIfConnected();
-  mMediaSeekable.DisconnectIfConnected();
-  mMediaSeekableOnlyInBufferedRanges.DisconnectIfConnected();
-  mIsVisible.DisconnectIfConnected();
-
-  mDuration.DisconnectAll();
-  mIsShutdown.DisconnectAll();
-  mNextFrameStatus.DisconnectAll();
-  mCurrentPosition.DisconnectAll();
-  mPlaybackOffset.DisconnectAll();
-  mIsAudioDataAudible.DisconnectAll();
-
-  // Shut down the watch manager to stop further notifications.
-  mWatchManager.Shutdown();
-
-  DECODER_LOG("Shutdown started");
-
-  // Put a task in the decode queue to shutdown the reader.
-  // the queue to spin down.
-  return mReader->Shutdown()
-    ->Then(OwnerThread(), __func__, this,
-           &MediaDecoderStateMachine::FinishShutdown,
-           &MediaDecoderStateMachine::FinishShutdown)
-    ->CompletionPromise();
+  return mStateObj->HandleShutdown();
 }
 
 void MediaDecoderStateMachine::PlayStateChanged()
 {
   MOZ_ASSERT(OnTaskQueue());
 
   if (mPlayState != MediaDecoder::PLAY_STATE_PLAYING) {
     mVideoDecodeSuspendTimer.Reset();
@@ -2234,17 +2305,17 @@ void MediaDecoderStateMachine::Visibilit
                                  type,
                                  MediaDecoderEventVisibility::Suppressed,
                                  true /* aVideoOnly */);
 
     RefPtr<MediaDecoder::SeekPromise> p = seekJob.mPromise.Ensure(__func__);
     p->Then(AbstractThread::MainThread(), __func__,
             [start, info, hw](){ ReportRecoveryTelemetry(start, info, hw); },
             [](){});
-    InitiateSeek(Move(seekJob));
+    mStateObj->SetState<SeekingState>(Move(seekJob));
   }
 }
 
 void MediaDecoderStateMachine::BufferedRangeUpdated()
 {
   MOZ_ASSERT(OnTaskQueue());
 
   // While playing an unseekable stream of unknown duration, mObservedDuration
@@ -2367,29 +2438,16 @@ MediaDecoderStateMachine::DispatchDecode
     DECODER_LOG("Dispatching SetIdle() audioQueue=%lld videoQueue=%lld",
                 GetDecodedAudioDuration(),
                 VideoQueue().Duration());
     mReader->SetIdle();
   }
 }
 
 void
-MediaDecoderStateMachine::InitiateSeek(SeekJob aSeekJob)
-{
-  MOZ_ASSERT(OnTaskQueue());
-
-  // Note we can't call SetState(DECODER_STATE_SEEKING) which does nothing
-  // if we are already in the SEEKING state.
-  mStateObj->Exit();
-  mState = DECODER_STATE_SEEKING;
-  mStateObj = MakeUnique<SeekingState>(this, Move(aSeekJob));
-  mStateObj->Enter();
-}
-
-void
 MediaDecoderStateMachine::DispatchAudioDecodeTaskIfNeeded()
 {
   MOZ_ASSERT(OnTaskQueue());
   if (!IsShutdown() && NeedToDecodeAudio()) {
     EnsureAudioDecodeTaskQueued();
   }
 }
 
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -342,18 +342,16 @@ private:
   // Resets all state related to decoding and playback, emptying all buffers
   // and aborting all pending operations on the decode task queue.
   void Reset(TrackSet aTracks = TrackSet(TrackInfo::kAudioTrack,
                                          TrackInfo::kVideoTrack));
 
 protected:
   virtual ~MediaDecoderStateMachine();
 
-  void SetState(State aState);
-
   void BufferedRangeUpdated();
 
   void ReaderSuspendedChanged();
 
   // Inserts MediaData* samples into their respective MediaQueues.
   // aSample must not be null.
 
   void Push(MediaData* aSample, MediaData::Type aSampleType);
@@ -453,36 +451,29 @@ protected:
   // The decoder monitor must be held.
   void StopPlayback();
 
   // If the conditions are right, sets internal state which causes playback
   // of media to begin or resume.
   // Must be called with the decode monitor held.
   void MaybeStartPlayback();
 
-  // Check to see if we don't have enough data to play up to the next frame.
-  // If we don't, switch to buffering mode.
-  void MaybeStartBuffering();
-
   // Moves the decoder into the shutdown state, and dispatches an error
   // event to the media element. This begins shutting down the decoder.
   // The decoder monitor must be held. This is only called on the
   // decode thread.
   void DecodeError(const MediaResult& aError);
 
   // Dispatches a LoadedMetadataEvent.
   // This is threadsafe and can be called on any thread.
   // The decoder monitor must be held.
   void EnqueueLoadedMetadataEvent();
 
   void EnqueueFirstFrameLoadedEvent();
 
-  // Clears any previous seeking state and initiates a new seek on the decoder.
-  void InitiateSeek(SeekJob aSeekJob);
-
   void DispatchAudioDecodeTaskIfNeeded();
   void DispatchVideoDecodeTaskIfNeeded();
 
   // Dispatch a task to decode audio if there is not.
   void EnsureAudioDecodeTaskQueued();
 
   // Dispatch a task to decode video if there is not.
   void EnsureVideoDecodeTaskQueued();
--- a/dom/media/PeerConnection.js
+++ b/dom/media/PeerConnection.js
@@ -1592,18 +1592,16 @@ RTCPeerConnectionStatic.prototype = {
 
   registerPeerConnectionLifecycleCallback: function(cb) {
     _globalPCList._registerPeerConnectionLifecycleCallback(this._winID, cb);
   },
 };
 
 function RTCDTMFSender(sender) {
   this._sender = sender;
-  this.duration = 100;
-  this.interToneGap = 70;
 }
 RTCDTMFSender.prototype = {
   classDescription: "RTCDTMFSender",
   classID: PC_DTMF_SENDER_CID,
   contractID: PC_DTMF_SENDER_CONTRACT,
   QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports]),
 
   get toneBuffer() {
@@ -1621,20 +1619,18 @@ RTCDTMFSender.prototype = {
   insertDTMF: function(tones, duration, interToneGap) {
     this._sender._pc._checkClosed();
 
     if (this._sender._pc._senders.indexOf(this._sender.__DOM_IMPL__) == -1) {
       throw new this._sender._pc._win.DOMException("RTCRtpSender is stopped",
                                                    "InvalidStateError");
     }
 
-    this.duration = Math.max(40, Math.min(duration, 6000));
-
+    duration = Math.max(40, Math.min(duration, 6000));
     if (interToneGap < 30) interToneGap = 30;
-    this.interToneGap = interToneGap;
 
     tones = tones.toUpperCase();
 
     if (tones.match(/[^0-9A-D#*,]/)) {
       throw new this._sender._pc._win.DOMException("Invalid DTMF characters",
                                                    "InvalidCharacterError");
     }
 
--- a/dom/media/tests/mochitest/test_peerConnection_insertDTMF.html
+++ b/dom/media/tests/mochitest/test_peerConnection_insertDTMF.html
@@ -14,26 +14,21 @@ createHTML({
 
 function insertdtmftest(pc) {
   ok(pc.getSenders().length > 0, "have senders");
   var sender = pc.getSenders()[0];
   ok(sender.dtmf, "sender has dtmf object");
 
   ok(sender.dtmf.toneBuffer === "", "sender should start with empty tonebuffer");
 
+  // These will trigger assertions on debug builds if we do not enforce the
+  // specified minimums and maximums for duration and interToneGap.
   sender.dtmf.insertDTMF("A", 10);
-  is(sender.dtmf.duration, 40, "minimum duration is 40");
   sender.dtmf.insertDTMF("A", 10000);
-  is(sender.dtmf.duration, 6000, "maximum duration is 6000");
   sender.dtmf.insertDTMF("A", 70, 10);
-  is(sender.dtmf.duration, 70, "default duration is 70");
-  is(sender.dtmf.interToneGap, 30, "minimum interToneGap is 30");
-  sender.dtmf.insertDTMF("", 100, 40);
-  is(sender.dtmf.duration, 100, "duration is 70");
-  is(sender.dtmf.interToneGap, 40, "interToneGap is 40");
 
   var threw = false;
   try {
     sender.dtmf.insertDTMF("bad tones");
   } catch (ex) {
     threw = true;
     is(ex.code, DOMException.INVALID_CHARACTER_ERR, "Expected InvalidCharacterError");
   }
--- a/dom/webidl/RTCDTMFSender.webidl
+++ b/dom/webidl/RTCDTMFSender.webidl
@@ -9,11 +9,9 @@
 
 [JSImplementation="@mozilla.org/dom/rtcdtmfsender;1"]
 interface RTCDTMFSender : EventTarget {
     void insertDTMF(DOMString tones,
                     optional unsigned long duration = 100,
                     optional unsigned long interToneGap = 70);
              attribute EventHandler  ontonechange;
     readonly attribute DOMString     toneBuffer;
-    readonly attribute unsigned long duration;
-    readonly attribute unsigned long interToneGap;
 };
--- a/gfx/layers/composite/AsyncCompositionManager.cpp
+++ b/gfx/layers/composite/AsyncCompositionManager.cpp
@@ -668,54 +668,36 @@ SampleAnimations(Layer* aLayer, TimeStam
           AnimData& animData = animationData[i];
 
           activeAnimations = true;
 
           MOZ_ASSERT(!animation.startTime().IsNull(),
                      "Failed to resolve start time of pending animations");
           TimeDuration elapsedDuration =
             (aPoint - animation.startTime()).MultDouble(animation.playbackRate());
-          // Skip animations that are yet to start.
-          //
-          // Currently, this should only happen when the refresh driver is under test
-          // control and is made to produce a time in the past or is restored from
-          // test control causing it to jump backwards in time.
-          //
-          // Since activeAnimations is true, this could mean we keep compositing
-          // unnecessarily during the delay, but so long as this only happens while
-          // the refresh driver is under test control that should be ok.
-          if (elapsedDuration.ToSeconds() < 0) {
-            continue;
-          }
-
           TimingParams timing;
           timing.mDuration.emplace(animation.duration());
-          // Currently animations run on the compositor have their delay factored
-          // into their start time, hence the delay is effectively zero.
-          timing.mDelay = TimeDuration(0);
+          timing.mDelay = animation.delay();
           timing.mIterations = animation.iterations();
           timing.mIterationStart = animation.iterationStart();
           timing.mDirection =
             static_cast<dom::PlaybackDirection>(animation.direction());
-          // Animations typically only run on the compositor during their active
-          // interval but if we end up sampling them outside that range (for
-          // example, while they are waiting to be removed) we currently just
-          // assume that we should fill.
-          timing.mFill = dom::FillMode::Both;
+          timing.mFill = static_cast<dom::FillMode>(animation.fillMode());
           timing.mFunction =
             AnimationUtils::TimingFunctionToComputedTimingFunction(
               animation.easingFunction());
 
           ComputedTiming computedTiming =
             dom::AnimationEffectReadOnly::GetComputedTimingAt(
               Nullable<TimeDuration>(elapsedDuration), timing,
               animation.playbackRate());
 
-          MOZ_ASSERT(!computedTiming.mProgress.IsNull(),
-                     "iteration progress should not be null");
+          if (computedTiming.mProgress.IsNull()) {
+            continue;
+          }
 
           uint32_t segmentIndex = 0;
           size_t segmentSize = animation.segments().Length();
           AnimationSegment* segment = animation.segments().Elements();
           while (segment->endPortion() < computedTiming.mProgress.Value() &&
                  segmentIndex < segmentSize - 1) {
             ++segment;
             ++segmentIndex;
--- a/gfx/layers/ipc/LayersMessages.ipdlh
+++ b/gfx/layers/ipc/LayersMessages.ipdlh
@@ -173,20 +173,18 @@ struct TransformData {
 };
 
 union AnimationData {
   null_t;
   TransformData;
 };
 
 struct Animation {
-  // Unlike in nsAnimationManager, this start time is at the end of the
-  // delay.  If the delay is changed dynamically, the layer's data will
-  // be updated.
   TimeStamp startTime;
+  TimeDuration delay;
   // The value of the animation's current time at the moment it was created.
   // For animations that are waiting to start, their startTime will be null.
   // Once the animation is ready to start, we calculate an appropriate value
   // of startTime such that we begin playback from initialCurrentTime.
   TimeDuration initialCurrentTime;
   TimeDuration duration;
   // For each frame, the interpolation point is computed based on the
   // startTime, the direction, the duration, and the current time.
@@ -194,16 +192,18 @@ struct Animation {
   AnimationSegment[] segments;
   // Number of times to repeat the animation, including positive infinity.
   // Values <= 0 mean the animation will not play (although events are still
   // dispatched on the main thread).
   float iterations;
   float iterationStart;
   // This uses the NS_STYLE_ANIMATION_DIRECTION_* constants.
   uint8_t direction;
+  // This uses dom::FillMode.
+  uint8_t fillMode;
   nsCSSPropertyID property;
   AnimationData data;
   float playbackRate;
   // This is used in the transformed progress calculation.
   TimingFunction easingFunction;
   uint8_t iterationComposite;
 };
 
--- a/js/src/asmjs/WasmBinaryToExperimentalText.cpp
+++ b/js/src/asmjs/WasmBinaryToExperimentalText.cpp
@@ -54,74 +54,16 @@ enum PrintOperatorPrecedence
     NegatePrecedence = 12,
     EqzPrecedence = 12,
     OperatorPrecedence = 15,
     LoadOperatorPrecedence = 15,
     CallPrecedence = 15,
     GroupPrecedence = 16,
 };
 
-// StringBuffer wrapper to track the position (line and column) within the generated
-// source.
-class WasmPrintBuffer
-{
-    StringBuffer& stringBuffer_;
-    uint32_t lineno_;
-    uint32_t column_;
-
-  public:
-    explicit WasmPrintBuffer(StringBuffer& stringBuffer) : stringBuffer_(stringBuffer), lineno_(1), column_(1) {}
-    inline char processChar(char ch) {
-        if (ch == '\n') {
-            lineno_++; column_ = 1;
-        } else
-            column_++;
-        return ch;
-    }
-    inline char16_t processChar(char16_t ch) {
-        if (ch == '\n') {
-            lineno_++; column_ = 1;
-        } else
-            column_++;
-        return ch;
-    }
-    bool append(const char ch) {
-        return stringBuffer_.append(processChar(ch));
-    }
-    bool append(const char16_t ch) {
-        return stringBuffer_.append(processChar(ch));
-    }
-    bool append(const char* str, size_t length) {
-        for (size_t i = 0; i < length; i++)
-            processChar(str[i]);
-        return stringBuffer_.append(str, length);
-    }
-    bool append(const char16_t* begin, const char16_t* end) {
-        for (const char16_t* p = begin; p != end; p++)
-            processChar(*p);
-        return stringBuffer_.append(begin, end);
-    }
-    bool append(const char16_t* str, size_t length) {
-        return append(str, str + length);
-    }
-    template <size_t ArrayLength>
-    bool append(const char (&array)[ArrayLength]) {
-        return append(array, ArrayLength - 1);
-    }
-    char16_t getChar(size_t index) {
-        return stringBuffer_.getChar(index);
-    }
-    size_t length() {
-        return stringBuffer_.length();
-    }
-    StringBuffer& stringBuffer() { return stringBuffer_; }
-    uint32_t lineno() { return lineno_; }
-    uint32_t column() { return column_; }
-};
-
 struct WasmPrintContext
 {
     JSContext* cx;
     AstModule* module;
     WasmPrintBuffer& buffer;
     const ExperimentalTextFormatting& f;
     GeneratedSourceMap* maybeSourceMap;
     uint32_t indent;
--- a/js/src/asmjs/WasmBinaryToExperimentalText.h
+++ b/js/src/asmjs/WasmBinaryToExperimentalText.h
@@ -14,20 +14,19 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 #ifndef wasm_binary_to_experimental_text_h
 #define wasm_binary_to_experimental_text_h
 
-#include "mozilla/Vector.h"
-
 #include "NamespaceImports.h"
 
+#include "asmjs/WasmGeneratedSourceMap.h"
 #include "gc/Rooting.h"
 #include "js/Class.h"
 
 namespace js {
 
 class StringBuffer;
 
 namespace wasm {
@@ -40,69 +39,16 @@ struct ExperimentalTextFormatting
 
     ExperimentalTextFormatting()
      : allowAsciiOperators(true),
        reduceParens(true),
        groupBlocks(true)
     {}
 };
 
-// The generated source location for the AST node/expression. The offset field refers
-// an offset in an binary format file.
-struct ExprLoc
-{
-    uint32_t lineno;
-    uint32_t column;
-    uint32_t offset;
-    ExprLoc() : lineno(0), column(0), offset(0) {}
-    ExprLoc(uint32_t lineno_, uint32_t column_, uint32_t offset_) : lineno(lineno_), column(column_), offset(offset_) {}
-};
-
-typedef mozilla::Vector<ExprLoc, 0, TempAllocPolicy> ExprLocVector;
-
-// The generated source WebAssembly function lines and expressions ranges.
-struct FunctionLoc
-{
-    size_t startExprsIndex;
-    size_t endExprsIndex;
-    uint32_t startLineno;
-    uint32_t endLineno;
-    FunctionLoc(size_t startExprsIndex_, size_t endExprsIndex_, uint32_t startLineno_, uint32_t endLineno_)
-      : startExprsIndex(startExprsIndex_),
-        endExprsIndex(endExprsIndex_),
-        startLineno(startLineno_),
-        endLineno(endLineno_)
-    {}
-};
-
-typedef mozilla::Vector<FunctionLoc, 0, TempAllocPolicy> FunctionLocVector;
-
-// The generated source map for WebAssembly binary file. This map is generated during
-// building the text buffer (see BinaryToExperimentalText).
-class GeneratedSourceMap
-{
-    ExprLocVector exprlocs_;
-    FunctionLocVector functionlocs_;
-    uint32_t totalLines_;
-
-  public:
-    explicit GeneratedSourceMap(JSContext* cx)
-     : exprlocs_(cx),
-       functionlocs_(cx),
-       totalLines_(0)
-    {}
-    ExprLocVector& exprlocs() { return exprlocs_; }
-    FunctionLocVector& functionlocs() { return functionlocs_; }
-
-    uint32_t totalLines() { return totalLines_; }
-    void setTotalLines(uint32_t val) { totalLines_ = val; }
-};
-
-typedef UniquePtr<GeneratedSourceMap> UniqueGeneratedSourceMap;
-
 // Translate the given binary representation of a wasm module into the module's textual
 // representation.
 
 MOZ_MUST_USE bool
 BinaryToExperimentalText(JSContext* cx, const uint8_t* bytes, size_t length, StringBuffer& buffer,
                          const ExperimentalTextFormatting& formatting = ExperimentalTextFormatting(),
                          GeneratedSourceMap* sourceMap = nullptr);
 
--- a/js/src/asmjs/WasmBinaryToText.cpp
+++ b/js/src/asmjs/WasmBinaryToText.cpp
@@ -34,24 +34,27 @@ using namespace js::wasm;
 using mozilla::IsInfinite;
 using mozilla::IsNaN;
 using mozilla::IsNegativeZero;
 
 struct WasmRenderContext
 {
     JSContext* cx;
     AstModule* module;
-    StringBuffer& buffer;
+    WasmPrintBuffer& buffer;
+    GeneratedSourceMap* maybeSourceMap;
     uint32_t indent;
 
     uint32_t currentFuncIndex;
 
-    WasmRenderContext(JSContext* cx, AstModule* module, StringBuffer& buffer)
-      : cx(cx), module(module), buffer(buffer), indent(0), currentFuncIndex(0)
+    WasmRenderContext(JSContext* cx, AstModule* module, WasmPrintBuffer& buffer, GeneratedSourceMap* sourceMap)
+      : cx(cx), module(module), buffer(buffer), maybeSourceMap(sourceMap), indent(0), currentFuncIndex(0)
     {}
+
+    StringBuffer& sb() { return buffer.stringBuffer(); }
 };
 
 /*****************************************************************************/
 // utilities
 
 static bool
 RenderIndent(WasmRenderContext& c)
 {
@@ -60,51 +63,51 @@ RenderIndent(WasmRenderContext& c)
             return false;
     }
     return true;
 }
 
 static bool
 RenderInt32(WasmRenderContext& c, int32_t num)
 {
-    return NumberValueToStringBuffer(c.cx, Int32Value(num), c.buffer);
+    return NumberValueToStringBuffer(c.cx, Int32Value(num), c.sb());
 }
 
 static bool
 RenderInt64(WasmRenderContext& c, int64_t num)
 {
     if (num < 0 && !c.buffer.append("-"))
         return false;
     if (!num)
         return c.buffer.append("0");
-    return RenderInBase<10>(c.buffer, mozilla::Abs(num));
+    return RenderInBase<10>(c.sb(), mozilla::Abs(num));
 }
 
 static bool
 RenderDouble(WasmRenderContext& c, RawF64 num)
 {
     double d = num.fp();
     if (IsNaN(d))
-        return RenderNaN(c.buffer, num);
+        return RenderNaN(c.sb(), num);
     if (IsNegativeZero(d))
         return c.buffer.append("-0");
     if (IsInfinite(d)) {
         if (d > 0)
             return c.buffer.append("infinity");
         return c.buffer.append("-infinity");
     }
-    return NumberValueToStringBuffer(c.cx, DoubleValue(d), c.buffer);
+    return NumberValueToStringBuffer(c.cx, DoubleValue(d), c.sb());
 }
 
 static bool
 RenderFloat32(WasmRenderContext& c, RawF32 num)
 {
     float f = num.fp();
     if (IsNaN(f))
-        return RenderNaN(c.buffer, num);
+        return RenderNaN(c.sb(), num);
     return RenderDouble(c, RawF64(double(f)));
 }
 
 static bool
 RenderEscapedString(WasmRenderContext& c, const AstName& s)
 {
     size_t length = s.length();
     const char16_t* p = s.begin();
@@ -218,45 +221,56 @@ RenderBlockNameAndSignature(WasmRenderCo
     }
 
     return true;
 }
 
 static bool
 RenderExpr(WasmRenderContext& c, AstExpr& expr);
 
+#define MAP_AST_EXPR(c, expr)                                                         \
+    if (c.maybeSourceMap) {                                                           \
+        uint32_t lineno = c.buffer.lineno();                                          \
+        uint32_t column = c.buffer.column();                                          \
+        if (!c.maybeSourceMap->exprlocs().emplaceBack(lineno, column, expr.offset())) \
+            return false;                                                             \
+    }
+
 /*****************************************************************************/
 // binary format parsing and rendering
 
 static bool
-RenderNop(WasmRenderContext& c)
+RenderNop(WasmRenderContext& c, AstNop& nop)
 {
     if (!RenderIndent(c))
         return false;
+    MAP_AST_EXPR(c, nop);
     return c.buffer.append("nop\n");
 }
 
 static bool
 RenderDrop(WasmRenderContext& c, AstDrop& drop)
 {
     if (!RenderExpr(c, drop.value()))
         return false;
 
     if (!RenderIndent(c))
         return false;
+    MAP_AST_EXPR(c, drop);
     if (!c.buffer.append("drop\n"))
         return false;
     return true;
 }
 
 static bool
-RenderUnreachable(WasmRenderContext& c)
+RenderUnreachable(WasmRenderContext& c, AstUnreachable& unreachable)
 {
     if (!RenderIndent(c))
         return false;
+    MAP_AST_EXPR(c, unreachable);
     return c.buffer.append("unreachable\n");
 }
 
 static bool
 RenderCallArgs(WasmRenderContext& c, const AstExprVector& args)
 {
     for (uint32_t i = 0; i < args.length(); i++) {
         if (!RenderExpr(c, *args[i]))
@@ -270,16 +284,17 @@ static bool
 RenderCall(WasmRenderContext& c, AstCall& call)
 {
     if (!RenderCallArgs(c, call.args()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, call);
     if (call.expr() == Expr::Call) {
         if (!c.buffer.append("call "))
             return false;
     } else if (call.expr() == Expr::CallImport) {
         if (!c.buffer.append("call_import "))
             return false;
     } else {
         return false;
@@ -301,16 +316,17 @@ RenderCallIndirect(WasmRenderContext& c,
         return false;
 
     if (!RenderExpr(c, *call.index()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, call);
     if (!c.buffer.append("call_indirect "))
         return false;
     if (!RenderRef(c, call.sig()))
         return false;
 
     if (!c.buffer.append('\n'))
         return false;
 
@@ -318,16 +334,17 @@ RenderCallIndirect(WasmRenderContext& c,
 }
 
 static bool
 RenderConst(WasmRenderContext& c, AstConst& cst)
 {
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, cst);
     if (!RenderValType(c, cst.val().type()))
         return false;
     if (!c.buffer.append(".const "))
         return false;
 
     switch (ToExprType(cst.val().type())) {
       case ExprType::I32:
         if (!RenderInt32(c, (uint32_t)cst.val().i32()))
@@ -355,16 +372,17 @@ RenderConst(WasmRenderContext& c, AstCon
 }
 
 static bool
 RenderGetLocal(WasmRenderContext& c, AstGetLocal& gl)
 {
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, gl);
     if (!c.buffer.append("get_local "))
         return false;
     if (!RenderRef(c, gl.local()))
         return false;
     if (!c.buffer.append('\n'))
         return false;
     return true;
 }
@@ -373,16 +391,17 @@ static bool
 RenderSetLocal(WasmRenderContext& c, AstSetLocal& sl)
  {
     if (!RenderExpr(c, sl.value()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, sl);
     if (!c.buffer.append("set_local "))
         return false;
     if (!RenderRef(c, sl.local()))
         return false;
 
     if (!c.buffer.append('\n'))
         return false;
     return true;
@@ -392,16 +411,17 @@ static bool
 RenderTeeLocal(WasmRenderContext& c, AstTeeLocal& tl)
 {
     if (!RenderExpr(c, tl.value()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, tl);
     if (!c.buffer.append("tee_local "))
         return false;
     if (!RenderRef(c, tl.local()))
         return false;
 
     if (!c.buffer.append('\n'))
         return false;
     return true;
@@ -418,16 +438,17 @@ RenderExprList(WasmRenderContext& c, con
 }
 
 static bool
 RenderBlock(WasmRenderContext& c, AstBlock& block)
 {
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, block);
     if (block.expr() == Expr::Block) {
         if (!c.buffer.append("block"))
             return false;
     } else if (block.expr() == Expr::Loop) {
         if (!c.buffer.append("loop"))
             return false;
     } else
         return false;
@@ -480,16 +501,17 @@ static bool
 RenderUnaryOperator(WasmRenderContext& c, AstUnaryOperator& op)
 {
     if (!RenderExpr(c, *op.op()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, op);
     const char* opStr;
     switch (op.expr()) {
       case Expr::I32Eqz:     opStr = "i32.eqz"; break;
       case Expr::I32Clz:     opStr = "i32.clz"; break;
       case Expr::I32Ctz:     opStr = "i32.ctz"; break;
       case Expr::I32Popcnt:  opStr = "i32.popcnt"; break;
       case Expr::I64Clz:     opStr = "i64.clz"; break;
       case Expr::I64Ctz:     opStr = "i64.ctz"; break;
@@ -521,16 +543,17 @@ RenderBinaryOperator(WasmRenderContext& 
     if (!RenderExpr(c, *op.lhs()))
         return false;
     if (!RenderExpr(c, *op.rhs()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, op);
     const char* opStr;
     switch (op.expr()) {
       case Expr::I32Add:      opStr = "i32.add"; break;
       case Expr::I32Sub:      opStr = "i32.sub"; break;
       case Expr::I32Mul:      opStr = "i32.mul"; break;
       case Expr::I32DivS:     opStr = "i32.div_s"; break;
       case Expr::I32DivU:     opStr = "i32.div_u"; break;
       case Expr::I32RemS:     opStr = "i32.rem_s"; break;
@@ -586,16 +609,17 @@ RenderTernaryOperator(WasmRenderContext&
     if (!RenderExpr(c, *op.op1()))
         return false;
     if (!RenderExpr(c, *op.op2()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, op);
     const char* opStr;
     switch (op.expr()) {
       case Expr::Select: opStr = "select"; break;
       default: return false;
     }
     if (!c.buffer.append(opStr, strlen(opStr)))
         return false;
 
@@ -611,16 +635,17 @@ RenderComparisonOperator(WasmRenderConte
     if (!RenderExpr(c, *op.lhs()))
         return false;
     if (!RenderExpr(c, *op.rhs()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, op);
     const char* opStr;
     switch (op.expr()) {
       case Expr::I32Eq:  opStr = "i32.eq"; break;
       case Expr::I32Ne:  opStr = "i32.ne"; break;
       case Expr::I32LtS: opStr = "i32.lt_s"; break;
       case Expr::I32LtU: opStr = "i32.lt_u"; break;
       case Expr::I32LeS: opStr = "i32.le_s"; break;
       case Expr::I32LeU: opStr = "i32.le_u"; break;
@@ -665,16 +690,17 @@ static bool
 RenderConversionOperator(WasmRenderContext& c, AstConversionOperator& op)
 {
     if (!RenderExpr(c, *op.op()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, op);
     const char* opStr;
     switch (op.expr()) {
       case Expr::I32WrapI64:        opStr = "i32.wrap/i64"; break;
       case Expr::I32TruncSF32:      opStr = "i32.trunc_s/f32"; break;
       case Expr::I32TruncUF32:      opStr = "i32.trunc_u/f32"; break;
       case Expr::I32ReinterpretF32: opStr = "i32.reinterpret/f32"; break;
       case Expr::I32TruncSF64:      opStr = "i32.trunc_s/f64"; break;
       case Expr::I32TruncUF64:      opStr = "i32.trunc_u/f64"; break;
@@ -711,16 +737,17 @@ static bool
 RenderIf(WasmRenderContext& c, AstIf& if_)
 {
     if (!RenderExpr(c, if_.cond()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, if_);
     if (!c.buffer.append("if"))
         return false;
 
     if (!RenderBlockNameAndSignature(c, if_.name(), if_.type()))
         return false;
 
     if (!if_.name().empty()) {
         if (!c.buffer.append(' '))
@@ -791,16 +818,17 @@ static bool
 RenderLoad(WasmRenderContext& c, AstLoad& load)
 {
     if (!RenderLoadStoreBase(c, load.address()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, load);
     uint32_t defaultAlignLog2;
     switch (load.expr()) {
       case Expr::I32Load8S:
         if (!c.buffer.append("i32.load8_s"))
             return false;
         defaultAlignLog2 = 0;
         break;
       case Expr::I64Load8S:
@@ -885,16 +913,17 @@ RenderStore(WasmRenderContext& c, AstSto
         return false;
 
     if (!RenderExpr(c, store.value()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, store);
     uint32_t defaultAlignLog2;
     switch (store.expr()) {
       case Expr::I32Store8:
         if (!c.buffer.append("i32.store8"))
             return false;
         defaultAlignLog2 = 0;
         break;
       case Expr::I64Store8:
@@ -961,16 +990,17 @@ RenderBranch(WasmRenderContext& c, AstBr
     if (branch.maybeValue()) {
         if (!RenderExpr(c, *(branch.maybeValue())))
             return false;
     }
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, branch);
     if (expr == Expr::BrIf ? !c.buffer.append("br_if ") : !c.buffer.append("br "))
         return false;
 
     if (!RenderRef(c, branch.target()))
         return false;
 
     return c.buffer.append('\n');
 }
@@ -985,16 +1015,17 @@ RenderBrTable(WasmRenderContext& c, AstB
 
     // Index
     if (!RenderExpr(c, table.index()))
         return false;
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, table);
     if (!c.buffer.append("br_table "))
         return false;
 
     uint32_t tableLength = table.table().length();
     for (uint32_t i = 0; i < tableLength; i++) {
         if (!RenderRef(c, table.table()[i]))
             return false;
 
@@ -1014,32 +1045,33 @@ RenderReturn(WasmRenderContext& c, AstRe
     if (ret.maybeExpr()) {
         if (!RenderExpr(c, *(ret.maybeExpr())))
             return false;
     }
 
     if (!RenderIndent(c))
         return false;
 
+    MAP_AST_EXPR(c, ret);
     if (!c.buffer.append("return"))
         return false;
 
     return c.buffer.append('\n');
 }
 
 static bool
 RenderExpr(WasmRenderContext& c, AstExpr& expr)
 {
     switch (expr.kind()) {
       case AstExprKind::Drop:
         return RenderDrop(c, expr.as<AstDrop>());
       case AstExprKind::Nop:
-        return RenderNop(c);
+        return RenderNop(c, expr.as<AstNop>());
       case AstExprKind::Unreachable:
-        return RenderUnreachable(c);
+        return RenderUnreachable(c, expr.as<AstUnreachable>());
       case AstExprKind::Call:
         return RenderCall(c, expr.as<AstCall>());
       case AstExprKind::CallIndirect:
         return RenderCallIndirect(c, expr.as<AstCallIndirect>());
       case AstExprKind::Const:
         return RenderConst(c, expr.as<AstConst>());
       case AstExprKind::GetLocal:
         return RenderGetLocal(c, expr.as<AstGetLocal>());
@@ -1292,16 +1324,19 @@ RenderExportSection(WasmRenderContext& c
     return true;
 }
 
 static bool
 RenderFunctionBody(WasmRenderContext& c, AstFunc& func, const AstModule::SigVector& sigs)
 {
     const AstSig* sig = sigs[func.sig().index()];
 
+    size_t startExprIndex = c.maybeSourceMap ? c.maybeSourceMap->exprlocs().length() : 0;
+    uint32_t startLineno = c.buffer.lineno();
+
     uint32_t argsNum = sig->args().length();
     uint32_t localsNum = func.vars().length();
     if (localsNum > 0) {
         if (!RenderIndent(c))
             return false;
         for (uint32_t i = 0; i < localsNum; i++) {
             if (!c.buffer.append("(local "))
                 return false;
@@ -1324,16 +1359,24 @@ RenderFunctionBody(WasmRenderContext& c,
 
 
     uint32_t exprsNum = func.body().length();
     for (uint32_t i = 0; i < exprsNum; i++) {
       if (!RenderExpr(c, *func.body()[i]))
           return false;
     }
 
+    size_t endExprIndex = c.maybeSourceMap ? c.maybeSourceMap->exprlocs().length() : 0;
+    uint32_t endLineno = c.buffer.lineno();
+
+    if (c.maybeSourceMap) {
+        if (!c.maybeSourceMap->functionlocs().emplaceBack(startExprIndex, endExprIndex, startLineno, endLineno))
+            return false;
+    }
+
     return true;
 }
 
 static bool
 RenderCodeSection(WasmRenderContext& c, const AstModule::FuncVector& funcs, const AstModule::SigVector& sigs)
 {
     uint32_t numFuncBodies = funcs.length();
     for (uint32_t funcIndex = 0; funcIndex < numFuncBodies; funcIndex++) {
@@ -1456,30 +1499,33 @@ RenderModule(WasmRenderContext& c, AstMo
     c.indent--;
 
     if (!c.buffer.append(")"))
         return false;
 
     return true;
 }
 
+#undef MAP_AST_EXPR
+
 /*****************************************************************************/
 // Top-level functions
 
 bool
-wasm::BinaryToText(JSContext* cx, const uint8_t* bytes, size_t length, StringBuffer& buffer)
+wasm::BinaryToText(JSContext* cx, const uint8_t* bytes, size_t length, StringBuffer& buffer, GeneratedSourceMap* sourceMap)
 {
 
     LifoAlloc lifo(AST_LIFO_DEFAULT_CHUNK_SIZE);
 
     AstModule* module;
     if (!BinaryToAst(cx, bytes, length, lifo, &module))
         return false;
 
-    WasmRenderContext c(cx, module, buffer);
+    WasmPrintBuffer buf(buffer);
+    WasmRenderContext c(cx, module, buf, sourceMap);
 
     if (!RenderModule(c, *module)) {
         if (!cx->isExceptionPending())
             ReportOutOfMemory(cx);
         return false;
     }
 
     return true;
--- a/js/src/asmjs/WasmBinaryToText.h
+++ b/js/src/asmjs/WasmBinaryToText.h
@@ -16,28 +16,30 @@
  * limitations under the License.
  */
 
 #ifndef wasm_binary_to_text_h
 #define wasm_binary_to_text_h
 
 #include "NamespaceImports.h"
 
+#include "asmjs/WasmGeneratedSourceMap.h"
 #include "gc/Rooting.h"
 #include "js/Class.h"
 
 namespace js {
 
 class StringBuffer;
 
 namespace wasm {
 
 // Translate the given binary representation of a wasm module into the module's textual
 // representation.
 
 MOZ_MUST_USE bool
-BinaryToText(JSContext* cx, const uint8_t* bytes, size_t length, StringBuffer& buffer);
+BinaryToText(JSContext* cx, const uint8_t* bytes, size_t length, StringBuffer& buffer,
+             GeneratedSourceMap* sourceMap = nullptr);
 
 }  // namespace wasm
 
 }  // namespace js
 
 #endif // namespace wasm_binary_to_text_h
--- a/js/src/asmjs/WasmCode.cpp
+++ b/js/src/asmjs/WasmCode.cpp
@@ -19,16 +19,17 @@
 #include "asmjs/WasmCode.h"
 
 #include "mozilla/Atomics.h"
 #include "mozilla/BinarySearch.h"
 #include "mozilla/EnumeratedRange.h"
 
 #include "jsprf.h"
 
+#include "asmjs/WasmBinaryToText.h"
 #include "asmjs/WasmModule.h"
 #include "asmjs/WasmSerialize.h"
 #include "jit/ExecutableAllocator.h"
 #include "jit/MacroAssembler.h"
 #ifdef JS_ION_PERF
 # include "jit/PerfSpewer.h"
 #endif
 #include "vm/StringBuffer.h"
@@ -712,20 +713,18 @@ Code::createText(JSContext* cx)
         const Bytes& bytes = maybeBytecode_->bytes;
         if (!buffer.append(experimentalWarning))
             return nullptr;
 
         maybeSourceMap_.reset(cx->runtime()->new_<GeneratedSourceMap>(cx));
         if (!maybeSourceMap_)
             return nullptr;
 
-        if (!BinaryToExperimentalText(cx, bytes.begin(), bytes.length(), buffer,
-                                      ExperimentalTextFormatting(), maybeSourceMap_.get())) {
+        if (!BinaryToText(cx, bytes.begin(), bytes.length(), buffer, maybeSourceMap_.get()))
             return nullptr;
-        }
 
 #if DEBUG
         // Checking source map invariant: expression and function locations must be sorted
         // by line number.
         uint32_t lastLineno = 0;
         for (const ExprLoc& loc : maybeSourceMap_->exprlocs()) {
             MOZ_ASSERT(lastLineno <= loc.lineno);
             lastLineno = loc.lineno;
--- a/js/src/asmjs/WasmCode.h
+++ b/js/src/asmjs/WasmCode.h
@@ -14,17 +14,17 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 #ifndef wasm_code_h
 #define wasm_code_h
 
-#include "asmjs/WasmBinaryToExperimentalText.h"
+#include "asmjs/WasmGeneratedSourceMap.h"
 #include "asmjs/WasmTypes.h"
 
 namespace js {
 
 struct AsmJSMetadata;
 
 namespace wasm {
 
new file mode 100644
--- /dev/null
+++ b/js/src/asmjs/WasmGeneratedSourceMap.h
@@ -0,0 +1,145 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ *
+ * Copyright 2016 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef wasm_generated_source_map_h
+#define wasm_generated_source_map_h
+
+#include "mozilla/Vector.h"
+
+#include "vm/StringBuffer.h"
+
+namespace js {
+
+namespace wasm {
+
+// The generated source location for the AST node/expression. The offset field refers
+// an offset in an binary format file.
+struct ExprLoc
+{
+    uint32_t lineno;
+    uint32_t column;
+    uint32_t offset;
+    ExprLoc() : lineno(0), column(0), offset(0) {}
+    ExprLoc(uint32_t lineno_, uint32_t column_, uint32_t offset_) : lineno(lineno_), column(column_), offset(offset_) {}
+};
+
+typedef mozilla::Vector<ExprLoc, 0, TempAllocPolicy> ExprLocVector;
+
+// The generated source WebAssembly function lines and expressions ranges.
+struct FunctionLoc
+{
+    size_t startExprsIndex;
+    size_t endExprsIndex;
+    uint32_t startLineno;
+    uint32_t endLineno;
+    FunctionLoc(size_t startExprsIndex_, size_t endExprsIndex_, uint32_t startLineno_, uint32_t endLineno_)
+      : startExprsIndex(startExprsIndex_),
+        endExprsIndex(endExprsIndex_),
+        startLineno(startLineno_),
+        endLineno(endLineno_)
+    {}
+};
+
+typedef mozilla::Vector<FunctionLoc, 0, TempAllocPolicy> FunctionLocVector;
+
+// The generated source map for WebAssembly binary file. This map is generated during
+// building the text buffer (see BinaryToExperimentalText).
+class GeneratedSourceMap
+{
+    ExprLocVector exprlocs_;
+    FunctionLocVector functionlocs_;
+    uint32_t totalLines_;
+
+  public:
+    explicit GeneratedSourceMap(JSContext* cx)
+     : exprlocs_(cx),
+       functionlocs_(cx),
+       totalLines_(0)
+    {}
+    ExprLocVector& exprlocs() { return exprlocs_; }
+    FunctionLocVector& functionlocs() { return functionlocs_; }
+
+    uint32_t totalLines() { return totalLines_; }
+    void setTotalLines(uint32_t val) { totalLines_ = val; }
+};
+
+typedef UniquePtr<GeneratedSourceMap> UniqueGeneratedSourceMap;
+
+// Helper class, StringBuffer wrapper, to track the position (line and column)
+// within the generated source.
+class WasmPrintBuffer
+{
+    StringBuffer& stringBuffer_;
+    uint32_t lineno_;
+    uint32_t column_;
+
+  public:
+    explicit WasmPrintBuffer(StringBuffer& stringBuffer) : stringBuffer_(stringBuffer), lineno_(1), column_(1) {}
+    inline char processChar(char ch) {
+        if (ch == '\n') {
+            lineno_++; column_ = 1;
+        } else
+            column_++;
+        return ch;
+    }
+    inline char16_t processChar(char16_t ch) {
+        if (ch == '\n') {
+            lineno_++; column_ = 1;
+        } else
+            column_++;
+        return ch;
+    }
+    bool append(const char ch) {
+        return stringBuffer_.append(processChar(ch));
+    }
+    bool append(const char16_t ch) {
+        return stringBuffer_.append(processChar(ch));
+    }
+    bool append(const char* str, size_t length) {
+        for (size_t i = 0; i < length; i++)
+            processChar(str[i]);
+        return stringBuffer_.append(str, length);
+    }
+    bool append(const char16_t* begin, const char16_t* end) {
+        for (const char16_t* p = begin; p != end; p++)
+            processChar(*p);
+        return stringBuffer_.append(begin, end);
+    }
+    bool append(const char16_t* str, size_t length) {
+        return append(str, str + length);
+    }
+    template <size_t ArrayLength>
+    bool append(const char (&array)[ArrayLength]) {
+        return append(array, ArrayLength - 1);
+    }
+    char16_t getChar(size_t index) {
+        return stringBuffer_.getChar(index);
+    }
+    size_t length() {
+        return stringBuffer_.length();
+    }
+    StringBuffer& stringBuffer() { return stringBuffer_; }
+    uint32_t lineno() { return lineno_; }
+    uint32_t column() { return column_; }
+};
+
+}  // namespace wasm
+
+}  // namespace js
+
+#endif // namespace wasm_generated_source_map_h
--- a/js/src/jit-test/tests/debug/wasm-05.js
+++ b/js/src/jit-test/tests/debug/wasm-05.js
@@ -28,22 +28,11 @@ var result1 = getAllOffsets('(module \
 )');
 
 var nopLine = result1.filter(i => i.str.indexOf('nop') >= 0);
 assertEq(nopLine.length, 1);
 // The nopLine shall have single offset.
 assertEq(nopLine[0].offsets.length, 1);
 assertEq(nopLine[0].offsets[0] > 0, true);
 
-var sqrtLine = result1.filter(i => i.str.indexOf('sqrt') >= 0);
-assertEq(sqrtLine.length, 1);
-// The sqrtLine shall have 5 offsets but they were produced from AST postorder decoding:
-//   drop(f32.sqrt(1.0 + 2.0)) ~~> 88,87,86,76,81
-assertEq(sqrtLine[0].offsets.length, 5);
-assertEq(sqrtLine[0].offsets[3] > 0, true);
-assertEq(sqrtLine[0].offsets[3] < sqrtLine[0].offsets[4], true);
-assertEq(sqrtLine[0].offsets[2] > sqrtLine[0].offsets[3], true);
-assertEq(sqrtLine[0].offsets[1] > sqrtLine[0].offsets[2], true);
-assertEq(sqrtLine[0].offsets[0] > sqrtLine[0].offsets[1], true);
-
-var noOffsetLines = result1.filter(i => i.str.indexOf('nop') < 0 && i.str.indexOf('sqrt') < 0);
-// Other lines will not have offsets.
-assertEq(noOffsetLines.every(i => i.offsets.length == 0), true);
+var singleOffsetLines = result1.filter(i => i.offsets.length === 1);
+// There shall be total 6 lines with single offset.
+assertEq(singleOffsetLines.length === 6, true);
--- a/layout/base/ActiveLayerTracker.cpp
+++ b/layout/base/ActiveLayerTracker.cpp
@@ -441,17 +441,17 @@ ActiveLayerTracker::IsStyleAnimated(nsDi
     }
     if (CheckScrollInducedActivity(layerActivity, activityIndex, aBuilder)) {
       return true;
     }
   }
   if (aProperty == eCSSProperty_transform && aFrame->Combines3DTransformWithAncestors()) {
     return IsStyleAnimated(aBuilder, aFrame->GetParent(), aProperty);
   }
-  return nsLayoutUtils::HasActiveAnimationOfProperty(aFrame, aProperty);
+  return nsLayoutUtils::HasEffectiveAnimation(aFrame, aProperty);
 }
 
 /* static */ bool
 ActiveLayerTracker::IsOffsetOrMarginStyleAnimated(nsIFrame* aFrame)
 {
   LayerActivity* layerActivity = GetLayerActivity(aFrame);
   if (layerActivity) {
     if (layerActivity->mRestyleCounts[LayerActivity::ACTIVITY_LEFT] >= 2 ||
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -417,24 +417,26 @@ AddAnimationForProperty(nsIFrame* aFrame
       UpdateStartValueFromReplacedTransition();
   }
 
   const ComputedTiming computedTiming =
     aAnimation->GetEffect()->GetComputedTiming();
   Nullable<TimeDuration> startTime = aAnimation->GetCurrentOrPendingStartTime();
   animation->startTime() = startTime.IsNull()
                            ? TimeStamp()
-                           : aAnimation->AnimationTimeToTimeStamp(
-                              StickyTimeDuration(timing.mDelay));
+                           : aAnimation->GetTimeline()->
+                              ToTimeStamp(startTime.Value());
   animation->initialCurrentTime() = aAnimation->GetCurrentTime().Value()
                                     - timing.mDelay;
+  animation->delay() = timing.mDelay;
   animation->duration() = computedTiming.mDuration;
   animation->iterations() = computedTiming.mIterations;
   animation->iterationStart() = computedTiming.mIterationStart;
   animation->direction() = static_cast<uint8_t>(timing.mDirection);
+  animation->fillMode() = static_cast<uint8_t>(timing.mFill);
   animation->property() = aProperty.mProperty;
   animation->playbackRate() = aAnimation->PlaybackRate();
   animation->data() = aData;
   animation->easingFunction() = ToTimingFunction(timing.mFunction);
   animation->iterationComposite() =
     static_cast<uint8_t>(aAnimation->GetEffect()->
                          AsKeyframeEffect()->IterationComposite());
 
@@ -476,17 +478,17 @@ AddAnimationsForProperty(nsIFrame* aFram
              "inconsistent property flags");
 
   DebugOnly<EffectSet*> effects = EffectSet::GetEffectSet(aFrame);
   MOZ_ASSERT(effects);
 
   // Add from first to last (since last overrides)
   for (size_t animIdx = 0; animIdx < aAnimations.Length(); animIdx++) {
     dom::Animation* anim = aAnimations[animIdx];
-    if (!anim->IsPlaying()) {
+    if (!anim->IsPlayableOnCompositor()) {
       continue;
     }
 
     dom::KeyframeEffectReadOnly* keyframeEffect =
       anim->GetEffect() ? anim->GetEffect()->AsKeyframeEffect() : nullptr;
     MOZ_ASSERT(keyframeEffect,
                "A playing animation should have a keyframe effect");
     const AnimationProperty* property =
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -471,29 +471,16 @@ HasMatchingAnimations(const nsIFrame* aF
       return true;
     }
   }
 
   return false;
 }
 
 bool
-nsLayoutUtils::HasActiveAnimationOfProperty(const nsIFrame* aFrame,
-                                            nsCSSPropertyID aProperty)
-{
-  return HasMatchingAnimations(aFrame,
-    [&aProperty](KeyframeEffectReadOnly& aEffect)
-    {
-      return aEffect.IsCurrent() && aEffect.IsInEffect() &&
-        aEffect.HasEffectiveAnimationOfProperty(aProperty);
-    }
-  );
-}
-
-bool
 nsLayoutUtils::HasCurrentTransitions(const nsIFrame* aFrame)
 {
   return HasMatchingAnimations(aFrame,
     [](KeyframeEffectReadOnly& aEffect)
     {
       // Since |aEffect| is current, it must have an associated Animation
       // so we don't need to null-check the result of GetAnimation().
       return aEffect.IsCurrent() && aEffect.GetAnimation()->AsCSSTransition();
--- a/layout/base/nsLayoutUtils.h
+++ b/layout/base/nsLayoutUtils.h
@@ -2225,23 +2225,16 @@ public:
    *    (void)SizeOfTextRunsForFrames(rootFrame, nullptr, true);
    *    total = SizeOfTextRunsForFrames(rootFrame, mallocSizeOf, false);
    */
   static size_t SizeOfTextRunsForFrames(nsIFrame* aFrame,
                                         mozilla::MallocSizeOf aMallocSizeOf,
                                         bool clear);
 
   /**
-   * Returns true if the frame has animations or transitions that are running
-   * or filling forwards for the specified property.
-   */
-  static bool HasActiveAnimationOfProperty(const nsIFrame* aFrame,
-                                           nsCSSPropertyID aProperty);
-
-  /**
    * Returns true if the frame has any current CSS transitions.
    * A current transition is any transition that has not yet finished playing
    * including paused transitions.
    */
   static bool HasCurrentTransitions(const nsIFrame* aFrame);
 
   /**
    * Returns true if |aFrame| has an animation of |aProperty| regardless of
--- a/layout/reftests/css-animations/reftest.list
+++ b/layout/reftests/css-animations/reftest.list
@@ -32,12 +32,12 @@ test-pref(layers.offmainthreadcompositio
 == stacking-context-transform-none-animation-with-backface-visibility.html stacking-context-animation-ref.html
 == stacking-context-transform-none-animation-with-preserve-3d.html stacking-context-animation-ref.html
 == stacking-context-transform-none-with-fill-backwards.html stacking-context-animation-ref.html
 == stacking-context-transform-none-with-fill-forwards.html stacking-context-animation-ref.html
 == stacking-context-opacity-1-in-delay.html stacking-context-animation-ref.html
 == stacking-context-opacity-removing-important-in-delay.html stacking-context-animation-ref.html
 == stacking-context-transform-none-in-delay.html stacking-context-animation-ref.html
 == stacking-context-transform-removing-important-in-delay.html stacking-context-animation-ref.html
-== background-position-in-delay.html background-position-ref.html
+fails == background-position-in-delay.html background-position-ref.html # This test fails the reftest-opaque-layer check since animating background-position currently creates an active layer from its delay phse, and reftest-opaque-layer only handles items assigned to PaintedLayers.
 == background-position-after-finish.html background-position-ref.html
 fails == background-position-running.html background-position-ref.html # This test fails the reftest-opaque-layer check since animating background-position currently creates an active layer, and reftest-opaque-layer only handles items assigned to PaintedLayers.
 fails == background-position-important.html background-position-ref.html # This test fails the reftest-opaque-layer check since animating background-position overridden by a non-animated !important style also creates an active layer, and reftest-opaque-layer only handles items that are assigned to PaintedLayers.
--- a/layout/reftests/css-transitions/stacking-context-opacity-wins-over-important-style.html
+++ b/layout/reftests/css-transitions/stacking-context-opacity-wins-over-important-style.html
@@ -9,27 +9,34 @@ span {
   width: 100px;
   position: fixed;
   background: green;
   top: 50px;
 }
 #test {
   width: 100px; height: 100px;
   background: blue;
-  transition: opacity 100s steps(1, start);
-  opacity: 0 ! important;
+  /*
+   * On the compositor we use a previous vsync time stamp rather than the
+   * current time stamp, as a result sometimes transition may be still in
+   * before phase after waiting a frame. To compose the same opacity value
+   * regardless of whether the transition is in before or active phase, we use
+   * steps(1, end) here.
+   */
+  transition: opacity 100s steps(1, end);
+  opacity: 1 ! important;
 }
 </style>
 <span></span>
 <div id="test"></div>
 <script>
 window.addEventListener("load", () => {
   var target = document.getElementById("test");
   getComputedStyle(target).opacity;
 
-  target.style.setProperty("opacity", "1", "important");
+  target.style.setProperty("opacity", "0", "important");
   getComputedStyle(target).opacity;
 
   requestAnimationFrame(() => {
     document.documentElement.classList.remove("reftest-wait");
   });
 });
 </script>
--- a/layout/reftests/css-transitions/stacking-context-transform-wins-over-important-style.html
+++ b/layout/reftests/css-transitions/stacking-context-transform-wins-over-important-style.html
@@ -9,27 +9,34 @@ span {
   width: 100px;
   position: fixed;
   background: green;
   top: 50px;
 }
 #test {
   width: 100px; height: 100px;
   background: blue;
-  transition: transform 100s steps(1, start);
-  transform: translateX(200px) ! important;
+  /*
+   * On the compositor we use a previous vsync time stamp rather than the
+   * current time stamp, as a result sometimes transition may be still in
+   * before phase after waiting a frame. To compose the same transform value
+   * regardless of whether the transition is in before or active phase, we use
+   * steps(1, end) here.
+   */
+  transition: transform 100s steps(1, end);
+  transform: none ! important;
 }
 </style>
 <span></span>
 <div id="test"></div>
 <script>
 window.addEventListener("load", () => {
   var target = document.getElementById("test");
   getComputedStyle(target).transform;
 
-  target.style.setProperty("transform", "none", "important");
+  target.style.setProperty("transform", "translateX(200px)", "important");
   getComputedStyle(target).transform;
 
   requestAnimationFrame(() => {
     document.documentElement.classList.remove("reftest-wait");
   });
 });
 </script>
--- a/layout/reftests/web-animations/reftest.list
+++ b/layout/reftests/web-animations/reftest.list
@@ -1,16 +1,20 @@
 test-pref(dom.animations-api.core.enabled,true) == 1246046-1.html green-box.html
 test-pref(dom.animations-api.core.enabled,true) == 1267937-1.html 1267937-ref.html
 test-pref(dom.animations-api.core.enabled,true) == 1298742-1.html 1298742-ref.html
 test-pref(dom.animations-api.core.enabled,true) == stacking-context-transform-none-animation-before-appending-element.html stacking-context-animation-ref.html
 test-pref(dom.animations-api.core.enabled,true) == stacking-context-opacity-changing-keyframe.html stacking-context-animation-ref.html
+test-pref(dom.animations-api.core.enabled,true) == stacking-context-opacity-changing-keyframe-in-delay.html stacking-context-animation-ref.html
 test-pref(dom.animations-api.core.enabled,true) == stacking-context-opacity-changing-target.html stacking-context-animation-changing-target-ref.html
+test-pref(dom.animations-api.core.enabled,true) == stacking-context-opacity-changing-target-in-delay.html stacking-context-animation-changing-target-ref.html
 test-pref(dom.animations-api.core.enabled,true) == stacking-context-opacity-changing-effect.html stacking-context-animation-ref.html
 test-pref(dom.animations-api.core.enabled,true) == stacking-context-opacity-losing-css-animation-in-delay.html stacking-context-animation-ref.html
 test-pref(dom.animations-api.core.enabled,true) == stacking-context-transform-changing-keyframe.html stacking-context-animation-ref.html
+test-pref(dom.animations-api.core.enabled,true) == stacking-context-transform-changing-keyframe-in-delay.html stacking-context-animation-ref.html
 test-pref(dom.animations-api.core.enabled,true) == stacking-context-transform-changing-target.html stacking-context-animation-changing-target-ref.html
+test-pref(dom.animations-api.core.enabled,true) == stacking-context-transform-changing-target-in-delay.html stacking-context-animation-changing-target-ref.html
 test-pref(dom.animations-api.core.enabled,true) == stacking-context-transform-changing-effect.html stacking-context-animation-ref.html
 test-pref(dom.animations-api.core.enabled,true) == stacking-context-transform-changing-display-property.html stacking-context-animation-ref.html
 test-pref(dom.animations-api.core.enabled,true) == stacking-context-transform-losing-css-animation-in-delay.html stacking-context-animation-ref.html
 test-pref(dom.animations-api.core.enabled,true) == style-updates-on-iteration-composition-changed-from-accumulate-to-replace.html style-updates-for-iteration-composite-ref.html
 test-pref(dom.animations-api.core.enabled,true) == style-updates-on-iteration-composition-changed-from-replace-to-accumulate.html style-updates-for-iteration-composite-ref.html
 test-pref(dom.animations-api.core.enabled,true) == style-updates-on-current-iteration-changed.html style-updates-for-iteration-composite-ref.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/web-animations/stacking-context-opacity-changing-keyframe-in-delay.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>
+Changing keyframes to opacity frames creates a stacking context even if the
+animation is delay phase
+</title>
+<style>
+span {
+  height: 100px;
+  width: 100px;
+  position: fixed;
+  background: green;
+  top: 50px;
+}
+#test {
+  width: 100px; height: 100px;
+  background: blue;
+}
+</style>
+<span></span>
+<div id="test"></div>
+<script>
+  var anim = document.getElementById("test")
+    .animate({ width: ['100px', '100px'] },
+             { delay: 100000, duration: 100000 });
+  anim.ready.then(function() {
+    anim.effect.setKeyframes({ opacity: [0, 1] });
+    requestAnimationFrame(function() {
+      document.documentElement.classList.remove("reftest-wait");
+    });
+  });
+</script>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/web-animations/stacking-context-opacity-changing-target-in-delay.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>
+Changing target to an element that does not override opacity animations
+creates a stacking context even if the animation is delay phase
+</title>
+<style>
+span {
+  height: 100px;
+  width: 100px;
+  position: fixed;
+  background: green;
+  top: 50px;
+}
+#first {
+  width: 100px; height: 100px;
+  background: blue;
+  opacity: 1 ! important;
+}
+#second {
+  width: 100px; height: 100px;
+  background: blue;
+}
+</style>
+<span></span>
+<div id="first"></div>
+<div id="second"></div>
+<script>
+  var anim = document.getElementById("first")
+    .animate({ opacity: [0, 1] },
+             { delay: 100000, duration: 100000 });
+  anim.ready.then(function() {
+    anim.effect.target = document.getElementById("second");
+    requestAnimationFrame(function() {
+      document.documentElement.classList.remove("reftest-wait");
+    });
+  });
+</script>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/web-animations/stacking-context-transform-changing-keyframe-in-delay.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>
+Changing keyframes to transform frames creates a stacking context even if the
+animation is delay phase
+</title>
+<style>
+span {
+  height: 100px;
+  width: 100px;
+  position: fixed;
+  background: green;
+  top: 50px;
+}
+#test {
+  width: 100px; height: 100px;
+  background: blue;
+}
+</style>
+<span></span>
+<div id="test"></div>
+<script>
+  var anim = document.getElementById("test")
+    .animate({ width: ['100px', '100px'] },
+             { delay: 100000, duration: 100000 });
+  anim.ready.then(function() {
+    anim.effect.setKeyframes(
+      { transform: ['translate(0px)', 'translate(0px)'] });
+    requestAnimationFrame(function() {
+      document.documentElement.classList.remove("reftest-wait");
+    });
+  });
+</script>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/web-animations/stacking-context-transform-changing-target-in-delay.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<title>
+Changing target to an element that does not overrider transform animations
+creates a stacking context even if the animation is delay phase
+</title>
+<style>
+span {
+  height: 100px;
+  width: 100px;
+  position: fixed;
+  background: green;
+  top: 50px;
+}
+#first {
+  width: 100px; height: 100px;
+  background: blue;
+  transform: none ! important;
+}
+#second {
+  width: 100px; height: 100px;
+  background: blue;
+}
+</style>
+<span></span>
+<div id="first"></div>
+<div id="second"></div>
+<script>
+  var anim = document.getElementById("first")
+    .animate({ transform: ['translateX(0px)', 'translateX(100px)'] },
+             { delay: 100000, duration: 100000 });
+  anim.ready.then(function() {
+    anim.effect.target = document.getElementById("second");
+    requestAnimationFrame(function() {
+      document.documentElement.classList.remove("reftest-wait");
+    });
+  });
+</script>
--- a/layout/style/test/test_animations_omta.html
+++ b/layout/style/test/test_animations_omta.html
@@ -251,31 +251,28 @@ function *testFillMode(fillMode, fillsBa
     style += " " + fillMode;
     desc = "fill mode " + fillMode + ": ";
   } else {
     desc = "default fill mode: ";
   }
   new_div(style);
   listen();
 
-  // Currently backwards fill is not performed on the compositor thread but we
-  // should wait for paints so we can test that transform values are *not* being
-  // set on the compositor thread.
   yield waitForPaintsFlushed();
 
   if (fillsBackwards)
-    omta_is("transform", { tx: 0 }, RunningOn.MainThread,
+    omta_is("transform", { tx: 0 }, RunningOn.Compositor,
             desc + "does affect value during delay (0s)");
   else
     omta_is("transform", { tx: 30 }, RunningOn.MainThread,
             desc + "doesn't affect value during delay (0s)");
 
   advance_clock(2000);
   if (fillsBackwards)
-    omta_is("transform", { tx: 0 }, RunningOn.MainThead,
+    omta_is("transform", { tx: 0 }, RunningOn.Compositor,
             desc + "does affect value during delay (0s)");
   else
     omta_is("transform", { tx: 30 }, RunningOn.MainThread,
             desc + "does affect value during delay (0s)");
 
   check_events([], "before start in testFillMode");
   advance_clock(1000);
   check_events([{ type: "animationstart", target: gDiv,
@@ -1301,34 +1298,39 @@ addAsyncAnimTest(function *() {
  * css3-animations:  3.8. The 'animation-delay' Property
  * http://dev.w3.org/csswg/css3-animations/#the-animation-delay-property-
  */
 
 addAsyncAnimTest(function *() {
   // test positive delay
   new_div("animation: anim2 1s 0.5s ease-out");
   yield waitForPaintsFlushed();
+  // NOTE: getOMTAStyle() can't detect the animation is running on the
+  // compositor or not during the delay phase, since no opacity style is
+  // applied during the delay phase.
   omta_is("opacity", 1, RunningOn.Either, "positive delay test at 0ms");
   advance_clock(400);
   omta_is("opacity", 1, RunningOn.Either, "positive delay test at 400ms");
   advance_clock(100);
   yield waitForPaints();
   omta_is("opacity", 0, RunningOn.Compositor, "positive delay test at 500ms");
   advance_clock(100);
   omta_is_approx("opacity", gTF.ease_out(0.1), 0.01, RunningOn.Compositor,
                  "positive delay test at 500ms");
   done_div();
 
   // test dynamic changes to delay (i.e., that we preserve the start time
   // that's before the delay)
   new_div("animation: anim2 1s 0.5s ease-out both");
   yield waitForPaintsFlushed();
+  // NOTE: As noted above, getOMTAStyle() can't detect the animation is running
+  // on the compositor during the delay phase.
   omta_is("opacity", 0, RunningOn.Either, "dynamic delay delay test at 0ms");
   advance_clock(400);
-  omta_is("opacity", 0, RunningOn.Either, 
+  omta_is("opacity", 0, RunningOn.Either,
           "dynamic delay delay test at 400ms (1)");
   gDiv.style.animationDelay = "0.2s";
   yield waitForPaintsFlushed();
   omta_is_approx("opacity", gTF.ease_out(0.2), 0.01, RunningOn.Compositor,
                  "dynamic delay delay test at 400ms (2)");
   gDiv.style.animationDelay = "0.6s";
   yield waitForPaintsFlushed();
   advance_clock(200);
@@ -1349,16 +1351,18 @@ addAsyncAnimTest(function *() {
   yield waitForPaintsFlushed();
   omta_is("opacity", 0, RunningOn.Either,
           "dynamic delay delay test at 1800ms (3)");
   done_div();
 
   // test delay and play-state interaction
   new_div("animation: anim2 1s 0.5s ease-out");
   yield waitForPaintsFlushed();
+  // NOTE: As noted above, getOMTAStyle() can't detect the animation is running
+  // on the compositor during the delay phase.
   omta_is("opacity", 1, RunningOn.Either,
           "delay and play-state delay test at 0ms");
   advance_clock(400);
   omta_is("opacity", 1, RunningOn.Either,
           "delay and play-state delay test at 400ms");
   gDiv.style.animationPlayState = "paused";
   yield waitForPaintsFlushed();
   advance_clock(100);
@@ -2349,18 +2353,20 @@ addAsyncAnimTest(function *() {
   done_div();
 });
 
 addAsyncAnimTest(function *() {
   new_div("transform: translate(100px); transition: transform 10s 5s linear");
   yield waitForPaintsFlushed();
   gDiv.style.transform = "translate(200px)";
   yield waitForPaintsFlushed();
-  omta_is("transform", { tx: 100 }, RunningOn.MainThread,
-          "transition runs on main thread during delay");
+  // NOTE: As noted above, getOMTAStyle() can't detect the animation is running
+  // on the compositor during the delay phase.
+  omta_is("transform", { tx: 100 }, RunningOn.Either,
+          "transition runs on compositor thread during delay");
   // At the *very* start of the transition the start value of the transition
   // will match the underlying transform value. Various optimizations in
   // RestyleManager may recognize this a "no change" and filter out the
   // transition meaning that the animation doesn't get added to the compositor
   // thread until the first time the value changes. As a result, we fast-forward
   // a little past the beginning and then wait for the animation to be sent
   // to the compositor.
   advance_clock(5100);
--- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
+++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
@@ -2544,16 +2544,21 @@ static int GetDTMFToneCode(uint16_t c)
 
 NS_IMETHODIMP
 PeerConnectionImpl::InsertDTMF(mozilla::dom::RTCRtpSender& sender,
                                const nsAString& tones, uint32_t duration,
                                uint32_t interToneGap) {
 #if !defined(MOZILLA_EXTERNAL_LINKAGE)
   PC_AUTO_ENTER_API_CALL(false);
 
+  // Check values passed in from PeerConnection.js
+  MOZ_ASSERT(duration >= 40, "duration must be at least 40");
+  MOZ_ASSERT(duration <= 6000, "duration must be at most 6000");
+  MOZ_ASSERT(interToneGap >= 30, "interToneGap must be at least 30");
+
   JSErrorResult jrv;
 
   // Retrieve track
   RefPtr<MediaStreamTrack> mst = sender.GetTrack(jrv);
   if (jrv.Failed()) {
     NS_WARNING("Failed to retrieve track for RTCRtpSender!");
     return jrv.StealNSResult();
   }
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1159,9 +1159,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 = 463;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1484831463579000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1484917735803000);
--- a/security/manager/ssl/nsSTSPreloadList.errors
+++ b/security/manager/ssl/nsSTSPreloadList.errors
@@ -8,17 +8,16 @@ 0xb612.org: could not connect to host
 1018hosting.nl: did not receive HSTS header
 1022996493.rsc.cdn77.org: could not connect to host
 10seos.com: did not receive HSTS header
 123plons.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 121"  data: no]
 12vpnchina.com: could not connect to host
 18f.gov: did not receive HSTS header
 18f.gsa.gov: did not receive HSTS header
 1a-jva.de: did not receive HSTS header
-1item.co.il: did not receive HSTS header
 1p.ro: could not connect to host
 1password.com: did not receive HSTS header
 1whw.co.uk: could not connect to host
 206rc.net: max-age too low: 2592000
 25daysof.io: max-age too low: 0
 2859cc.com: could not connect to host
 2or3.tk: could not connect to host
 300651.ru: did not receive HSTS header
@@ -95,33 +94,33 @@ agbremen.de: did not receive HSTS header
 agevio.com: could not connect to host
 agilebits.net: could not connect to host
 agonswim.com: did not receive HSTS header
 agrimap.com: did not receive HSTS header
 agrios.de: could not connect to host
 agro-id.gov.ua: could not connect to host
 ahabingo.com: did not receive HSTS header
 ahri.ovh: could not connect to host
+aiois.com: did not receive HSTS header
 airbnb.com: did not receive HSTS header
 aircomms.com: did not receive HSTS header
 aishnair.com: could not connect to host
 aiticon.de: did not receive HSTS header
 aiw-thkoeln.online: could not connect to host
 ajmahal.com: could not connect to host
 akclinics.org: did not receive HSTS header
 akselimedia.fi: did not receive HSTS header
 akutun.cl: did not receive HSTS header
 al-shami.net: could not connect to host
 alainwolf.net: could not connect to host
 alair.cn: could not connect to host
 alanlee.net: could not connect to host
 alanrickmanflipstable.com: could not connect to host
 alariel.de: could not connect to host
 alarmsystemreviews.com: did not receive HSTS header
-albertbogdanowicz.pl: could not connect to host
 albertopimienta.com: did not receive HSTS header
 alcazaar.com: could not connect to host
 aleax.me: could not connect to host
 alecvannoten.be: did not receive HSTS header
 alessandro.pw: did not receive HSTS header
 alethearose.com: did not receive HSTS header
 alexisabarca.com: did not receive HSTS header
 alfredxing.com: did not receive HSTS header
@@ -142,17 +141,16 @@ american-truck-simulator.de: could not c
 american-truck-simulator.net: could not connect to host
 amigogeek.net: could not connect to host
 amilx.org: could not connect to host
 amitube.com: could not connect to host
 amri.nl: did not receive HSTS header
 amunoz.org: max-age too low: 216000
 anakros.me: did not receive HSTS header
 anarchistischegroepnijmegen.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 121"  data: no]
-anarka.org: could not connect to host
 anassiriphotography.com: could not connect to host
 ancientkarma.com: could not connect to host
 andere-gedanken.net: max-age too low: 10
 andreasbreitenlohner.de: did not receive HSTS header
 andreasolsson.se: could not connect to host
 andrewmichaud.beer: could not connect to host
 andrewmichaud.me: did not receive HSTS header
 androoz.se: did not receive HSTS header
@@ -187,23 +185,21 @@ api.mega.co.nz: could not connect to hos
 api.recurly.com: did not receive HSTS header
 apibot.de: could not connect to host
 apis.google.com: did not receive HSTS header (error ignored - included regardless)
 aponkral.net: did not receive HSTS header
 aponkralsunucu.com: did not receive HSTS header
 app.lookout.com: could not connect to host
 app.manilla.com: could not connect to host
 appengine.google.com: did not receive HSTS header (error ignored - included regardless)
-appleoosa.com: could not connect to host
 applez.xyz: could not connect to host
 applic8.com: did not receive HSTS header
 appraisal-comps.com: could not connect to host
 approlys.fr: did not receive HSTS header
 apps-for-fishing.com: could not connect to host
-appsbystudio.co.uk: could not connect to host
 appseccalifornia.org: did not receive HSTS header
 arabdigitalexpression.org: did not receive HSTS header
 aradulconteaza.ro: could not connect to host
 aran.me.uk: could not connect to host
 arbu.eu: max-age too low: 2419200
 arlen.se: could not connect to host
 armory.consulting: could not connect to host
 armory.supplies: could not connect to host
@@ -263,17 +259,16 @@ babelfisch.eu: could not connect to host
 baby-click.de: could not connect to host
 babybic.hu: did not receive HSTS header
 babyhouse.xyz: could not connect to host
 babysaying.me: could not connect to host
 back-bone.nl: did not receive HSTS header
 badcronjob.com: could not connect to host
 baff.lu: did not receive HSTS header
 baiduaccount.com: could not connect to host
-baiker.info: did not receive HSTS header
 bakkerdesignandbuild.com: did not receive HSTS header
 balcan-underground.net: could not connect to host
 baldwinkoo.com: could not connect to host
 bandb.xyz: could not connect to host
 banqingdiao.com: could not connect to host
 barely.sexy: did not receive HSTS header
 bashcode.ninja: could not connect to host
 basicsolutionsus.com: did not receive HSTS header
@@ -341,17 +336,16 @@ bitcoinworld.me: could not connect to ho
 bitf.ly: could not connect to host
 bitfactory.ws: could not connect to host
 bitfarm-archiv.com: did not receive HSTS header
 bitfarm-archiv.de: did not receive HSTS header
 bitgo.com: max-age too low: 0
 bitheus.com: could not connect to host
 bithosting.io: did not receive HSTS header
 bitsafe.systems: could not connect to host
-bitsensor.io: could not connect to host
 bitvigor.com: could not connect to host
 bivsi.com: could not connect to host
 bizcms.com: did not receive HSTS header
 bizon.sk: did not receive HSTS header
 black-armada.com.pl: could not connect to host
 blackburn.link: did not receive HSTS header
 blackdragoninc.org: could not connect to host
 blacklane.com: did not receive HSTS header
@@ -372,16 +366,17 @@ bngsecure.com: [Exception... "Component 
 bobiji.com: did not receive HSTS header
 bockenauer.at: max-age too low: 0
 bodo-wolff.de: could not connect to host
 bodyblog.nl: did not receive HSTS header
 bodybuilding-legends.com: could not connect to host
 bodyweightsolution.com: could not connect to host
 boensou.com: did not receive HSTS header
 bogosity.se: could not connect to host
+bohan.life: did not receive HSTS header
 boltdata.io: did not receive HSTS header
 bonfi.net: did not receive HSTS header
 bonigo.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 bonitabrazilian.co.nz: did not receive HSTS header
 bookcelerator.com: did not receive HSTS header
 bookingapp.nl: did not receive HSTS header
 boomerang.com: could not connect to host
 bootjp.me: did not receive HSTS header
@@ -409,17 +404,16 @@ browserid.org: did not receive HSTS head
 brunix.net: did not receive HSTS header
 bsagan.fr: could not connect to host
 bsdtips.com: could not connect to host
 btcdlc.com: could not connect to host
 buch-cuber.de: could not connect to host
 buchheld.at: did not receive HSTS header
 budgetthostels.nl: did not receive HSTS header
 budskap.eu: did not receive HSTS header
-bugtrack.co.uk: [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 121"  data: no]
 buhler.pro: did not receive HSTS header
 buildsaver.co.za: did not receive HSTS header
 built.by: did not receive HSTS header
 bulletpoint.cz: did not receive HSTS header
 bumarkamoda.com: did not receive HSTS header
 bunaken.asia: could not connect to host
 burian-server.cz: could not connect to host
 business.lookout.com: could not connect to host
@@ -427,21 +421,21 @@ businesshosting.nl: did not receive HSTS
 busold.ws: could not connect to host
 bustimes.org: could not connect to host
 butchersworkshop.com: did not receive HSTS header
 buttercoin.com: could not connect to host
 buybaby.eu: did not receive HSTS header
 buyfox.de: did not receive HSTS header
 buzzconcert.com: could not connect to host
 bvalle.com: did not receive HSTS header
-bw81.xyz: could not connect to host
 bydisk.com: could not connect to host
 bypassed.press: could not connect to host
 bypro.xyz: could not connect to host
 bysymphony.com: max-age too low: 0
+byte.wtf: could not connect to host
 bytepark.de: did not receive HSTS header
 bytesatwork.de: could not connect to host
 bytesatwork.eu: could not connect to host
 c1yd3i.me: could not connect to host
 c3b.info: could not connect to host
 cabarave.com: could not connect to host
 cabusar.fr: could not connect to host
 caconnect.org: could not connect to host
@@ -477,17 +471,16 @@ casa-due-pur.com: could not connect to h
 casedi.org: max-age too low: 0
 casinostest.com: did not receive HSTS header
 casovi.cf: could not connect to host
 catinmay.com: did not receive HSTS header
 catnapstudios.com: could not connect to host
 caveclan.org: did not receive HSTS header
 cavedroid.xyz: could not connect to host
 cbhq.net: could not connect to host
-ccblog.de: could not connect to host
 ccsys.com: could not connect to host
 cctech.ph: did not receive HSTS header
 cd.search.yahoo.com: did not receive HSTS header
 cd0.us: could not connect to host
 cdkeykopen.com: did not receive HSTS header
 cdnb.co: could not connect to host
 cdndepo.com: did not receive HSTS header
 cdreporting.co.uk: did not receive HSTS header
@@ -557,17 +550,17 @@ clickandgo.com: did not receive HSTS hea
 clint.id.au: max-age too low: 0
 clintonbloodworth.com: could not connect to host
 clintonbloodworth.io: could not connect to host
 clintwilson.technology: max-age too low: 2592000
 cloud.wtf: could not connect to host
 cloudapi.vc: could not connect to host
 cloudcert.org: did not receive HSTS header
 cloudcy.net: could not connect to host
-clouddesktop.co.nz: could not connect to host
+clouddesktop.co.nz: did not receive HSTS header
 cloudey.net: did not receive HSTS header
 cloudflare.com: did not receive HSTS header
 cloudimag.es: could not connect to host
 cloudns.com.au: could not connect to host
 cloudstoragemaus.com: could not connect to host
 cloudteam.de: could not connect to host
 cloudwalk.io: did not receive HSTS header
 cloverleaf.net: max-age too low: 0
@@ -577,17 +570,17 @@ cmci.dk: did not receive HSTS header
 cmlachapelle.ch: did not receive HSTS header
 cmlancy.ch: did not receive HSTS header
 cmlignon.ch: did not receive HSTS header
 cmplainpalais.ch: did not receive HSTS header
 cmsbattle.com: could not connect to host
 cmscafe.ru: did not receive HSTS header
 cn.search.yahoo.com: did not receive HSTS header
 co50.com: did not receive HSTS header
-codabix.com: could not connect to host
+codabix.com: did not receive HSTS header
 codabix.de: could not connect to host
 codabix.net: could not connect to host
 code.google.com: did not receive HSTS header (error ignored - included regardless)
 codeco.pw: could not connect to host
 codeforce.io: did not receive HSTS header
 codefoundry.it: did not receive HSTS header
 codepx.com: did not receive HSTS header
 codewiththepros.org: could not connect to host
@@ -646,34 +639,33 @@ cracking.org: did not receive HSTS heade
 craftbeerbarn.co.uk: could not connect to host
 crate.io: did not receive HSTS header
 cravelyrics.com: could not connect to host
 crazycen.com: did not receive HSTS header
 crazyhotseeds.com: did not receive HSTS header
 creativephysics.ml: could not connect to host
 criena.net: could not connect to host
 crizk.com: could not connect to host
-cross-x.com: could not connect to host
 crosssec.com: did not receive HSTS header
 crowd.supply: could not connect to host
 crowdcurity.com: did not receive HSTS header
 crowdjuris.com: could not connect to host
 crudysql.com: could not connect to host
 cruzr.xyz: could not connect to host
 crypt.guru: could not connect to host
 cryptify.eu: did not receive HSTS header
 cryptobells.com: did not receive HSTS header
 cryptobin.org: could not connect to host
 cryptojar.io: did not receive HSTS header
 cryptolab.tk: could not connect to host
 cryptopush.com: could not connect to host
 crysadm.com: max-age too low: 1
 crystalchandelierservices.com: could not connect to host
 crystalclassics.co.uk: did not receive HSTS header
-csapak.com: max-age too low: 0
+csapak.com: could not connect to host
 csawctf.poly.edu: could not connect to host
 csfs.org.uk: could not connect to host
 csgodicegame.com: did not receive HSTS header
 csgokings.eu: could not connect to host
 csohack.tk: could not connect to host
 cspbuilder.info: could not connect to host
 ct.search.yahoo.com: did not receive HSTS header
 cthulhuden.com: could not connect to host
@@ -683,16 +675,17 @@ cujanovic.com: did not receive HSTS head
 cupidmentor.com: did not receive HSTS header
 curroapp.com: could not connect to host
 custe.rs: could not connect to host
 cyanogenmod.xxx: could not connect to host
 cybershambles.com: could not connect to host
 cycleluxembourg.lu: did not receive HSTS header
 cydia-search.io: could not connect to host
 cyphertite.com: could not connect to host
+cysec.biz: could not connect to host
 dad256.tk: could not connect to host
 dah5.com: did not receive HSTS header
 dailystormerpodcasts.com: did not receive HSTS header
 daimadi.com: could not connect to host
 dakrib.net: could not connect to host
 daniel-steuer.de: did not receive HSTS header
 danieldk.eu: did not receive HSTS header
 danielworthy.com: did not receive HSTS header
@@ -712,17 +705,16 @@ datahove.no: did not receive HSTS header
 datarank.com: max-age too low: 0
 dataretention.solutions: could not connect to host
 datenkeks.de: did not receive HSTS header
 datenreiter.cf: could not connect to host
 datenreiter.gq: could not connect to host
 datenreiter.ml: could not connect to host
 datenreiter.tk: could not connect to host
 datewon.net: did not receive HSTS header
-davidadrian.org: could not connect to host
 davidhunter.scot: did not receive HSTS header
 davidreinhardt.de: could not connect to host
 daylightcompany.com: did not receive HSTS header
 db.gy: could not connect to host
 dbx.ovh: did not receive HSTS header
 dccode.gov: could not connect to host
 dcurt.is: did not receive HSTS header
 dden.ca: could not connect to host
@@ -755,23 +747,26 @@ denh.am: did not receive HSTS header
 denisjean.fr: could not connect to host
 dentaldomain.org: did not receive HSTS header
 dentaldomain.ph: did not receive HSTS header
 depijl-mz.nl: did not receive HSTS header
 depixion.agency: could not connect to host
 dequehablamos.es: could not connect to host
 derevtsov.com: did not receive HSTS header
 derwolfe.net: did not receive HSTS header
+destinationbijoux.fr: could not connect to host
 detector.exposed: could not connect to host
 detest.org: could not connect to host
 detutorial.com: max-age too low: 0
 devh.de: did not receive HSTS header
 devincrow.me: could not connect to host
 devinfo.net: did not receive HSTS header
 devuan.org: did not receive HSTS header
+dfekt.no: did not receive HSTS header
+dfektlan.no: did not receive HSTS header
 diablotine.rocks: could not connect to host
 diarbag.us: did not receive HSTS header
 diasp.cz: [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 121"  data: no]
 diasp.org: did not receive HSTS header
 diedrich.co: could not connect to host
 digitaldaddy.net: could not connect to host
 digitalriver.tk: could not connect to host
 digitalskillswap.com: could not connect to host
@@ -799,48 +794,47 @@ dogbox.se: did not receive HSTS header
 dohosting.ru: could not connect to host
 dollarstore24.com: could not connect to host
 dollywiki.co.uk: could not connect to host
 dolphin-cloud.com: could not connect to host
 dolphincorp.co.uk: max-age too low: 0
 domaris.de: did not receive HSTS header
 dominique-mueller.de: did not receive HSTS header
 donzelot.co.uk: max-age too low: 3600
+doobydude.us: could not connect to host
 doomleika.com: could not connect to host
 dopost.it: did not receive HSTS header
 doridian.com: could not connect to host
 doridian.de: could not connect to host
 doridian.net: did not receive HSTS header
 doridian.org: could not connect to host
-dot.ro: max-age too low: 0
 dotadata.me: could not connect to host
 download.jitsi.org: did not receive HSTS header
 downsouthweddings.com.au: did not receive HSTS header
 doyoucheck.com: did not receive HSTS header
 dpratt.de: could not connect to host
 dprd-wonogirikab.go.id: did not receive HSTS header
 dragonisles.net: could not connect to host
 dragons-of-highlands.cz: could not connect to host
 dragontrainingmobilezoo.com.au: max-age too low: 0
+dranek.com: could not connect to host
 draw.uy: did not receive HSTS header
 drbethanybarnes.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 121"  data: no]
 dreadbyte.com: could not connect to host
 dreamlinehost.com: did not receive HSTS header
 dreizwosechs.de: did not receive HSTS header
 drishti.guru: could not connect to host
 drive.google.com: did not receive HSTS header (error ignored - included regardless)
 driving-lessons.co.uk: did not receive HSTS header
 droidboss.com: could not connect to host
 dropcam.com: did not receive HSTS header
 drtroyhendrickson.com: could not connect to host
 drumbandesperanto.nl: could not connect to host
 dshiv.io: could not connect to host
 dubrovskiy.net: could not connect to host
-dubrovskiy.pro: could not connect to host
-duckasylum.com: could not connect to host
 duesee.org: could not connect to host
 duria.de: max-age too low: 3600
 dutch1.nl: did not receive HSTS header
 dwhd.org: [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 121"  data: no]
 dycontrol.de: could not connect to host
 dylanscott.com.au: did not receive HSTS header
 dzimejl.sk: did not receive HSTS header
 dzlibs.io: could not connect to host
@@ -881,17 +875,17 @@ electricianforum.co.uk: could not connec
 electromc.com: could not connect to host
 elemprendedor.com.ve: could not connect to host
 elenag.ga: could not connect to host
 elenoon.ir: did not receive HSTS header
 elimdengelen.com: did not receive HSTS header
 elitefishtank.com: could not connect to host
 elnutricionista.es: did not receive HSTS header
 elpo.xyz: could not connect to host
-elsitar.com: did not receive HSTS header
+elsitar.com: could not connect to host
 email.lookout.com: could not connect to host
 emeldi-commerce.com: max-age too low: 0
 emilyhorsman.com: could not connect to host
 emnitech.com: could not connect to host
 empleostampico.com: did not receive HSTS header
 enargia.jp: max-age too low: 0
 encode.space: did not receive HSTS header
 encoder.pw: could not connect to host
@@ -913,17 +907,16 @@ epanurse.com: could not connect to host
 ephry.com: could not connect to host
 epoxate.com: did not receive HSTS header
 eq8.net.au: could not connect to host
 equate.net.au: could not connect to host
 equatetechnologies.com.au: could not connect to host
 equilibre-yoga-jennifer-will.com: could not connect to host
 eressea.xyz: could not connect to host
 ericyl.com: could not connect to host
-eriix.org: could not connect to host
 eromixx.com: did not receive HSTS header
 erotalia.es: could not connect to host
 eroticen.com: did not receive HSTS header
 erotische-aanbiedingen.nl: could not connect to host
 errlytics.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 121"  data: no]
 errolz.com: could not connect to host
 errors.zenpayroll.com: could not connect to host
 esclear.de: did not receive HSTS header
@@ -941,27 +934,24 @@ etsysecure.com: could not connect to hos
 etula.ga: could not connect to host
 euanbaines.com: did not receive HSTS header
 eucl3d.com: did not receive HSTS header
 eulerpi.io: could not connect to host
 euph.eu: did not receive HSTS header
 euren.se: could not connect to host
 euroshop24.net: could not connect to host
 evantage.org: could not connect to host
-everwaking.com: could not connect to host
 everybooks.com: max-age too low: 60
-eveseat.net: could not connect to host
 evi.be: did not receive HSTS header
 evin.ml: could not connect to host
 evossd.tk: could not connect to host
 exfiles.cz: did not receive HSTS header
 exgravitus.com: could not connect to host
 exitus.jp: max-age too low: 0
 exno.co: could not connect to host
-exon.io: did not receive HSTS header
 expertmile.com: did not receive HSTS header
 expoundite.net: did not receive HSTS header
 expressemotion.net: could not connect to host
 expressfinance.co.za: did not receive HSTS header
 extreemhost.nl: did not receive HSTS header
 extremenetworking.net: could not connect to host
 exy.pw: could not connect to host
 exyplis.com: did not receive HSTS header
@@ -980,17 +970,16 @@ fadilus.com: did not receive HSTS header
 faesser.com: did not receive HSTS header
 fail4free.de: did not receive HSTS header
 faizan.net: did not receive HSTS header
 faizan.xyz: could not connect to host
 fakeletters.org: could not connect to host
 falkena.net: max-age too low: 5184000
 falkp.no: did not receive HSTS header
 fanyl.cn: did not receive HSTS header
-farhood.org: could not connect to host
 fashioncare.cz: did not receive HSTS header
 fastopen.ml: could not connect to host
 fatgeekflix.net: could not connect to host
 fatherhood.gov: did not receive HSTS header
 fatox.de: could not connect to host
 fatwin.pw: could not connect to host
 fayolle.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 fbox.li: could not connect to host
@@ -1000,16 +989,17 @@ fedux.com.ar: could not connect to host
 feezmodo.com: max-age too low: 0
 felisslovakia.sk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 feliwyn.fr: did not receive HSTS header
 feminists.co: could not connect to host
 fenteo.com: could not connect to host
 feragon.net: max-age too low: 84600
 feriahuamantla.com: did not receive HSTS header
 festember.com: did not receive HSTS header
+festrip.com: could not connect to host
 fexmen.com: could not connect to host
 fhdhelp.de: could not connect to host
 fhdhilft.de: could not connect to host
 fifieldtech.com: could not connect to host
 fiftyshadesofluca.ml: could not connect to host
 fig.co: did not receive HSTS header
 fightr.co: could not connect to host
 filmipop.com: max-age too low: 0
@@ -1023,29 +1013,29 @@ firebaseio-demo.com: could not connect t
 firebaseio.com: could not connect to host (error ignored - included regardless)
 firefall.rocks: could not connect to host
 firemail.io: could not connect to host
 firstforex.co.uk: did not receive HSTS header
 fischers.cc: could not connect to host
 fish2.me: did not receive HSTS header
 fit4medien.de: did not receive HSTS header
 fivestarsitters.com: did not receive HSTS header
+fixatom.com: max-age too low: 604800
 fixingdns.com: did not receive HSTS header
 fj.search.yahoo.com: did not receive HSTS header
 flags.ninja: could not connect to host
 flam.io: could not connect to host
 flamewall.net: could not connect to host
 fleximus.org: could not connect to host
 fliexer.com: did not receive HSTS header
 floless.co.uk: did not receive HSTS header
 florian-lillpopp.de: max-age too low: 10
 florianlillpopp.de: max-age too low: 10
 floridaescapes.co.uk: did not receive HSTS header
 flouartistique.ch: could not connect to host
-flow.su: could not connect to host
 flowersandclouds.com: could not connect to host
 flushstudios.com: did not receive HSTS header
 flyaces.com: did not receive HSTS header
 flyss.net: did not receive HSTS header
 fm83.nl: did not receive HSTS header
 fndout.com: did not receive HSTS header
 fnvsecurity.com: could not connect to host
 fonetiq.io: could not connect to host
@@ -1080,16 +1070,17 @@ freesounding.com: could not connect to h
 freesounding.ru: could not connect to host
 freethought.org.au: could not connect to host
 freeutopia.org: did not receive HSTS header
 freshfind.xyz: could not connect to host
 frezbo.com: did not receive HSTS header
 friendica.ch: could not connect to host
 froggstack.de: did not receive HSTS header
 frontmin.com: did not receive HSTS header
+frost-ci.xyz: could not connect to host
 fruitusers.com: could not connect to host
 frusky.net: could not connect to host
 funkyweddingideas.com.au: could not connect to host
 funrun.com: did not receive HSTS header
 furiffic.com: did not receive HSTS header
 furry.be: max-age too low: 86400
 fusionmate.com: could not connect to host
 futbol11.com: did not receive HSTS header
@@ -1119,17 +1110,16 @@ gamesdepartment.co.uk: could not connect
 gamingmedia.eu: could not connect to host
 gampenhof.de: did not receive HSTS header
 ganhonet.com.br: could not connect to host
 gaptek.id: did not receive HSTS header
 gatilagata.com.br: did not receive HSTS header
 gaussorgues.me: could not connect to host
 gdpventure.com: max-age too low: 0
 gedankenbude.info: did not receive HSTS header
-geek-hub.de: could not connect to host
 geekcast.co.uk: could not connect to host
 geli-graphics.com: did not receive HSTS header
 gem-indonesia.net: 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
 gerencianet.com.br: did not receive HSTS header
 get.zenpayroll.com: did not receive HSTS header
@@ -1143,16 +1133,17 @@ getlifti.com: did not receive HSTS heade
 getlolaccount.com: could not connect to host
 getmassage.com.ng: did not receive HSTS header
 getsello.com: did not receive HSTS header
 getwashdaddy.com: did not receive HSTS header
 gfhgiro.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 121"  data: no]
 gfm.tech: could not connect to host
 gfournier.ca: could not connect to host
 gfwsb.ml: could not connect to host
+gha.st: could not connect to host
 gheorghesarcov.ga: could not connect to host
 gheorghesarcov.tk: could not connect to host
 gigacloud.org: could not connect to host
 gilgaz.com: did not receive HSTS header
 gilly.berlin: did not receive HSTS header
 gingali.de: did not receive HSTS header
 gipsamsfashion.com: could not connect to host
 gistfy.com: could not connect to host
@@ -1211,26 +1202,26 @@ grazetech.com: could not connect to host
 greenhillantiques.co.uk: did not receive HSTS header
 greenvines.com.tw: did not receive HSTS header
 gregorytlee.me: did not receive HSTS header
 greplin.com: could not connect to host
 grigalanzsoftware.com: could not connect to host
 groups.google.com: did not receive HSTS header (error ignored - included regardless)
 grunex.com: did not receive HSTS header
 gryffin.ga: could not connect to host
+gryffin.ml: could not connect to host
+gryffin.tk: could not connect to host
 gsm-map.com: could not connect to host
 gtanda.tk: could not connect to host
 gtlfsonlinepay.com: did not receive HSTS header
 gtraxapp.com: could not connect to host
 guava.studio: did not receive HSTS header
 guilde-vindicta.fr: did not receive HSTS header
 gunnarhafdal.com: did not receive HSTS header
 gurusupe.com: could not connect to host
-gussi.is: could not connect to host
-guts.me: could not connect to host
 gvt2.com: could not connect to host (error ignored - included regardless)
 gvt3.com: could not connect to host (error ignored - included regardless)
 gwijaya.com: could not connect to host
 gwtest.us: could not connect to host
 gxlrx.net: could not connect to host
 gyboche.com: could not connect to host
 gyboche.science: could not connect to host
 gycis.me: could not connect to host
@@ -1270,18 +1261,19 @@ hasilocke.de: did not receive HSTS heade
 hasinase.de: did not receive HSTS header
 haste.ch: could not connect to host
 hastherebeenamassshooting.today: could not connect to host
 hatoko.net: could not connect to host
 haufschild.de: could not connect to host
 haurumcraft.net: could not connect to host
 haveeruexaminer.com: could not connect to host
 haveforeningen-enghaven.dk: did not receive HSTS header
+hawksguild.com: did not receive HSTS header
 haydenhill.us: could not connect to host
-hazcod.com: did not receive HSTS header
+hazcod.com: could not connect to host
 hcie.pl: could not connect to host
 hdm.io: [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 121"  data: no]
 hduin.xyz: did not receive HSTS header
 hdwallpapers.net: did not receive HSTS header
 healtious.com: did not receive HSTS header
 heart.ge: did not receive HSTS header
 heartlandrentals.com: did not receive HSTS header
 heftkaufen.de: did not receive HSTS header
@@ -1317,16 +1309,17 @@ hoerbuecher-und-hoerspiele.de: could not
 hogar123.es: could not connect to host
 hohm.in: did not receive HSTS header
 holifestival-freyung.de: could not connect to host
 holymoly.lu: did not receive HSTS header
 homa.website: could not connect to host
 honeytracks.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 121"  data: no]
 honoo.com: did not receive HSTS header
 hookandloom.com: did not receive HSTS header
+hooray.beer: did not receive HSTS header
 horosho.in: could not connect to host
 horseboners.xxx: did not receive HSTS header
 hortifarm.ro: could not connect to host
 hosted-service.com: did not receive HSTS header
 hostedtalkgadget.google.com: did not receive HSTS header (error ignored - included regardless)
 hostgarou.com: did not receive HSTS header
 hostinaus.com.au: could not connect to host
 hostisan.com: did not receive HSTS header
@@ -1414,16 +1407,20 @@ infotics.es: did not receive HSTS header
 injigo.com: did not receive HSTS header
 inkable.com.au: did not receive HSTS header
 inkedguy.de: could not connect to host
 inkstory.gr: did not receive HSTS header
 inksupply.com: did not receive HSTS header
 inleaked.com: could not connect to host
 inmyarea.com: max-age too low: 0
 innophate-security.nl: could not connect to host
+insighti.com: could not connect to host
+insighti.eu: could not connect to host
+insighti.org: could not connect to host
+insighti.sk: could not connect to host
 insite-feedback.com: did not receive HSTS header
 inspiroinc.com: could not connect to host
 instacart.com: did not receive HSTS header
 instantdev.io: could not connect to host
 intel.li: could not connect to host
 intercom.io: did not receive HSTS header
 interference.io: [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 121"  data: no]
 interlun.com: could not connect to host
@@ -1475,16 +1472,17 @@ ivi-fertility.com: max-age too low: 0
 ivi.es: max-age too low: 0
 ivk.website: could not connect to host
 izdiwho.com: could not connect to host
 izolight.ch: could not connect to host
 ja-publications.com: did not receive HSTS header
 jaba.hosting: did not receive HSTS header
 jabbari.io: did not receive HSTS header
 jacobparry.ca: did not receive HSTS header
+jagido.de: did not receive HSTS header
 jahliveradio.com: could not connect to host
 jakenbake.com: did not receive HSTS header
 jakubtopic.cz: could not connect to host
 jamesbradach.com: did not receive HSTS header
 jamesburton.london: could not connect to host
 jamesbywater.me: could not connect to host
 jamesbywater.me.uk: could not connect to host
 jamesconroyfinn.com: did not receive HSTS header
@@ -1494,19 +1492,20 @@ jamourtney.com: could not connect to hos
 jan27.org: did not receive HSTS header
 janario.me: could not connect to host
 janbrodda.de: max-age too low: 2592000
 jannyrijneveld.nl: did not receive HSTS header
 janus-engineering.de: did not receive HSTS header
 japlex.com: could not connect to host
 jaqen.ch: could not connect to host
 jaredeberle.org: did not receive HSTS header
+jaredfernandez.com: could not connect to host
 jaroslavtrsek.cz: did not receive HSTS header
 jartza.org: could not connect to host
-jasmineconseil.com: could not connect to host
+jasmineconseil.com: did not receive HSTS header
 jasonrobinson.me: [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 121"  data: no]
 jasonroe.me: did not receive HSTS header
 jastoria.pl: did not receive HSTS header
 jayblock.com: did not receive HSTS header
 jayscoaching.com: could not connect to host
 jazzinutrecht.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 jcch.de: could not connect to host
 jcor.me: could not connect to host
@@ -1568,16 +1567,17 @@ jupp0r.de: did not receive HSTS header
 justlikethat.hosting: did not receive HSTS header
 justnaw.co.uk: could not connect to host
 justudin.com: did not receive HSTS header
 juwairen.cn: could not connect to host
 jvoice.net: could not connect to host
 jwilsson.me: could not connect to host
 jxm.in: could not connect to host
 k-dev.de: could not connect to host
+kabus.org: could not connect to host
 kadioglumakina.com.tr: did not receive HSTS header
 kahopoon.net: could not connect to host
 kaisers.de: did not receive HSTS header
 kalami.nl: could not connect to host
 kamikano.com: could not connect to host
 kaplatz.is: could not connect to host
 kapucini.si: max-age too low: 0
 karaoketonight.com: could not connect to host
@@ -1619,17 +1619,17 @@ kissart.net: did not receive HSTS header
 kitakemon.com: could not connect to host
 kitchenpunx.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 121"  data: no]
 kitk.at: could not connect to host
 kitsta.com: could not connect to host
 kiwiirc.com: max-age too low: 5256000
 kizil.net: could not connect to host
 kjaermaxi.me: did not receive HSTS header
 kjellvn.net: did not receive HSTS header
-klauwd.com: did not receive HSTS header
+klauwd.com: could not connect to host
 klaxn.org: could not connect to host
 kleertjesvoordelig.nl: could not connect to host
 kleinblogje.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 121"  data: no]
 kletterkater.com: did not receive HSTS header
 klicktojob.de: could not connect to host
 kmartin.io: did not receive HSTS header
 knccloud.com: did not receive HSTS header
 kodokushi.fr: could not connect to host
@@ -1639,17 +1639,17 @@ komandakovalchuk.com: [Exception... "Com
 komikito.com: could not connect to host
 kompetenzwerft.de: did not receive HSTS header
 kontaxis.network: could not connect to host
 kontorhaus-schlachte.de: could not connect to host
 koop-bremen.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 koordinate.net: could not connect to host
 korni22.org: did not receive HSTS header
 korsanparti.org: could not connect to host
-kpvpn.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 121"  data: no]
+kpvpn.com: could not connect to host
 kr.search.yahoo.com: did not receive HSTS header
 kredite.sale: could not connect to host
 kriegt.es: could not connect to host
 krislamoureux.com: could not connect to host
 krmela.com: could not connect to host
 kroetenfuchs.de: could not connect to host
 kropkait.pl: could not connect to host
 krouzkyliduska.cz: [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 121"  data: no]
@@ -1660,17 +1660,16 @@ kukal.cz: could not connect to host
 kummerlaender.eu: did not receive HSTS header
 kundenerreichen.com: could not connect to host
 kundenerreichen.de: could not connect to host
 kuppingercole.com: did not receive HSTS header
 kurehun.org: could not connect to host
 kurz.pw: did not receive HSTS header
 kusaka-abacus.jp: max-age too low: 0
 kweddingplanning.com: did not receive HSTS header
-kwok.tv: could not connect to host
 kyanite.co: could not connect to host
 kylinj.com: could not connect to host
 kz.search.yahoo.com: did not receive HSTS header
 labaia.info: could not connect to host
 labina.com.tr: did not receive HSTS header
 laboiteapc.fr: did not receive HSTS header
 labordata.io: could not connect to host
 labrador-retrievers.com.au: did not receive HSTS header
@@ -1696,16 +1695,17 @@ lavinya.net: could not connect to host
 lavval.com: could not connect to host
 laxatus.com: did not receive HSTS header
 laxiongames.es: could not connect to host
 laylo.nl: did not receive HSTS header
 lbrt.xyz: could not connect to host
 ldarby.me.uk: could not connect to host
 leadership9.com: could not connect to host
 leakreporter.net: could not connect to host
+learnedovo.com: could not connect to host
 learnfrenchfluently.com: did not receive HSTS header
 learningorder.com: could not connect to host
 ledgerscope.net: could not connect to host
 legarage.org: did not receive HSTS header
 leifdreizler.com: could not connect to host
 leinir.dk: max-age too low: 86400
 leitner.com.au: did not receive HSTS header
 leiyun.me: did not receive HSTS header
@@ -1750,17 +1750,16 @@ limpido.it: could not connect to host
 lindberg.io: did not receive HSTS header
 lingros-test.tk: could not connect to host
 linguaquote.com: did not receive HSTS header
 linmi.cc: did not receive HSTS header
 linorman1997.me: could not connect to host
 linuxeyecandy.com: could not connect to host
 linuxfixed.it: could not connect to host
 linuxgeek.ro: could not connect to host
-linzgau.de: did not receive HSTS header
 liquorsanthe.in: could not connect to host
 listafirmelor.com: did not receive HSTS header
 litespeed.io: could not connect to host
 livecards.co.uk: did not receive HSTS header
 livedemo.io: could not connect to host
 livej.am: could not connect to host
 livekaarten.be: did not receive HSTS header
 livekaarten.nl: did not receive HSTS header
@@ -1768,17 +1767,16 @@ livekort.dk: did not receive HSTS header
 livekort.se: did not receive HSTS header
 loadso.me: could not connect to host
 loafbox.com: could not connect to host
 locktheirphone.com: did not receive HSTS header
 locomotive.ca: did not receive HSTS header
 login.corp.google.com: max-age too low: 7776000 (error ignored - included regardless)
 loginseite.com: could not connect to host
 loli.bz: could not connect to host
-longboarding-ulm.de: could not connect to host
 lookastic.co.uk: [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 121"  data: no]
 lookastic.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 121"  data: no]
 lookastic.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 lookastic.es: [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 121"  data: no]
 lookastic.fr: [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 121"  data: no]
 lookastic.mx: [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 121"  data: no]
 lookastic.ru: [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 121"  data: no]
 lookout.com: did not receive HSTS header
@@ -1822,25 +1820,27 @@ maarten.nyc: did not receive HSTS header
 maartenvandekamp.nl: did not receive HSTS header
 macchaberrycream.com: could not connect to host
 macchedil.com: did not receive HSTS header
 macgeneral.de: did not receive HSTS header
 madars.org: did not receive HSTS header
 maddin.ga: could not connect to host
 madebymagnitude.com: did not receive HSTS header
 maderwin.com: did not receive HSTS header
+madusecurity.com: could not connect to host
 mafamane.com: could not connect to host
 maff.scot: did not receive HSTS header
 mafiareturns.com: max-age too low: 2592000
 magenx.com: did not receive HSTS header
 mahamed91.pw: could not connect to host
 maidofhonorcleaning.net: could not connect to host
 mail-settings.google.com: did not receive HSTS header (error ignored - included regardless)
 mail.google.com: did not receive HSTS header (error ignored - included regardless)
 maildragon.com: could not connect to host
+mainframeserver.space: could not connect to host
 makeitdynamic.com: could not connect to host
 makerstuff.net: did not receive HSTS header
 makeyourank.com: could not connect to host
 malerversand.de: did not receive HSTS header
 malwre.io: could not connect to host
 mamaison.io: could not connect to host
 mamaxi.org: did not receive HSTS header
 mammothmail.com: could not connect to host
@@ -1862,17 +1862,16 @@ markaconnor.com: could not connect to ho
 markayapilandirma.com: did not receive HSTS header
 market.android.com: did not receive HSTS header (error ignored - included regardless)
 markrego.com: could not connect to host
 markus-dev.com: did not receive HSTS header
 markusweimar.de: did not receive HSTS header
 marleyresort.com: did not receive HSTS header
 marsble.com: did not receive HSTS header
 marshut.net: could not connect to host
-martiert.com: could not connect to host
 martijnvhoof.nl: could not connect to host
 martinsfamilyappliance.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 121"  data: no]
 masjidtawheed.net: did not receive HSTS header
 massotherapeutique.com: did not receive HSTS header
 matatall.com: did not receive HSTS header
 matchneedle.com: could not connect to host
 matrip.de: could not connect to host
 matrix.ac: did not receive HSTS header
@@ -1894,17 +1893,16 @@ mdfnet.se: did not receive HSTS header
 mdscomp.net: did not receive HSTS header
 mea.in.ua: could not connect to host
 mechanus.io: max-age too low: 2592000
 medallia.io: could not connect to host
 media-courses.com: did not receive HSTS header
 mediacru.sh: could not connect to host
 mediastorm.us: could not connect to host
 mediawikicn.org: could not connect to host
-medirich.co: could not connect to host
 medwayindia.com: did not receive HSTS header
 meetings2.com: did not receive HSTS header
 meetscompany.jp: did not receive HSTS header
 megashur.se: did not receive HSTS header
 megasslstore.com: did not receive HSTS header
 megaxchange.com: did not receive HSTS header
 meghudson.com: could not connect to host
 mein-gesundheitsmanager.com: did not receive HSTS header
@@ -1923,16 +1921,17 @@ mesmoque.com: did not receive HSTS heade
 meta-db.com: could not connect to host
 metagrader.com: did not receive HSTS header
 metebalci.com: could not connect to host
 meteosherbrooke.com: could not connect to host
 meteosky.net: could not connect to host
 metin2blog.de: did not receive HSTS header
 metis.pw: could not connect to host
 metrobriefs.com: could not connect to host
+metronaut.de: could not connect to host
 meuemail.pro: could not connect to host
 mexbt.com: could not connect to host
 mhict.nl: max-age too low: 0
 mia.to: could not connect to host
 michaelfitzpatrickruth.com: could not connect to host
 michal-kral.cz: [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 121"  data: no]
 michalborka.cz: could not connect to host
 micro-dv.ru: could not connect to host
@@ -1941,17 +1940,16 @@ micropple.net: could not connect to host
 midwestwomenworkers.org: did not receive HSTS header
 mightydicks.io: could not connect to host
 mightydicks.tech: could not connect to host
 mightysounds.cz: max-age too low: 0
 mijcorijneveld.nl: did not receive HSTS header
 mijn-email.org: could not connect to host
 mikaelemilsson.net: did not receive HSTS header
 mikeburns.com: did not receive HSTS header
-mikeg.de: did not receive HSTS header
 mikepair.net: did not receive HSTS header
 mikonmaa.fi: could not connect to host
 miku.be: could not connect to host
 miku.hatsune.my: max-age too low: 5184000
 milang.xyz: could not connect to host
 milesgeek.com: did not receive HSTS header
 mindcraft.ga: max-age too low: 7776000
 mindoktor.se: did not receive HSTS header
@@ -1961,16 +1959,17 @@ minikneet.nl: did not receive HSTS heade
 minnesotadata.com: could not connect to host
 minora.io: 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
 mirucon.com: could not connect to host
 misskey.xyz: could not connect to host
 missrain.tw: could not connect to host
+mitchellrenouf.ca: could not connect to host
 mittenhacks.com: could not connect to host
 mivcon.net: could not connect to host
 mizd.at: could not connect to host
 mizi.name: did not receive HSTS header
 mlpepilepsy.org: could not connect to host
 mnemotiv.com: could not connect to host
 mnetworkingsolutions.co.uk: did not receive HSTS header
 mobilekey.co: could not connect to host
@@ -2040,20 +2039,19 @@ myhostname.net: did not receive HSTS hea
 myiocc.org: could not connect to host
 mykolab.com: did not receive HSTS header
 mykreuzfahrt.de: could not connect to host
 myni.io: could not connect to host
 mypagella.com: could not connect to host
 mypagella.eu: could not connect to host
 mypagella.it: could not connect to host
 myplaceonline.com: did not receive HSTS header
-myraytech.net: could not connect to host
 mysecretrewards.com: did not receive HSTS header
 mystudy.me: [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 121"  data: no]
-mythslegendscollection.com: did not receive HSTS header
+mytweeps.com: could not connect to host
 myvirtualserver.com: max-age too low: 2592000
 myzone.com: did not receive HSTS header
 mziulu.me: could not connect to host
 n2x.in: could not connect to host
 n4l.pw: did not receive HSTS header
 naiharngym.com: did not receive HSTS header
 najedlo.sk: did not receive HSTS header
 nakliyatsirketi.biz: could not connect to host
@@ -2073,16 +2071,17 @@ navjobs.com: did not receive HSTS header
 nbb.io: did not receive HSTS header
 nbg-ha.de: could not connect to host
 ncc60205.info: could not connect to host
 nct.org.uk: max-age too low: 1
 nctx.co.uk: did not receive HSTS header
 neap.io: did not receive HSTS header
 neel.ch: could not connect to host
 neftaly.com: did not receive HSTS header
+neilgreen.net: did not receive HSTS header
 neko-system.com: did not receive HSTS header
 nemno.de: could not connect to host
 nemovement.org: did not receive HSTS header
 neonisi.com: could not connect to host
 nepustil.net: did not receive HSTS header
 neris.io: could not connect to host
 nerven.se: could not connect to host
 nestedquotes.ca: could not connect to host
@@ -2111,17 +2110,17 @@ ng-security.com: could not connect to ho
 ngine.ch: did not receive HSTS header
 nginxnudes.com: could not connect to host
 ni.search.yahoo.com: did not receive HSTS header
 nicestresser.fr: could not connect to host
 nicky.io: did not receive HSTS header
 nicolaelmer.ch: could not connect to host
 nicolasbettag.me: did not receive HSTS header
 niconiconi.xyz: could not connect to host
-niconode.com: could not connect to host
+niconode.com: did not receive HSTS header
 nightx.uk: could not connect to host
 niho.jp: [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 121"  data: no]
 nikomo.fi: could not connect to host
 ninhs.org: could not connect to host
 nippombashi.net: did not receive HSTS header
 nipponcareers.com: did not receive HSTS header
 nixien.fr: could not connect to host
 nmctest.net: could not connect to host
@@ -2272,16 +2271,17 @@ pamsoft.pl: max-age too low: 0
 panaceallc.net: could not connect to host
 pantsu.cat: did not receive HSTS header
 papeda.net: did not receive HSTS header
 papercard.co.uk: did not receive HSTS header
 papierniak.net: could not connect to host
 parentmail.co.uk: did not receive HSTS header
 particonpsplus.it: could not connect to host
 partijtjevoordevrijheid.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 121"  data: no]
+partnerbeam.com: did not receive HSTS header
 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
 passwordbox.com: did not receive HSTS header
 passwordrevelator.net: did not receive HSTS header
 passwords.google.com: did not receive HSTS header (error ignored - included regardless)
 pastaf.com: could not connect to host
@@ -2322,17 +2322,17 @@ petchart.net: could not connect to host
 petja.me: could not connect to host
 petplum.com: did not receive HSTS header
 petrachuk.ru: did not receive HSTS header
 petravdbos.nl: did not receive HSTS header
 petrolplus.ru: did not receive HSTS header
 pettsy.com: could not connect to host
 pewboards.com: could not connect to host
 pgpm.io: could not connect to host
-pgpmail.cc: could not connect to host
+philosopherswool.com: could not connect to host
 phoenix.dj: could not connect to host
 phongmay24h.com: could not connect to host
 phurl.de: could not connect to host
 pic.gov: did not receive HSTS header
 pickr.co: could not connect to host
 picotronic.biz: could not connect to host
 picscare.co.uk: did not receive HSTS header
 piligrimname.com: could not connect to host
@@ -2372,31 +2372,31 @@ politologos.org: could not connect to ho
 polypho.nyc: could not connect to host
 pompompoes.com: could not connect to host
 pontokay.com.br: did not receive HSTS header
 pontualcomp.com: max-age too low: 2592000
 poolsandstuff.com: did not receive HSTS header
 poris.web.id: did not receive HSTS header
 portalplatform.net: did not receive HSTS header
 poshpak.com: did not receive HSTS header
+posterspy.com: did not receive HSTS header
 postscheduler.org: could not connect to host
 posylka.de: did not receive HSTS header
 potatofrom.space: could not connect to host
 potatoheads.net: did not receive HSTS header
 poussinooz.fr: could not connect to host
 povitria.net: could not connect to host
 powerplannerapp.com: did not receive HSTS header
 powerxequality.com: could not connect to host
 ppr-truby.ru: could not connect to host
 pr.search.yahoo.com: did not receive HSTS header
 prefontaine.name: could not connect to host
 prego-shop.de: did not receive HSTS header
 preissler.co.uk: could not connect to host
 prelist.org: did not receive HSTS header
-prescotonline.co.uk: could not connect to host
 pressfreedomfoundation.org: did not receive HSTS header
 preworkout.me: could not connect to host
 prezola.com: did not receive HSTS header
 priolkar.com: did not receive HSTS header
 priva.si: could not connect to host
 privacylabs.io: did not receive HSTS header
 privacyrup.net: could not connect to host
 prnt.li: did not receive HSTS header
@@ -2404,17 +2404,16 @@ pro-zone.com: could not connect to host
 prodpad.com: did not receive HSTS header
 production.vn: did not receive HSTS header
 professionalboundaries.com: did not receive HSTS header
 profi-durchgangsmelder.de: did not receive HSTS header
 profundr.com: could not connect to host
 progg.no: could not connect to host
 prohostonline.fi: could not connect to host
 promecon-gmbh.de: did not receive HSTS header
-promhadan.com: could not connect to host
 prontolight.com: did not receive HSTS header
 prosoft.sk: did not receive HSTS header
 prosperident.com: did not receive HSTS header
 prowhisky.de: did not receive HSTS header
 proximato.com: could not connect to host
 proxybay.al: could not connect to host
 proxybay.club: could not connect to host
 proxybay.info: did not receive HSTS header
@@ -2502,16 +2501,17 @@ relayawards.com: could not connect to ho
 relisten.nl: did not receive HSTS header
 remodela.com.ve: could not connect to host
 renem.net: did not receive HSTS header
 renlong.org: could not connect to host
 renrenss.com: did not receive HSTS header
 rent-a-coder.de: did not receive HSTS header
 rentcarassist.com: could not connect to host
 renteater.com: could not connect to host
+reox.at: could not connect to host
 reprolife.co.uk: max-age too low: 0
 res-rheingau.de: did not receive HSTS header
 res42.com: did not receive HSTS header
 reserve-online.net: did not receive HSTS header
 respice.xyz: could not connect to host
 restchart.com: did not receive HSTS header
 revello.org: did not receive HSTS header
 reverie.pw: could not connect to host
@@ -2542,78 +2542,77 @@ rme.li: did not receive HSTS header
 roan24.pl: did not receive HSTS header
 robertglastra.com: could not connect to host
 rochman.id: could not connect to host
 rocksberg.net: did not receive HSTS header
 roddis.net: did not receive HSTS header
 rodney.id.au: did not receive HSTS header
 rodosto.com: did not receive HSTS header
 roeper.party: could not connect to host
-romaimperator.com: could not connect to host
 romans-place.me.uk: could not connect to host
 ronvandordt.info: did not receive HSTS header
 ronwo.de: max-age too low: 1
 room-checkin24.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 rootforum.org: did not receive HSTS header
 rootservice.org: did not receive HSTS header
 rootwpn.com: could not connect to host
 rop.io: could not connect to host
-rosslug.org.uk: could not connect to host
 rotterdamjazz.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121"  data: no]
 roundtheme.com: did not receive HSTS header
 rout0r.org: did not receive HSTS header
 rouvray.org: 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
 rsauget.fr: could not connect to host
 rsf.io: could not connect to host
 rsmaps.org: could not connect to host
 rubbereggs.ca: could not connect to host
 rubberfurs.org: max-age too low: 86400
 rubecodeberg.com: could not connect to host
 rubenschulz.nl: did not receive HSTS header
 ruborr.se: did not receive HSTS header
 rubyshop.nl: max-age too low: 604800
+rudeotter.com: did not receive HSTS header
 rudloff.pro: did not receive HSTS header
 rugirlfriend.com: could not connect to host
 ruiming.me: could not connect to host
 runawebinar.nl: could not connect to host
 runementors.com: could not connect to host
 runtondev.com: did not receive HSTS header
 ruqu.nl: could not connect to host
 rusadmin.biz: did not receive HSTS header
 rusl.me: could not connect to host
 russmarshall.com: could not connect to host
 ruxit.com: did not receive HSTS header
 rw.search.yahoo.com: did not receive HSTS header
 rxbusiness.com: could not connect to host
 rxprep.com: did not receive HSTS header
 rxv.cc: could not connect to host
 ryankearney.com: could not connect to host
-ryansmithphotography.com: did not receive HSTS header
 ryanteck.uk: did not receive HSTS header
 sageth.com: max-age too low: 0
 sah3.net: could not connect to host
 sakaki.anime.my: max-age too low: 5184000
 sakaserver.com: did not receive HSTS header
 salesmachine.io: did not receive HSTS header
 salserocafe.com: did not receive HSTS header
 salserototal.com: did not receive HSTS header
 salud.top: did not receive HSTS header
 samirnassar.com: max-age too low: 60
 sampoznay.ru: did not receive HSTS header
 samraskauskas.com: could not connect to host
 samsen.club: did not receive HSTS header
 sandviks.com: did not receive HSTS header
 sansemea.com: could not connect to host
+sapk.fr: could not connect to host
 sarah-beckett-harpist.com: did not receive HSTS header
 sarahsweetlife.com: could not connect to host
 saruwebshop.co.za: did not receive HSTS header
-satriyowibowo.my.id: did not receive HSTS header
+satriyowibowo.my.id: could not connect to host
 satsukii.moe: did not receive HSTS header
 saturngames.co.uk: did not receive HSTS header
 saunasandstuff.ca: did not receive HSTS header
 saunasandstuff.com: did not receive HSTS header
 save.gov: could not connect to host
 saveaward.gov: could not connect to host
 saveyour.biz: did not receive HSTS header
 savvysuit.com: could not connect to host
@@ -2625,16 +2624,17 @@ schallert.com: did not receive HSTS head
 schmitz.link: could not connect to host
 schneids.me: could not connect to host
 schnell-gold.com: could not connect to host
 schoop.me: [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 121"  data: no]
 schrauger.run: could not connect to host
 schreiber-netzwerk.eu: did not receive HSTS header
 schrodinger.io: could not connect to host
 scienceathome.org: did not receive HSTS header
+sciencex.com: could not connect to host
 scooshonline.co.uk: did not receive HSTS header
 scotbirchfield.com: did not receive HSTS header
 scrambl.is: could not connect to host
 scrambler.in: could not connect to host
 scrapings.net: could not connect to host
 screenresolution.space: could not connect to host
 scribe.systems: could not connect to host
 script.google.com: did not receive HSTS header (error ignored - included regardless)
@@ -2833,23 +2833,24 @@ spot-events.com: could not connect to ho
 spotlightsrule.ddns.net: could not connect to host
 spreadsheets.google.com: did not receive HSTS header (error ignored - included regardless)
 spreed.me: did not receive HSTS header
 sprybear.com: did not receive HSTS header
 square.gs: could not connect to host
 squatldf.org: [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 121"  data: no]
 sqzryang.com: max-age too low: 604800
 srna.sk: max-age too low: 120
+ss.wtf: did not receive HSTS header
 ssersay.com: did not receive HSTS header
 ssl.panoramio.com: did not receive HSTS header
 ssl.rip: could not connect to host
 sslhosting.cz: could not connect to host
 ssmato.me: could not connect to host
 ssnc.org: max-age too low: 300
-sss3s.com: could not connect to host
+sss3s.com: did not receive HSTS header
 stabletoken.com: could not connect to host
 stadjerspasonline.nl: could not connect to host
 stateofexception.io: could not connect to host
 static.or.at: could not connect to host
 staticanime.net: could not connect to host
 stationaryjourney.com: did not receive HSTS header
 stationnementdenuit.ca: did not receive HSTS header
 statuschecks.net: could not connect to host
@@ -2917,17 +2918,16 @@ sylvanorder.com: could not connect to ho
 synackr.com: could not connect to host
 syncer.jp: did not receive HSTS header
 syncserve.net: did not receive HSTS header
 syneic.com: did not receive HSTS header
 syno.gq: could not connect to host
 sys.tf: could not connect to host
 sysadmin.xyz: could not connect to host
 syso.name: could not connect to host
-systemreboot.net: could not connect to host
 szaszm.tk: max-age too low: 0
 szaydon.me: could not connect to host
 t.facebook.com: did not receive HSTS header
 tablet.facebook.com: did not receive HSTS header
 tafoma.com: did not receive HSTS header
 tageau.com: could not connect to host
 taglondon.org: did not receive HSTS header
 tails.com.ar: could not connect to host
@@ -2958,25 +2958,26 @@ teachforcanada.ca: did not receive HSTS 
 teamblueridge.org: could not connect to host
 teamsocial.co: did not receive HSTS header
 teamzeus.cz: could not connect to host
 techhub.ml: could not connect to host
 techllage.com: could not connect to host
 techloaner.com: could not connect to host
 techmatehq.com: could not connect to host
 technosavvyport.com: did not receive HSTS header
-techvalue.gr: did not receive HSTS header
+tedovo.com: could not connect to host
 tegelsensanitaironline.nl: did not receive HSTS header
 tekshrek.com: max-age too low: 0
 temehu.com: did not receive HSTS header
 tempcraft.net: could not connect to host
 tendertool.nl: could not connect to host
 tenni.xyz: could not connect to host
 tensionup.com: could not connect to host
 teodio.cl: did not receive HSTS header
+tepid.org: could not connect to host
 terrax.berlin: could not connect to host
 terrax.info: could not connect to host
 terrax.net: could not connect to host
 terry.pub: did not receive HSTS header
 testandroid.xyz: could not connect to host
 testbawks.com: did not receive HSTS header
 testnode.xyz: could not connect to host
 teunstuinposters.nl: did not receive HSTS header
@@ -3010,49 +3011,48 @@ thepartywarehouse.co.uk: did not receive
 thepiratebay.al: could not connect to host
 therapyportal.com: did not receive HSTS header
 thestack.xyz: could not connect to host
 thestagchorleywood.co.uk: did not receive HSTS header
 thetomharling.com: max-age too low: 86400
 theurbanyoga.com: did not receive HSTS header
 thevintagenews.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 121"  data: no]
 thewhitneypaige.com: could not connect to host
-theyosh.nl: could not connect to host
 thezonders.com: did not receive HSTS header
 thierfreund.de: could not connect to host
 thijsalders.nl: did not receive HSTS header
 thinkcoding.de: could not connect to host
 thinkcoding.org: could not connect to host
 thinlyveiledcontempt.com: could not connect to host
 thirdpartytrade.com: did not receive HSTS header
 thirty5.net: did not receive HSTS header
 thorncreek.net: did not receive HSTS header
 thumbtack.com: did not receive HSTS header
-tibbitshall.ca: did not receive HSTS header
 tickopa.co.uk: could not connect to host
 tickreport.com: did not receive HSTS header
 tictactux.de: could not connect to host
 tiensnet.com: did not receive HSTS header
 tikutiku.pl: max-age too low: 0
 timbeilby.com: could not connect to host
 timcamara.com: did not receive HSTS header
 time-river.xyz: could not connect to host
 timestamp.io: did not receive HSTS header
 timotrans.de: did not receive HSTS header
 timotrans.eu: did not receive HSTS header
 timwittenberg.com: could not connect to host
 tipsyk.ru: could not connect to host
 tirex.media: did not receive HSTS header
 tittelbach.at: could not connect to host
 titties.ml: could not connect to host
-tkarstens.de: could not connect to host
+tkarstens.de: did not receive HSTS header
 tlo.hosting: could not connect to host
 tlo.network: could not connect to host
 tls.li: could not connect to host
 tm-solutions.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 121"  data: no]
+tmaward.net: could not connect to host
 tmprod.com: did not receive HSTS header
 tncnanet.com.br: could not connect to host
 tnrsca.jp: did not receive HSTS header
 tobiasmathes.com: could not connect to host
 tobiasmathes.name: could not connect to host
 tobiasofficial.at: could not connect to host
 todo.is: did not receive HSTS header
 todobazar.es: could not connect to host
@@ -3098,16 +3098,17 @@ ts2.se: did not receive HSTS header
 tsecy.com: did not receive HSTS header
 tsgoc.com: did not receive HSTS header
 tssouthernpower.com: max-age too low: 0
 tuingereedschappen.net: could not connect to host
 tuningblog.eu: did not receive HSTS header
 turtlementors.com: did not receive HSTS header
 tuturulianda.com: could not connect to host
 tuvalie.com: could not connect to host
+tuxz.net: could not connect to host
 tv.search.yahoo.com: could not connect to host
 tvtubeflix.com: did not receive HSTS header
 tvz-materijali.com: could not connect to host
 twarog.cc: could not connect to host
 twinkseason.ca: could not connect to host
 twinkseason.co: could not connect to host
 twinkseason.co.uk: could not connect to host
 twinkseason.com: could not connect to host
@@ -3172,28 +3173,26 @@ usercare.com: did not receive HSTS heade
 ustr.gov: max-age too low: 86400
 utumno.ch: could not connect to host
 uy.search.yahoo.com: did not receive HSTS header
 uz.search.yahoo.com: did not receive HSTS header
 uzmandroid.com: did not receive HSTS header
 uzmandroid.net: did not receive HSTS header
 uzmandroid.top: could not connect to host
 vaddder.com: could not connect to host
-valasi.eu: could not connect to host
 valethound.com: could not connect to host
 valis.sx: could not connect to host
 valkyrja.xyz: did not receive HSTS header
 valleyridgepta.org: could not connect to host
 vallis.net: could not connect to host
 vanderkley.it: could not connect to host
 vanetv.com: could not connect to host
 vanitas.xyz: could not connect to host
 vanitynailworkz.com: could not connect to host
 vansieleghem.com: could not connect to host
-vantien.com: could not connect to host
 vasanth.org: did not receive HSTS header
 vaur.fr: could not connect to host
 vbh2o.com: did not receive HSTS header
 vbulletin-russia.com: could not connect to host
 vbulletinrussia.com: could not connect to host
 vcr.re: could not connect to host
 vdcomp.cz: could not connect to host
 vechkasov.ru: did not receive HSTS header
@@ -3227,17 +3226,16 @@ voceinveste.com: did not receive HSTS he
 voicesuk.co.uk: did not receive HSTS header
 volcrado.com: could not connect to host
 voliere-info.nl: did not receive HSTS header
 vorm2.com: did not receive HSTS header
 vortexhobbies.com: did not receive HSTS header
 votocek.cz: [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 121"  data: no]
 votockova.cz: [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 121"  data: no]
 vox.vg: did not receive HSTS header
-vozp.cz: max-age too low: 0
 vpl.me: did not receive HSTS header
 vpn-byen.dk: did not receive HSTS header
 vratny.space: could not connect to host
 vvl.me: did not receive HSTS header
 vxstream-sandbox.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 121"  data: no]
 vyncke.org: max-age too low: 2678400
 vyskocil.eu: did not receive HSTS header
 vzk.io: could not connect to host
@@ -3254,17 +3252,16 @@ walnutgaming.co.uk: could not connect to
 wanban.io: could not connect to host
 wangqiliang.xn--fiqs8s: did not receive HSTS header
 wangzuan168.cc: could not connect to host
 wapjt.cn: could not connect to host
 warandpeace.xyz: could not connect to host
 warhistoryonline.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 121"  data: no]
 warmlyyours.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 121"  data: no]
 warped.com: did not receive HSTS header
-wasserspucker.de: did not receive HSTS header
 wassim.is: could not connect to host
 watchium.com: did not receive HSTS header
 watchweasel.com: did not receive HSTS header
 watsonhall.uk: could not connect to host
 wave.is: could not connect to host
 wealthfactory.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 121"  data: no]
 wear2work.nl: did not receive HSTS header
 weaverhairextensions.nl: did not receive HSTS header
@@ -3299,29 +3296,31 @@ westerhoud.nl: did not receive HSTS head
 wettbuero.de: did not receive HSTS header
 wetten.eu: did not receive HSTS header
 wettertoertchen.com: did not receive HSTS header
 wetttipps.com: did not receive HSTS header
 wetttipps.de: did not receive HSTS header
 wevahoo.com: could not connect to host
 whats.io: could not connect to host
 whatsstalk.me: could not connect to host
+wheeler.kiwi.nz: could not connect to host
 when-release.com: did not receive HSTS header
 whitestagforge.com: could not connect to host
 whoclicks.net: could not connect to host
 whoisapi.online: could not connect to host
 wholebites.com: did not receive HSTS header
 whysuck.com: could not connect to host
 whyworldhot.com: could not connect to host
 wienholding.at: max-age too low: 0
 wieninternational.at: could not connect to host
 wiire.me: could not connect to host
 wikidsystems.com: could not connect to host
 wilf1rst.com: could not connect to host
 william.si: did not receive HSTS header
+williamsonshore.com: could not connect to host
 willosagiede.com: did not receive HSTS header
 winclient.cn: did not receive HSTS header
 winecodeavocado.com: did not receive HSTS header
 winpack.cf: could not connect to host
 winpack.eu.org: could not connect to host
 winsec.nl: did not receive HSTS header
 winshiplending.com: did not receive HSTS header
 winterschoen.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 121"  data: no]
@@ -3403,17 +3402,16 @@ xng.io: did not receive HSTS header
 xombra.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 121"  data: no]
 xpj.sx: could not connect to host
 xplore-dna.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 121"  data: no]
 xsmobile.de: 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
-xtremegaming.it: could not connect to host
 xuri.me: max-age too low: 2592000
 xxbase.com: could not connect to host
 y-o-w.com: did not receive HSTS header
 y-s.pw: did not receive HSTS header
 yal.sh: did not receive HSTS header
 yalook.com: did not receive HSTS header
 yamaken.jp: did not receive HSTS header
 yamamo10.com: could not connect to host
@@ -3451,26 +3449,25 @@ z3liff.net: could not connect to host
 za.search.yahoo.com: did not receive HSTS header
 zadieheimlich.com: did not receive HSTS header
 zamorano.edu: could not connect to host
 zap.yt: could not connect to host
 zarooba.com: did not receive HSTS header
 zbasenem.pl: did not receive HSTS header
 zbigniewgalucki.eu: did not receive HSTS header
 zbp.at: did not receive HSTS header
+zdbl.de: could not connect to host
 zebrababy.cn: did not receive HSTS header
 zeitpunkt-kulturmagazin.de: did not receive HSTS header
 zelezny.uk: did not receive HSTS header
 zelfstandigemakelaars.net: did not receive HSTS header
-zellari.ru: could not connect to host
 zenpayroll.com: did not receive HSTS header
 zentraler-kreditausschuss.de: did not receive HSTS header
 zentralwolke.de: did not receive HSTS header
 zera.com.au: could not connect to host
-zeto365.pl: could not connect to host
 zett4.me: did not receive HSTS header
 zh.search.yahoo.com: did not receive HSTS header
 zhaochen.xyz: could not connect to host
 zhaojin97.cn: max-age too low: 604800
 zhendingresources.com: max-age too low: 0
 zinc-x.com: could not connect to host
 zirtue.io: could not connect to host
 ziyuanabc.xyz: could not connect to host
--- 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(1487250653394000);
+const PRTime gPreloadListExpirationTime = INT64_C(1487336924860000);
 
 static const char kSTSHostTable[] = {
   /* "007sascha.de", true */ '0', '0', '7', 's', 'a', 's', 'c', 'h', 'a', '.', 'd', 'e', '\0',
   /* "00f.net", true */ '0', '0', 'f', '.', 'n', 'e', 't', '\0',
   /* "01electronica.com.ar", true */ '0', '1', 'e', 'l', 'e', 'c', 't', 'r', 'o', 'n', 'i', 'c', 'a', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0',
   /* "01seguridad.com.ar", true */ '0', '1', 's', 'e', 'g', 'u', 'r', 'i', 'd', 'a', 'd', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0',
   /* "050media.nl", true */ '0', '5', '0', 'm', 'e', 'd', 'i', 'a', '.', 'n', 'l', '\0',
   /* "0513c.com", true */ '0', '5', '1', '3', 'c', '.', 'c', 'o', 'm', '\0',
@@ -67,16 +67,17 @@ static const char kSTSHostTable[] = {
   /* "1a-diamantscheiben.de", true */ '1', 'a', '-', 'd', 'i', 'a', 'm', 'a', 'n', 't', 's', 'c', 'h', 'e', 'i', 'b', 'e', 'n', '.', 'd', 'e', '\0',
   /* "1a-vermessung.at", true */ '1', 'a', '-', 'v', 'e', 'r', 'm', 'e', 's', 's', 'u', 'n', 'g', '.', 'a', 't', '\0',
   /* "1a-werkstattgeraete.de", true */ '1', 'a', '-', 'w', 'e', 'r', 'k', 's', 't', 'a', 't', 't', 'g', 'e', 'r', 'a', 'e', 't', 'e', '.', 'd', 'e', '\0',
   /* "1atic.com", true */ '1', 'a', 't', 'i', 'c', '.', 'c', 'o', 'm', '\0',
   /* "1co-jp.net", true */ '1', 'c', 'o', '-', 'j', 'p', '.', 'n', 'e', 't', '\0',
   /* "1cover.com", true */ '1', 'c', 'o', 'v', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "1cover.com.au", true */ '1', 'c', 'o', 'v', 'e', 'r', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "1hourproofreading.com", true */ '1', 'h', 'o', 'u', 'r', 'p', 'r', 'o', 'o', 'f', 'r', 'e', 'a', 'd', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
+  /* "1item.co.il", true */ '1', 'i', 't', 'e', 'm', '.', 'c', 'o', '.', 'i', 'l', '\0',
   /* "1k8b.com", true */ '1', 'k', '8', 'b', '.', 'c', 'o', 'm', '\0',
   /* "1km.ro", true */ '1', 'k', 'm', '.', 'r', 'o', '\0',
   /* "1on1on1.de", true */ '1', 'o', 'n', '1', 'o', 'n', '1', '.', 'd', 'e', '\0',
   /* "1on1on1.tv", true */ '1', 'o', 'n', '1', 'o', 'n', '1', '.', 't', 'v', '\0',
   /* "1pw.ca", true */ '1', 'p', 'w', '.', 'c', 'a', '\0',
   /* "1px.tv", true */ '1', 'p', 'x', '.', 't', 'v', '\0',
   /* "1q365a.com", true */ '1', 'q', '3', '6', '5', 'a', '.', 'c', 'o', 'm', '\0',
   /* "1rs.nl", true */ '1', 'r', 's', '.', 'n', 'l', '\0',
@@ -398,17 +399,16 @@ static const char kSTSHostTable[] = {
   /* "aidanwoods.com", true */ 'a', 'i', 'd', 'a', 'n', 'w', 'o', 'o', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "aids.gov", true */ 'a', 'i', 'd', 's', '.', 'g', 'o', 'v', '\0',
   /* "aie.de", true */ 'a', 'i', 'e', '.', 'd', 'e', '\0',
   /* "aiesecarad.ro", true */ 'a', 'i', 'e', 's', 'e', 'c', 'a', 'r', 'a', 'd', '.', 'r', 'o', '\0',
   /* "aify.eu", true */ 'a', 'i', 'f', 'y', '.', 'e', 'u', '\0',
   /* "aigcev.org", true */ 'a', 'i', 'g', 'c', 'e', 'v', '.', 'o', 'r', 'g', '\0',
   /* "aikido-linz.at", true */ 'a', 'i', 'k', 'i', 'd', 'o', '-', 'l', 'i', 'n', 'z', '.', 'a', 't', '\0',
   /* "aikido-wels.at", true */ 'a', 'i', 'k', 'i', 'd', 'o', '-', 'w', 'e', 'l', 's', '.', 'a', 't', '\0',
-  /* "aiois.com", true */ 'a', 'i', 'o', 'i', 's', '.', 'c', 'o', 'm', '\0',
   /* "airbly.com", true */ 'a', 'i', 'r', 'b', 'l', 'y', '.', 'c', 'o', 'm', '\0',
   /* "airbnbopen.com", true */ 'a', 'i', 'r', 'b', 'n', 'b', 'o', 'p', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "airhelp.com", true */ 'a', 'i', 'r', 'h', 'e', 'l', 'p', '.', 'c', 'o', 'm', '\0',
   /* "airlea.com", true */ 'a', 'i', 'r', 'l', 'e', 'a', '.', 'c', 'o', 'm', '\0',
   /* "airlinecheckins.com", true */ 'a', 'i', 'r', 'l', 'i', 'n', 'e', 'c', 'h', 'e', 'c', 'k', 'i', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "airnow.gov", true */ 'a', 'i', 'r', 'n', 'o', 'w', '.', 'g', 'o', 'v', '\0',
   /* "airproto.com", true */ 'a', 'i', 'r', 'p', 'r', 'o', 't', 'o', '.', 'c', 'o', 'm', '\0',
   /* "airsoft.ch", true */ 'a', 'i', 'r', 's', 'o', 'f', 't', '.', 'c', 'h', '\0',
@@ -446,16 +446,17 @@ static const char kSTSHostTable[] = {
   /* "aladdinschools.appspot.com", true */ 'a', 'l', 'a', 'd', 'd', 'i', 'n', 's', 'c', 'h', 'o', 'o', 'l', 's', '.', 'a', 'p', 'p', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "alainwolf.ch", true */ 'a', 'l', 'a', 'i', 'n', 'w', 'o', 'l', 'f', '.', 'c', 'h', '\0',
   /* "alaninkenya.org", true */ 'a', 'l', 'a', 'n', 'i', 'n', 'k', 'e', 'n', 'y', 'a', '.', 'o', 'r', 'g', '\0',
   /* "alaricfavier.eu", true */ 'a', 'l', 'a', 'r', 'i', 'c', 'f', 'a', 'v', 'i', 'e', 'r', '.', 'e', 'u', '\0',
   /* "alasta.info", true */ 'a', 'l', 'a', 's', 't', 'a', '.', 'i', 'n', 'f', 'o', '\0',
   /* "alaundeil.xyz", true */ 'a', 'l', 'a', 'u', 'n', 'd', 'e', 'i', 'l', '.', 'x', 'y', 'z', '\0',
   /* "alberguecimballa.es", true */ 'a', 'l', 'b', 'e', 'r', 'g', 'u', 'e', 'c', 'i', 'm', 'b', 'a', 'l', 'l', 'a', '.', 'e', 's', '\0',
   /* "albersdruck.de", true */ 'a', 'l', 'b', 'e', 'r', 's', 'd', 'r', 'u', 'c', 'k', '.', 'd', 'e', '\0',
+  /* "albertbogdanowicz.pl", false */ 'a', 'l', 'b', 'e', 'r', 't', 'b', 'o', 'g', 'd', 'a', 'n', 'o', 'w', 'i', 'c', 'z', '.', 'p', 'l', '\0',
   /* "albion2.org", true */ 'a', 'l', 'b', 'i', 'o', 'n', '2', '.', 'o', 'r', 'g', '\0',
   /* "albuic.tk", true */ 'a', 'l', 'b', 'u', 'i', 'c', '.', 't', 'k', '\0',
   /* "alcorao.org", true */ 'a', 'l', 'c', 'o', 'r', 'a', 'o', '.', 'o', 'r', 'g', '\0',
   /* "aldes.co.za", true */ 'a', 'l', 'd', 'e', 's', '.', 'c', 'o', '.', 'z', 'a', '\0',
   /* "alecpap.com", true */ 'a', 'l', 'e', 'c', 'p', 'a', 'p', '.', 'c', 'o', 'm', '\0',
   /* "alecpapierniak.com", true */ 'a', 'l', 'e', 'c', 'p', 'a', 'p', 'i', 'e', 'r', 'n', 'i', 'a', 'k', '.', 'c', 'o', 'm', '\0',
   /* "alecrust.com", true */ 'a', 'l', 'e', 'c', 'r', 'u', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "aleksib.fi", true */ 'a', 'l', 'e', 'k', 's', 'i', 'b', '.', 'f', 'i', '\0',
@@ -588,16 +589,17 @@ static const char kSTSHostTable[] = {
   /* "analyticsinmotion.net", true */ 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', 'i', 'n', 'm', 'o', 't', 'i', 'o', 'n', '.', 'n', 'e', 't', '\0',
   /* "analyticum.at", true */ 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 'u', 'm', '.', 'a', 't', '\0',
   /* "analyticum.com", true */ 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 'u', 'm', '.', 'c', 'o', 'm', '\0',
   /* "analyticum.de", true */ 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 'u', 'm', '.', 'd', 'e', '\0',
   /* "analyticum.eu", true */ 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 'u', 'm', '.', 'e', 'u', '\0',
   /* "analyticum.net", true */ 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 'u', 'm', '.', 'n', 'e', 't', '\0',
   /* "analyzemyfriends.com", true */ 'a', 'n', 'a', 'l', 'y', 'z', 'e', 'm', 'y', 'f', 'r', 'i', 'e', 'n', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "ananke.io", true */ 'a', 'n', 'a', 'n', 'k', 'e', '.', 'i', 'o', '\0',
+  /* "anarka.org", true */ 'a', 'n', 'a', 'r', 'k', 'a', '.', 'o', 'r', 'g', '\0',
   /* "anastasia-shamara.ru", true */ 'a', 'n', 'a', 's', 't', 'a', 's', 'i', 'a', '-', 's', 'h', 'a', 'm', 'a', 'r', 'a', '.', 'r', 'u', '\0',
   /* "anastasiafond.com", true */ 'a', 'n', 'a', 's', 't', 'a', 's', 'i', 'a', 'f', 'o', 'n', 'd', '.', 'c', 'o', 'm', '\0',
   /* "and-stuff.nl", true */ 'a', 'n', 'd', '-', 's', 't', 'u', 'f', 'f', '.', 'n', 'l', '\0',
   /* "and.com", true */ 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0',
   /* "anderslind.dk", true */ 'a', 'n', 'd', 'e', 'r', 's', 'l', 'i', 'n', 'd', '.', 'd', 'k', '\0',
   /* "andiplusben.com", true */ 'a', 'n', 'd', 'i', 'p', 'l', 'u', 's', 'b', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "andisadhdspot.com", true */ 'a', 'n', 'd', 'i', 's', 'a', 'd', 'h', 'd', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "andre-ballensiefen.de", true */ 'a', 'n', 'd', 'r', 'e', '-', 'b', 'a', 'l', 'l', 'e', 'n', 's', 'i', 'e', 'f', 'e', 'n', '.', 'd', 'e', '\0',
@@ -684,17 +686,17 @@ static const char kSTSHostTable[] = {
   /* "anytonetech.com", true */ 'a', 'n', 'y', 't', 'o', 'n', 'e', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "anyways.at", true */ 'a', 'n', 'y', 'w', 'a', 'y', 's', '.', 'a', 't', '\0',
   /* "anzeiger.ag", true */ 'a', 'n', 'z', 'e', 'i', 'g', 'e', 'r', '.', 'a', 'g', '\0',
   /* "ao-dev.com", true */ 'a', 'o', '-', 'd', 'e', 'v', '.', 'c', 'o', 'm', '\0',
   /* "ao2.it", true */ 'a', 'o', '2', '.', 'i', 't', '\0',
   /* "aojf.fr", true */ 'a', 'o', 'j', 'f', '.', 'f', 'r', '\0',
   /* "aojiao.org", true */ 'a', 'o', 'j', 'i', 'a', 'o', '.', 'o', 'r', 'g', '\0',
   /* "aopedeure.nl", true */ 'a', 'o', 'p', 'e', 'd', 'e', 'u', 'r', 'e', '.', 'n', 'l', '\0',
-  /* "aosc.io", true */ 'a', 'o', 's', 'c', '.', 'i', 'o', '\0',
+  /* "aosc.io", false */ 'a', 'o', 's', 'c', '.', 'i', 'o', '\0',
   /* "aosus.org", true */ 'a', 'o', 's', 'u', 's', '.', 'o', 'r', 'g', '\0',
   /* "aovcentrum.nl", true */ 'a', 'o', 'v', 'c', 'e', 'n', 't', 'r', 'u', 'm', '.', 'n', 'l', '\0',
   /* "apachehaus.de", false */ 'a', 'p', 'a', 'c', 'h', 'e', 'h', 'a', 'u', 's', '.', 'd', 'e', '\0',
   /* "apadvantage.com", true */ 'a', 'p', 'a', 'd', 'v', 'a', 'n', 't', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "aperture-laboratories.science", true */ 'a', 'p', 'e', 'r', 't', 'u', 'r', 'e', '-', 'l', 'a', 'b', 'o', 'r', 'a', 't', 'o', 'r', 'i', 'e', 's', '.', 's', 'c', 'i', 'e', 'n', 'c', 'e', '\0',
   /* "aperturesciencelabs.de", true */ 'a', 'p', 'e', 'r', 't', 'u', 'r', 'e', 's', 'c', 'i', 'e', 'n', 'c', 'e', 'l', 'a', 'b', 's', '.', 'd', 'e', '\0',
   /* "apervita.net", true */ 'a', 'p', 'e', 'r', 'v', 'i', 't', 'a', '.', 'n', 'e', 't', '\0',
   /* "apexitsolutions.ca", true */ 'a', 'p', 'e', 'x', 'i', 't', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'a', '\0',
@@ -725,25 +727,27 @@ static const char kSTSHostTable[] = {
   /* "appdrinks.com", true */ 'a', 'p', 'p', 'd', 'r', 'i', 'n', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "appelboomdefilm.nl", true */ 'a', 'p', 'p', 'e', 'l', 'b', 'o', 'o', 'm', 'd', 'e', 'f', 'i', 'l', 'm', '.', 'n', 'l', '\0',
   /* "appengine.google.com", true */ 'a', 'p', 'p', 'e', 'n', 'g', 'i', 'n', 'e', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "apperio.com", true */ 'a', 'p', 'p', 'e', 'r', 'i', 'o', '.', 'c', 'o', 'm', '\0',
   /* "appharbor.com", true */ 'a', 'p', 'p', 'h', 'a', 'r', 'b', 'o', 'r', '.', 'c', 'o', 'm', '\0',
   /* "apple-watch-zubehoer.de", true */ 'a', 'p', 'p', 'l', 'e', '-', 'w', 'a', 't', 'c', 'h', '-', 'z', 'u', 'b', 'e', 'h', 'o', 'e', 'r', '.', 'd', 'e', '\0',
   /* "applelife.ru", true */ 'a', 'p', 'p', 'l', 'e', 'l', 'i', 'f', 'e', '.', 'r', 'u', '\0',
   /* "applemon.com", true */ 'a', 'p', 'p', 'l', 'e', 'm', 'o', 'n', '.', 'c', 'o', 'm', '\0',
+  /* "appleoosa.com", true */ 'a', 'p', 'p', 'l', 'e', 'o', 'o', 's', 'a', '.', 'c', 'o', 'm', '\0',
   /* "applian.jp", true */ 'a', 'p', 'p', 'l', 'i', 'a', 'n', '.', 'j', 'p', '\0',
   /* "apply.eu", true */ 'a', 'p', 'p', 'l', 'y', '.', 'e', 'u', '\0',
   /* "appmobile.io", true */ 'a', 'p', 'p', 'm', 'o', 'b', 'i', 'l', 'e', '.', 'i', 'o', '\0',
   /* "appointed.at", true */ 'a', 'p', 'p', 'o', 'i', 'n', 't', 'e', 'd', '.', 'a', 't', '\0',
   /* "appreciationkards.com", true */ 'a', 'p', 'p', 'r', 'e', 'c', 'i', 'a', 't', 'i', 'o', 'n', 'k', 'a', 'r', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "approbo.com", true */ 'a', 'p', 'p', 'r', 'o', 'b', 'o', '.', 'c', 'o', 'm', '\0',
   /* "apps.facebook.com", false */ 'a', 'p', 'p', 's', '.', 'f', 'a', 'c', 'e', 'b', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0',
   /* "apps.fedoraproject.org", true */ 'a', 'p', 'p', 's', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "apps.stg.fedoraproject.org", true */ 'a', 'p', 'p', 's', '.', 's', 't', 'g', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
+  /* "appsbystudio.co.uk", true */ 'a', 'p', 'p', 's', 'b', 'y', 's', 't', 'u', 'd', 'i', 'o', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "appsdash.io", true */ 'a', 'p', 'p', 's', 'd', 'a', 's', 'h', '.', 'i', 'o', '\0',
   /* "appson.co.uk", true */ 'a', 'p', 'p', 's', 'o', 'n', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "appui-de-fenetre.fr", true */ 'a', 'p', 'p', 'u', 'i', '-', 'd', 'e', '-', 'f', 'e', 'n', 'e', 't', 'r', 'e', '.', 'f', 'r', '\0',
   /* "appuro.com", true */ 'a', 'p', 'p', 'u', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "aprovpn.com", true */ 'a', 'p', 'r', 'o', 'v', 'p', 'n', '.', 'c', 'o', 'm', '\0',
   /* "aprsdroid.org", true */ 'a', 'p', 'r', 's', 'd', 'r', 'o', 'i', 'd', '.', 'o', 'r', 'g', '\0',
   /* "aprz.de", true */ 'a', 'p', 'r', 'z', '.', 'd', 'e', '\0',
   /* "apstudynotes.org", true */ 'a', 'p', 's', 't', 'u', 'd', 'y', 'n', 'o', 't', 'e', 's', '.', 'o', 'r', 'g', '\0',
@@ -1025,16 +1029,17 @@ static const char kSTSHostTable[] = {
   /* "baer.im", true */ 'b', 'a', 'e', 'r', '.', 'i', 'm', '\0',
   /* "baer.one", true */ 'b', 'a', 'e', 'r', '.', 'o', 'n', 'e', '\0',
   /* "baffinlee.com", true */ 'b', 'a', 'f', 'f', 'i', 'n', 'l', 'e', 'e', '.', 'c', 'o', 'm', '\0',
   /* "bagelsbakery.com", true */ 'b', 'a', 'g', 'e', 'l', 's', 'b', 'a', 'k', 'e', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "baggy.me.uk", true */ 'b', 'a', 'g', 'g', 'y', '.', 'm', 'e', '.', 'u', 'k', '\0',
   /* "bagheera.me.uk", true */ 'b', 'a', 'g', 'h', 'e', 'e', 'r', 'a', '.', 'm', 'e', '.', 'u', 'k', '\0',
   /* "bah.im", true */ 'b', 'a', 'h', '.', 'i', 'm', '\0',
   /* "baifubao.com", true */ 'b', 'a', 'i', 'f', 'u', 'b', 'a', 'o', '.', 'c', 'o', 'm', '\0',
+  /* "baiker.info", true */ 'b', 'a', 'i', 'k', 'e', 'r', '.', 'i', 'n', 'f', 'o', '\0',
   /* "bair.io", true */ 'b', 'a', 'i', 'r', '.', 'i', 'o', '\0',
   /* "baiyangliu.com", true */ 'b', 'a', 'i', 'y', 'a', 'n', 'g', 'l', 'i', 'u', '.', 'c', 'o', 'm', '\0',
   /* "bajic.ch", true */ 'b', 'a', 'j', 'i', 'c', '.', 'c', 'h', '\0',
   /* "bakabt.info", true */ 'b', 'a', 'k', 'a', 'b', 't', '.', 'i', 'n', 'f', 'o', '\0',
   /* "bakaweb.fr", true */ 'b', 'a', 'k', 'a', 'w', 'e', 'b', '.', 'f', 'r', '\0',
   /* "balboa.io", true */ 'b', 'a', 'l', 'b', 'o', 'a', '.', 'i', 'o', '\0',
   /* "baleares.party", true */ 'b', 'a', 'l', 'e', 'a', 'r', 'e', 's', '.', 'p', 'a', 'r', 't', 'y', '\0',
   /* "balikonos.cz", true */ 'b', 'a', 'l', 'i', 'k', 'o', 'n', 'o', 's', '.', 'c', 'z', '\0',
@@ -1371,16 +1376,17 @@ static const char kSTSHostTable[] = {
   /* "bitmoe.com", true */ 'b', 'i', 't', 'm', 'o', 'e', '.', 'c', 'o', 'm', '\0',
   /* "bitmon.net", true */ 'b', 'i', 't', 'm', 'o', 'n', '.', 'n', 'e', 't', '\0',
   /* "bitnet.io", false */ 'b', 'i', 't', 'n', 'e', 't', '.', 'i', 'o', '\0',
   /* "bitok.com", true */ 'b', 'i', 't', 'o', 'k', '.', 'c', 'o', 'm', '\0',
   /* "bitpod.de", true */ 'b', 'i', 't', 'p', 'o', 'd', '.', 'd', 'e', '\0',
   /* "bitrage.de", true */ 'b', 'i', 't', 'r', 'a', 'g', 'e', '.', 'd', 'e', '\0',
   /* "bitraum.io", true */ 'b', 'i', 't', 'r', 'a', 'u', 'm', '.', 'i', 'o', '\0',
   /* "bitref.com", true */ 'b', 'i', 't', 'r', 'e', 'f', '.', 'c', 'o', 'm', '\0',
+  /* "bitsensor.io", true */ 'b', 'i', 't', 's', 'e', 'n', 's', 'o', 'r', '.', 'i', 'o', '\0',
   /* "bitshaker.net", true */ 'b', 'i', 't', 's', 'h', 'a', 'k', 'e', 'r', '.', 'n', 'e', 't', '\0',
   /* "bitskins.co", true */ 'b', 'i', 't', 's', 'k', 'i', 'n', 's', '.', 'c', 'o', '\0',
   /* "bitskrieg.net", true */ 'b', 'i', 't', 's', 'k', 'r', 'i', 'e', 'g', '.', 'n', 'e', 't', '\0',
   /* "bittersweetcandybowl.com", true */ 'b', 'i', 't', 't', 'e', 'r', 's', 'w', 'e', 'e', 't', 'c', 'a', 'n', 'd', 'y', 'b', 'o', 'w', 'l', '.', 'c', 'o', 'm', '\0',
   /* "bittmann.me", true */ 'b', 'i', 't', 't', 'm', 'a', 'n', 'n', '.', 'm', 'e', '\0',
   /* "bittylicious.com", true */ 'b', 'i', 't', 't', 'y', 'l', 'i', 'c', 'i', 'o', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "bitvest.io", true */ 'b', 'i', 't', 'v', 'e', 's', 't', '.', 'i', 'o', '\0',
   /* "bitwolk.nl", true */ 'b', 'i', 't', 'w', 'o', 'l', 'k', '.', 'n', 'l', '\0',
@@ -1508,17 +1514,16 @@ static const char kSTSHostTable[] = {
   /* "bobancoamigo.com", true */ 'b', 'o', 'b', 'a', 'n', 'c', 'o', 'a', 'm', 'i', 'g', 'o', '.', 'c', 'o', 'm', '\0',
   /* "bobcopeland.com", true */ 'b', 'o', 'b', 'c', 'o', 'p', 'e', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0',
   /* "boboolo.com", true */ 'b', 'o', 'b', 'o', 'o', 'l', 'o', '.', 'c', 'o', 'm', '\0',
   /* "bochs.info", true */ 'b', 'o', 'c', 'h', 's', '.', 'i', 'n', 'f', 'o', '\0',
   /* "bodhi.fedoraproject.org", true */ 'b', 'o', 'd', 'h', 'i', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "bodrumfarm.com", true */ 'b', 'o', 'd', 'r', 'u', 'm', 'f', 'a', 'r', 'm', '.', 'c', 'o', 'm', '\0',
   /* "boeddhashop.nl", true */ 'b', 'o', 'e', 'd', 'd', 'h', 'a', 's', 'h', 'o', 'p', '.', 'n', 'l', '\0',
   /* "boernecancerfonden.dk", true */ 'b', 'o', 'e', 'r', 'n', 'e', 'c', 'a', 'n', 'c', 'e', 'r', 'f', 'o', 'n', 'd', 'e', 'n', '.', 'd', 'k', '\0',
-  /* "bohan.life", true */ 'b', 'o', 'h', 'a', 'n', '.', 'l', 'i', 'f', 'e', '\0',
   /* "bohramt.de", true */ 'b', 'o', 'h', 'r', 'a', 'm', 't', '.', 'd', 'e', '\0',
   /* "boilesen.com", true */ 'b', 'o', 'i', 'l', 'e', 's', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "boiseonlinemall.com", true */ 'b', 'o', 'i', 's', 'e', 'o', 'n', 'l', 'i', 'n', 'e', 'm', 'a', 'l', 'l', '.', 'c', 'o', 'm', '\0',
   /* "bokeyy.com", true */ 'b', 'o', 'k', 'e', 'y', 'y', '.', 'c', 'o', 'm', '\0',
   /* "bolt.cm", true */ 'b', 'o', 'l', 't', '.', 'c', 'm', '\0',
   /* "bombsquad.studio", true */ 'b', 'o', 'm', 'b', 's', 'q', 'u', 'a', 'd', '.', 's', 't', 'u', 'd', 'i', 'o', '\0',
   /* "bonapp.restaurant", true */ 'b', 'o', 'n', 'a', 'p', 'p', '.', 'r', 'e', 's', 't', 'a', 'u', 'r', 'a', 'n', 't', '\0',
   /* "bondskampeerder.nl", true */ 'b', 'o', 'n', 'd', 's', 'k', 'a', 'm', 'p', 'e', 'e', 'r', 'd', 'e', 'r', '.', 'n', 'l', '\0',
@@ -1677,16 +1682,17 @@ static const char kSTSHostTable[] = {
   /* "bueltge.de", true */ 'b', 'u', 'e', 'l', 't', 'g', 'e', '.', 'd', 'e', '\0',
   /* "buettgens.net", true */ 'b', 'u', 'e', 't', 't', 'g', 'e', 'n', 's', '.', 'n', 'e', 't', '\0',
   /* "buffaloautomation.com", true */ 'b', 'u', 'f', 'f', 'a', 'l', 'o', 'a', 'u', 't', 'o', 'm', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "buffalodrinkinggame.beer", true */ 'b', 'u', 'f', 'f', 'a', 'l', 'o', 'd', 'r', 'i', 'n', 'k', 'i', 'n', 'g', 'g', 'a', 'm', 'e', '.', 'b', 'e', 'e', 'r', '\0',
   /* "buffhack.com", true */ 'b', 'u', 'f', 'f', 'h', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0',
   /* "bugcrowd.com", true */ 'b', 'u', 'g', 'c', 'r', 'o', 'w', 'd', '.', 'c', 'o', 'm', '\0',
   /* "bugginslab.co.uk", true */ 'b', 'u', 'g', 'g', 'i', 'n', 's', 'l', 'a', 'b', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "bugs.chromium.org", true */ 'b', 'u', 'g', 's', '.', 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm', '.', 'o', 'r', 'g', '\0',
+  /* "bugtrack.co.uk", true */ 'b', 'u', 'g', 't', 'r', 'a', 'c', 'k', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "bugtrack.io", true */ 'b', 'u', 'g', 't', 'r', 'a', 'c', 'k', '.', 'i', 'o', '\0',
   /* "bugzil.la", true */ 'b', 'u', 'g', 'z', 'i', 'l', '.', 'l', 'a', '\0',
   /* "bugzilla.mozilla.org", true */ 'b', 'u', 'g', 'z', 'i', 'l', 'l', 'a', '.', 'm', 'o', 'z', 'i', 'l', 'l', 'a', '.', 'o', 'r', 'g', '\0',
   /* "buiko.com", true */ 'b', 'u', 'i', 'k', 'o', '.', 'c', 'o', 'm', '\0',
   /* "build.chromium.org", false */ 'b', 'u', 'i', 'l', 'd', '.', 'c', 'h', 'r', 'o', 'm', 'i', 'u', 'm', '.', 'o', 'r', 'g', '\0',
   /* "buildbox.io", true */ 'b', 'u', 'i', 'l', 'd', 'b', 'o', 'x', '.', 'i', 'o', '\0',
   /* "building-cost-estimators.com", true */ 'b', 'u', 'i', 'l', 'd', 'i', 'n', 'g', '-', 'c', 'o', 's', 't', '-', 'e', 's', 't', 'i', 'm', 'a', 't', 'o', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "builditsolutions.net", true */ 'b', 'u', 'i', 'l', 'd', 'i', 't', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'n', 'e', 't', '\0',
@@ -1726,16 +1732,17 @@ static const char kSTSHostTable[] = {
   /* "businessimmigration-eu.ru", true */ 'b', 'u', 's', 'i', 'n', 'e', 's', 's', 'i', 'm', 'm', 'i', 'g', 'r', 'a', 't', 'i', 'o', 'n', '-', 'e', 'u', '.', 'r', 'u', '\0',
   /* "businessloanconnection.org", true */ 'b', 'u', 's', 'i', 'n', 'e', 's', 's', 'l', 'o', 'a', 'n', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '.', 'o', 'r', 'g', '\0',
   /* "businessloanstoday.com", true */ 'b', 'u', 's', 'i', 'n', 'e', 's', 's', 'l', 'o', 'a', 'n', 's', 't', 'o', 'd', 'a', 'y', '.', 'c', 'o', 'm', '\0',
   /* "bustimes.org.uk", true */ 'b', 'u', 's', 't', 'i', 'm', 'e', 's', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "buyinginvestmentproperty.com", true */ 'b', 'u', 'y', 'i', 'n', 'g', 'i', 'n', 'v', 'e', 's', 't', 'm', 'e', 'n', 't', 'p', 'r', 'o', 'p', 'e', 'r', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "buzzconf.io", true */ 'b', 'u', 'z', 'z', 'c', 'o', 'n', 'f', '.', 'i', 'o', '\0',
   /* "bvionline.eu", true */ 'b', 'v', 'i', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'e', 'u', '\0',
   /* "bw.codes", true */ 'b', 'w', '.', 'c', 'o', 'd', 'e', 's', '\0',
+  /* "bw81.xyz", true */ 'b', 'w', '8', '1', '.', 'x', 'y', 'z', '\0',
   /* "bwcscorecard.org", true */ 'b', 'w', 'c', 's', 'c', 'o', 'r', 'e', 'c', 'a', 'r', 'd', '.', 'o', 'r', 'g', '\0',
   /* "bwear4all.de", true */ 'b', 'w', 'e', 'a', 'r', '4', 'a', 'l', 'l', '.', 'd', 'e', '\0',
   /* "bwh1.net", true */ 'b', 'w', 'h', '1', '.', 'n', 'e', 't', '\0',
   /* "bwilkinson.co.uk", true */ 'b', 'w', 'i', 'l', 'k', 'i', 'n', 's', 'o', 'n', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "bws16.de", true */ 'b', 'w', 's', '1', '6', '.', 'd', 'e', '\0',
   /* "bx-n.de", true */ 'b', 'x', '-', 'n', '.', 'd', 'e', '\0',
   /* "by4cqb.cn", true */ 'b', 'y', '4', 'c', 'q', 'b', '.', 'c', 'n', '\0',
   /* "bygningsregistrering.dk", true */ 'b', 'y', 'g', 'n', 'i', 'n', 'g', 's', 'r', 'e', 'g', 'i', 's', 't', 'r', 'e', 'r', 'i', 'n', 'g', '.', 'd', 'k', '\0',
@@ -1755,17 +1762,16 @@ static const char kSTSHostTable[] = {
   /* "bypassed.pw", true */ 'b', 'y', 'p', 'a', 's', 's', 'e', 'd', '.', 'p', 'w', '\0',
   /* "bypassed.rocks", true */ 'b', 'y', 'p', 'a', 's', 's', 'e', 'd', '.', 'r', 'o', 'c', 'k', 's', '\0',
   /* "bypassed.site", true */ 'b', 'y', 'p', 'a', 's', 's', 'e', 'd', '.', 's', 'i', 't', 'e', '\0',
   /* "byrko.cz", true */ 'b', 'y', 'r', 'k', 'o', '.', 'c', 'z', '\0',
   /* "byrko.sk", true */ 'b', 'y', 'r', 'k', 'o', '.', 's', 'k', '\0',
   /* "byronwade.com", true */ 'b', 'y', 'r', 'o', 'n', 'w', 'a', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "byrtz.de", true */ 'b', 'y', 'r', 't', 'z', '.', 'd', 'e', '\0',
   /* "byte-time.com", true */ 'b', 'y', 't', 'e', '-', 't', 'i', 'm', 'e', '.', 'c', 'o', 'm', '\0',
-  /* "byte.wtf", true */ 'b', 'y', 't', 'e', '.', 'w', 't', 'f', '\0',
   /* "bytejail.com", true */ 'b', 'y', 't', 'e', 'j', 'a', 'i', 'l', '.', 'c', 'o', 'm', '\0',
   /* "bytema.cz", true */ 'b', 'y', 't', 'e', 'm', 'a', '.', 'c', 'z', '\0',
   /* "byteshark.org", true */ 'b', 'y', 't', 'e', 's', 'h', 'a', 'r', 'k', '.', 'o', 'r', 'g', '\0',
   /* "bytesofcode.de", true */ 'b', 'y', 't', 'e', 's', 'o', 'f', 'c', 'o', 'd', 'e', '.', 'd', 'e', '\0',
   /* "bytesund.biz", true */ 'b', 'y', 't', 'e', 's', 'u', 'n', 'd', '.', 'b', 'i', 'z', '\0',
   /* "bytesunlimited.com", true */ 'b', 'y', 't', 'e', 's', 'u', 'n', 'l', 'i', 'm', 'i', 't', 'e', 'd', '.', 'c', 'o', 'm', '\0',
   /* "bytesystems.com", true */ 'b', 'y', 't', 'e', 's', 'y', 's', 't', 'e', 'm', 's', '.', 'c', 'o', 'm', '\0',
   /* "byteturtle.eu", true */ 'b', 'y', 't', 'e', 't', 'u', 'r', 't', 'l', 'e', '.', 'e', 'u', '\0',
@@ -1931,16 +1937,17 @@ static const char kSTSHostTable[] = {
   /* "cattivo.nl", true */ 'c', 'a', 't', 't', 'i', 'v', 'o', '.', 'n', 'l', '\0',
   /* "cavac.at", true */ 'c', 'a', 'v', 'a', 'c', '.', 'a', 't', '\0',
   /* "cazes.info", true */ 'c', 'a', 'z', 'e', 's', '.', 'i', 'n', 'f', 'o', '\0',
   /* "cbamo.org", true */ 'c', 'b', 'a', 'm', 'o', '.', 'o', 'r', 'g', '\0',
   /* "cbbank.com", true */ 'c', 'b', 'b', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0',
   /* "cbecrft.net", true */ 'c', 'b', 'e', 'c', 'r', 'f', 't', '.', 'n', 'e', 't', '\0',
   /* "cbtistexcalac.mx", true */ 'c', 'b', 't', 'i', 's', 't', 'e', 'x', 'c', 'a', 'l', 'a', 'c', '.', 'm', 'x', '\0',
   /* "ccayearbook.com", true */ 'c', 'c', 'a', 'y', 'e', 'a', 'r', 'b', 'o', 'o', 'k', '.', 'c', 'o', 'm', '\0',
+  /* "ccblog.de", true */ 'c', 'c', 'b', 'l', 'o', 'g', '.', 'd', 'e', '\0',
   /* "ccgn.co", true */ 'c', 'c', 'g', 'n', '.', 'c', 'o', '\0',
   /* "ccja.ro", false */ 'c', 'c', 'j', 'a', '.', 'r', 'o', '\0',
   /* "cdkeyworld.de", true */ 'c', 'd', 'k', 'e', 'y', 'w', 'o', 'r', 'l', 'd', '.', 'd', 'e', '\0',
   /* "cdlcenter.com", true */ 'c', 'd', 'l', 'c', 'e', 'n', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "cdnjs.com", true */ 'c', 'd', 'n', 'j', 's', '.', 'c', 'o', 'm', '\0',
   /* "cdt.org", true */ 'c', 'd', 't', '.', 'o', 'r', 'g', '\0',
   /* "cecipu.gob.cl", true */ 'c', 'e', 'c', 'i', 'p', 'u', '.', 'g', 'o', 'b', '.', 'c', 'l', '\0',
   /* "ced-services.nl", true */ 'c', 'e', 'd', '-', 's', 'e', 'r', 'v', 'i', 'c', 'e', 's', '.', 'n', 'l', '\0',
@@ -2211,17 +2218,17 @@ static const char kSTSHostTable[] = {
   /* "clockworksms.com", true */ 'c', 'l', 'o', 'c', 'k', 'w', 'o', 'r', 'k', 's', 'm', 's', '.', 'c', 'o', 'm', '\0',
   /* "close.com", false */ 'c', 'l', 'o', 's', 'e', '.', 'c', 'o', 'm', '\0',
   /* "closeli.cn", true */ 'c', 'l', 'o', 's', 'e', 'l', 'i', '.', 'c', 'n', '\0',
   /* "closeli.com", true */ 'c', 'l', 'o', 's', 'e', 'l', 'i', '.', 'c', 'o', 'm', '\0',
   /* "closient.com", true */ 'c', 'l', 'o', 's', 'i', 'e', 'n', 't', '.', 'c', 'o', 'm', '\0',
   /* "cloud-project.com", true */ 'c', 'l', 'o', 'u', 'd', '-', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'c', 'o', 'm', '\0',
   /* "cloud-surfer.net", true */ 'c', 'l', 'o', 'u', 'd', '-', 's', 'u', 'r', 'f', 'e', 'r', '.', 'n', 'e', 't', '\0',
   /* "cloud.google.com", true */ 'c', 'l', 'o', 'u', 'd', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0',
-  /* "cloud.gov", true */ 'c', 'l', 'o', 'u', 'd', '.', 'g', 'o', 'v', '\0',
+  /* "cloud.gov", false */ 'c', 'l', 'o', 'u', 'd', '.', 'g', 'o', 'v', '\0',
   /* "cloudapps.digital", true */ 'c', 'l', 'o', 'u', 'd', 'a', 'p', 'p', 's', '.', 'd', 'i', 'g', 'i', 't', 'a', 'l', '\0',
   /* "cloudbolin.es", true */ 'c', 'l', 'o', 'u', 'd', 'b', 'o', 'l', 'i', 'n', '.', 'e', 's', '\0',
   /* "cloudflareonazure.com", true */ 'c', 'l', 'o', 'u', 'd', 'f', 'l', 'a', 'r', 'e', 'o', 'n', 'a', 'z', 'u', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "cloudily.com", true */ 'c', 'l', 'o', 'u', 'd', 'i', 'l', 'y', '.', 'c', 'o', 'm', '\0',
   /* "cloudlink.club", true */ 'c', 'l', 'o', 'u', 'd', 'l', 'i', 'n', 'k', '.', 'c', 'l', 'u', 'b', '\0',
   /* "cloudmigrator365.com", true */ 'c', 'l', 'o', 'u', 'd', 'm', 'i', 'g', 'r', 'a', 't', 'o', 'r', '3', '6', '5', '.', 'c', 'o', 'm', '\0',
   /* "cloudpagesforwork.com", true */ 'c', 'l', 'o', 'u', 'd', 'p', 'a', 'g', 'e', 's', 'f', 'o', 'r', 'w', 'o', 'r', 'k', '.', 'c', 'o', 'm', '\0',
   /* "cloudpebble.net", true */ 'c', 'l', 'o', 'u', 'd', 'p', 'e', 'b', 'b', 'l', 'e', '.', 'n', 'e', 't', '\0',
@@ -2513,16 +2520,17 @@ static const char kSTSHostTable[] = {
   /* "cristiandeluxe.com", true */ 'c', 'r', 'i', 's', 't', 'i', 'a', 'n', 'd', 'e', 'l', 'u', 'x', 'e', '.', 'c', 'o', 'm', '\0',
   /* "critcola.com", true */ 'c', 'r', 'i', 't', 'c', 'o', 'l', 'a', '.', 'c', 'o', 'm', '\0',
   /* "critical.today", true */ 'c', 'r', 'i', 't', 'i', 'c', 'a', 'l', '.', 't', 'o', 'd', 'a', 'y', '\0',
   /* "criticalaim.com", true */ 'c', 'r', 'i', 't', 'i', 'c', 'a', 'l', 'a', 'i', 'm', '.', 'c', 'o', 'm', '\0',
   /* "criticalsurveys.co.uk", true */ 'c', 'r', 'i', 't', 'i', 'c', 'a', 'l', 's', 'u', 'r', 'v', 'e', 'y', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "crl-autos.com", true */ 'c', 'r', 'l', '-', 'a', 'u', 't', 'o', 's', '.', 'c', 'o', 'm', '\0',
   /* "crm.onlime.ch", false */ 'c', 'r', 'm', '.', 'o', 'n', 'l', 'i', 'm', 'e', '.', 'c', 'h', '\0',
   /* "cross-view.com", true */ 'c', 'r', 'o', 's', 's', '-', 'v', 'i', 'e', 'w', '.', 'c', 'o', 'm', '\0',
+  /* "cross-x.com", true */ 'c', 'r', 'o', 's', 's', '-', 'x', '.', 'c', 'o', 'm', '\0',
   /* "crosscom.ch", true */ 'c', 'r', 'o', 's', 's', 'c', 'o', 'm', '.', 'c', 'h', '\0',
   /* "crossfitblackwater.com", true */ 'c', 'r', 'o', 's', 's', 'f', 'i', 't', 'b', 'l', 'a', 'c', 'k', 'w', 'a', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "crosssellguide.com", true */ 'c', 'r', 'o', 's', 's', 's', 'e', 'l', 'l', 'g', 'u', 'i', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "crow.tw", true */ 'c', 'r', 'o', 'w', '.', 't', 'w', '\0',
   /* "crowdsupply.com", true */ 'c', 'r', 'o', 'w', 'd', 's', 'u', 'p', 'p', 'l', 'y', '.', 'c', 'o', 'm', '\0',
   /* "crownruler.com", true */ 'c', 'r', 'o', 'w', 'n', 'r', 'u', 'l', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "crstat.ru", true */ 'c', 'r', 's', 't', 'a', 't', '.', 'r', 'u', '\0',
   /* "crt.sh", true */ 'c', 'r', 't', '.', 's', 'h', '\0',
@@ -2655,17 +2663,16 @@ static const char kSTSHostTable[] = {
   /* "cygnius.net", true */ 'c', 'y', 'g', 'n', 'i', 'u', 's', '.', 'n', 'e', 't', '\0',
   /* "cymtech.net", true */ 'c', 'y', 'm', 't', 'e', 'c', 'h', '.', 'n', 'e', 't', '\0',
   /* "cyon.ch", true */ 'c', 'y', 'o', 'n', '.', 'c', 'h', '\0',
   /* "cyph.audio", true */ 'c', 'y', 'p', 'h', '.', 'a', 'u', 'd', 'i', 'o', '\0',
   /* "cyph.com", true */ 'c', 'y', 'p', 'h', '.', 'c', 'o', 'm', '\0',
   /* "cyph.im", true */ 'c', 'y', 'p', 'h', '.', 'i', 'm', '\0',
   /* "cyph.video", true */ 'c', 'y', 'p', 'h', '.', 'v', 'i', 'd', 'e', 'o', '\0',
   /* "cyprus-company-service.com", true */ 'c', 'y', 'p', 'r', 'u', 's', '-', 'c', 'o', 'm', 'p', 'a', 'n', 'y', '-', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0',
-  /* "cysec.biz", true */ 'c', 'y', 's', 'e', 'c', '.', 'b', 'i', 'z', '\0',
   /* "czakey.net", true */ 'c', 'z', 'a', 'k', 'e', 'y', '.', 'n', 'e', 't', '\0',
   /* "czbix.com", true */ 'c', 'z', 'b', 'i', 'x', '.', 'c', 'o', 'm', '\0',
   /* "czechamlp.com", true */ 'c', 'z', 'e', 'c', 'h', 'a', 'm', 'l', 'p', '.', 'c', 'o', 'm', '\0',
   /* "czechvirus.cz", true */ 'c', 'z', 'e', 'c', 'h', 'v', 'i', 'r', 'u', 's', '.', 'c', 'z', '\0',
   /* "czerno.com", true */ 'c', 'z', 'e', 'r', 'n', 'o', '.', 'c', 'o', 'm', '\0',
   /* "czk.mk", true */ 'c', 'z', 'k', '.', 'm', 'k', '\0',
   /* "czlx.co", true */ 'c', 'z', 'l', 'x', '.', 'c', 'o', '\0',
   /* "d-20.fr", true */ 'd', '-', '2', '0', '.', 'f', 'r', '\0',
@@ -2790,16 +2797,17 @@ static const char kSTSHostTable[] = {
   /* "datortipsen.se", true */ 'd', 'a', 't', 'o', 'r', 't', 'i', 'p', 's', 'e', 'n', '.', 's', 'e', '\0',
   /* "datsound.ru", true */ 'd', 'a', 't', 's', 'o', 'u', 'n', 'd', '.', 'r', 'u', '\0',
   /* "daveoc64.co.uk", true */ 'd', 'a', 'v', 'e', 'o', 'c', '6', '4', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "davescomputertips.com", true */ 'd', 'a', 'v', 'e', 's', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r', 't', 'i', 'p', 's', '.', 'c', 'o', 'm', '\0',
   /* "davevelopment.net", true */ 'd', 'a', 'v', 'e', 'v', 'e', 'l', 'o', 'p', 'm', 'e', 'n', 't', '.', 'n', 'e', 't', '\0',
   /* "david-corry.com", true */ 'd', 'a', 'v', 'i', 'd', '-', 'c', 'o', 'r', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "david-schiffmann.de", true */ 'd', 'a', 'v', 'i', 'd', '-', 's', 'c', 'h', 'i', 'f', 'f', 'm', 'a', 'n', 'n', '.', 'd', 'e', '\0',
   /* "david.kitchen", true */ 'd', 'a', 'v', 'i', 'd', '.', 'k', 'i', 't', 'c', 'h', 'e', 'n', '\0',
+  /* "davidadrian.org", true */ 'd', 'a', 'v', 'i', 'd', 'a', 'd', 'r', 'i', 'a', 'n', '.', 'o', 'r', 'g', '\0',
   /* "davidandersson.se", true */ 'd', 'a', 'v', 'i', 'd', 'a', 'n', 'd', 'e', 'r', 's', 's', 'o', 'n', '.', 's', 'e', '\0',
   /* "davidcrx.net", true */ 'd', 'a', 'v', 'i', 'd', 'c', 'r', 'x', '.', 'n', 'e', 't', '\0',
   /* "davidgouveia.net", true */ 'd', 'a', 'v', 'i', 'd', 'g', 'o', 'u', 'v', 'e', 'i', 'a', '.', 'n', 'e', 't', '\0',
   /* "davidgow.net", true */ 'd', 'a', 'v', 'i', 'd', 'g', 'o', 'w', '.', 'n', 'e', 't', '\0',
   /* "davidgrudl.com", true */ 'd', 'a', 'v', 'i', 'd', 'g', 'r', 'u', 'd', 'l', '.', 'c', 'o', 'm', '\0',
   /* "davidlillo.com", true */ 'd', 'a', 'v', 'i', 'd', 'l', 'i', 'l', 'l', 'o', '.', 'c', 'o', 'm', '\0',
   /* "davidlyness.com", true */ 'd', 'a', 'v', 'i', 'd', 'l', 'y', 'n', 'e', 's', 's', '.', 'c', 'o', 'm', '\0',
   /* "davidmcevoy.org.uk", true */ 'd', 'a', 'v', 'i', 'd', 'm', 'c', 'e', 'v', 'o', 'y', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
@@ -2930,17 +2938,16 @@ static const char kSTSHostTable[] = {
   /* "designsbyjanith.com", true */ 'd', 'e', 's', 'i', 'g', 'n', 's', 'b', 'y', 'j', 'a', 'n', 'i', 't', 'h', '.', 'c', 'o', 'm', '\0',
   /* "designthinking.or.jp", false */ 'd', 'e', 's', 'i', 'g', 'n', 't', 'h', 'i', 'n', 'k', 'i', 'n', 'g', '.', 'o', 'r', '.', 'j', 'p', '\0',
   /* "designville.cz", true */ 'd', 'e', 's', 'i', 'g', 'n', 'v', 'i', 'l', 'l', 'e', '.', 'c', 'z', '\0',
   /* "designville.sk", true */ 'd', 'e', 's', 'i', 'g', 'n', 'v', 'i', 'l', 'l', 'e', '.', 's', 'k', '\0',
   /* "desmaakvanplanten.be", true */ 'd', 'e', 's', 'm', 'a', 'a', 'k', 'v', 'a', 'n', 'p', 'l', 'a', 'n', 't', 'e', 'n', '.', 'b', 'e', '\0',
   /* "despora.de", true */ 'd', 'e', 's', 'p', 'o', 'r', 'a', '.', 'd', 'e', '\0',
   /* "desserteagleselvenar.tk", true */ 'd', 'e', 's', 's', 'e', 'r', 't', 'e', 'a', 'g', 'l', 'e', 's', 'e', 'l', 'v', 'e', 'n', 'a', 'r', '.', 't', 'k', '\0',
   /* "desterman.ru", true */ 'd', 'e', 's', 't', 'e', 'r', 'm', 'a', 'n', '.', 'r', 'u', '\0',
-  /* "destinationbijoux.fr", true */ 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'b', 'i', 'j', 'o', 'u', 'x', '.', 'f', 'r', '\0',
   /* "destom.be", true */ 'd', 'e', 's', 't', 'o', 'm', '.', 'b', 'e', '\0',
   /* "detectify.com", false */ 'd', 'e', 't', 'e', 'c', 't', 'i', 'f', 'y', '.', 'c', 'o', 'm', '\0',
   /* "dethemium.com", true */ 'd', 'e', 't', 'h', 'e', 'm', 'i', 'u', 'm', '.', 'c', 'o', 'm', '\0',
   /* "detoxsinutritie.ro", true */ 'd', 'e', 't', 'o', 'x', 's', 'i', 'n', 'u', 't', 'r', 'i', 't', 'i', 'e', '.', 'r', 'o', '\0',
   /* "detteflies.com", true */ 'd', 'e', 't', 't', 'e', 'f', 'l', 'i', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "deusu.de", true */ 'd', 'e', 'u', 's', 'u', '.', 'd', 'e', '\0',
   /* "deusu.org", true */ 'd', 'e', 'u', 's', 'u', '.', 'o', 'r', 'g', '\0',
   /* "deux.solutions", true */ 'd', 'e', 'u', 'x', '.', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '\0',
@@ -2976,18 +2983,16 @@ static const char kSTSHostTable[] = {
   /* "devops-survey.com", true */ 'd', 'e', 'v', 'o', 'p', 's', '-', 's', 'u', 'r', 'v', 'e', 'y', '.', 'c', 'o', 'm', '\0',
   /* "devopsconnected.com", false */ 'd', 'e', 'v', 'o', 'p', 's', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'e', 'd', '.', 'c', 'o', 'm', '\0',
   /* "devstaff.gr", true */ 'd', 'e', 'v', 's', 't', 'a', 'f', 'f', '.', 'g', 'r', '\0',
   /* "devtub.com", true */ 'd', 'e', 'v', 't', 'u', 'b', '.', 'c', 'o', 'm', '\0',
   /* "dewalch.net", true */ 'd', 'e', 'w', 'a', 'l', 'c', 'h', '.', 'n', 'e', 't', '\0',
   /* "dezeregio.nl", true */ 'd', 'e', 'z', 'e', 'r', 'e', 'g', 'i', 'o', '.', 'n', 'l', '\0',
   /* "dezmembrariromania.ro", true */ 'd', 'e', 'z', 'm', 'e', 'm', 'b', 'r', 'a', 'r', 'i', 'r', 'o', 'm', 'a', 'n', 'i', 'a', '.', 'r', 'o', '\0',
   /* "dfctaiwan.org", true */ 'd', 'f', 'c', 't', 'a', 'i', 'w', 'a', 'n', '.', 'o', 'r', 'g', '\0',
-  /* "dfekt.no", true */ 'd', 'f', 'e', 'k', 't', '.', 'n', 'o', '\0',
-  /* "dfektlan.no", true */ 'd', 'f', 'e', 'k', 't', 'l', 'a', 'n', '.', 'n', 'o', '\0',
   /* "dfranke.com", true */ 'd', 'f', 'r', 'a', 'n', 'k', 'e', '.', 'c', 'o', 'm', '\0',
   /* "dgeex.eu", true */ 'd', 'g', 'e', 'e', 'x', '.', 'e', 'u', '\0',
   /* "dgpot.com", true */ 'd', 'g', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "dgt-portal.de", true */ 'd', 'g', 't', '-', 'p', 'o', 'r', 't', 'a', 'l', '.', 'd', 'e', '\0',
   /* "dhautefeuille.eu", true */ 'd', 'h', 'a', 'u', 't', 'e', 'f', 'e', 'u', 'i', 'l', 'l', 'e', '.', 'e', 'u', '\0',
   /* "dhauwer.nl", true */ 'd', 'h', 'a', 'u', 'w', 'e', 'r', '.', 'n', 'l', '\0',
   /* "dhedegaard.dk", true */ 'd', 'h', 'e', 'd', 'e', 'g', 'a', 'a', 'r', 'd', '.', 'd', 'k', '\0',
   /* "dhome.at", true */ 'd', 'h', 'o', 'm', 'e', '.', 'a', 't', '\0',
@@ -3191,29 +3196,29 @@ static const char kSTSHostTable[] = {
   /* "donnons.org", true */ 'd', 'o', 'n', 'n', 'o', 'n', 's', '.', 'o', 'r', 'g', '\0',
   /* "donotcall.gov", true */ 'd', 'o', 'n', 'o', 't', 'c', 'a', 'l', 'l', '.', 'g', 'o', 'v', '\0',
   /* "donotlink.it", true */ 'd', 'o', 'n', 'o', 't', 'l', 'i', 'n', 'k', '.', 'i', 't', '\0',
   /* "donotspellitgav.in", true */ 'd', 'o', 'n', 'o', 't', 's', 'p', 'e', 'l', 'l', 'i', 't', 'g', 'a', 'v', '.', 'i', 'n', '\0',
   /* "donsbach-edv.de", true */ 'd', 'o', 'n', 's', 'b', 'a', 'c', 'h', '-', 'e', 'd', 'v', '.', 'd', 'e', '\0',
   /* "dontcageus.org", true */ 'd', 'o', 'n', 't', 'c', 'a', 'g', 'e', 'u', 's', '.', 'o', 'r', 'g', '\0',
   /* "donthedragonwilson.com", true */ 'd', 'o', 'n', 't', 'h', 'e', 'd', 'r', 'a', 'g', 'o', 'n', 'w', 'i', 'l', 's', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "donttrustrobots.nl", true */ 'd', 'o', 'n', 't', 't', 'r', 'u', 's', 't', 'r', 'o', 'b', 'o', 't', 's', '.', 'n', 'l', '\0',
-  /* "doobydude.us", true */ 'd', 'o', 'o', 'b', 'y', 'd', 'u', 'd', 'e', '.', 'u', 's', '\0',
   /* "doodledraw.ninja", true */ 'd', 'o', 'o', 'd', 'l', 'e', 'd', 'r', 'a', 'w', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "dooku.cz", true */ 'd', 'o', 'o', 'k', 'u', '.', 'c', 'z', '\0',
   /* "dooleytackaberry.com", true */ 'd', 'o', 'o', 'l', 'e', 'y', 't', 'a', 'c', 'k', 'a', 'b', 'e', 'r', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "doomsworld.com", true */ 'd', 'o', 'o', 'm', 's', 'w', 'o', 'r', 'l', 'd', '.', 'c', 'o', 'm', '\0',
   /* "doooonoooob.com", true */ 'd', 'o', 'o', 'o', 'o', 'n', 'o', 'o', 'o', 'o', 'b', '.', 'c', 'o', 'm', '\0',
   /* "doordecor.bg", true */ 'd', 'o', 'o', 'r', 'd', 'e', 'c', 'o', 'r', '.', 'b', 'g', '\0',
   /* "doorflow.com", true */ 'd', 'o', 'o', 'r', 'f', 'l', 'o', 'w', '.', 'c', 'o', 'm', '\0',
   /* "dopesoft.de", true */ 'd', 'o', 'p', 'e', 's', 'o', 'f', 't', '.', 'd', 'e', '\0',
   /* "doppenpost.nl", true */ 'd', 'o', 'p', 'p', 'e', 'n', 'p', 'o', 's', 't', '.', 'n', 'l', '\0',
   /* "dorianharmans.nl", true */ 'd', 'o', 'r', 'i', 'a', 'n', 'h', 'a', 'r', 'm', 'a', 'n', 's', '.', 'n', 'l', '\0',
   /* "dorianmuthig.com", true */ 'd', 'o', 'r', 'i', 'a', 'n', 'm', 'u', 't', 'h', 'i', 'g', '.', 'c', 'o', 'm', '\0',
   /* "dossplumbing.co.za", true */ 'd', 'o', 's', 's', 'p', 'l', 'u', 'm', 'b', 'i', 'n', 'g', '.', 'c', 'o', '.', 'z', 'a', '\0',
+  /* "dot.ro", true */ 'd', 'o', 't', '.', 'r', 'o', '\0',
   /* "dot42.no", true */ 'd', 'o', 't', '4', '2', '.', 'n', 'o', '\0',
   /* "dotbigbang.com", true */ 'd', 'o', 't', 'b', 'i', 'g', 'b', 'a', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "dotbox.org", true */ 'd', 'o', 't', 'b', 'o', 'x', '.', 'o', 'r', 'g', '\0',
   /* "dothebangthingsalon.com", true */ 'd', 'o', 't', 'h', 'e', 'b', 'a', 'n', 'g', 't', 'h', 'i', 'n', 'g', 's', 'a', 'l', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "dotkod.com", true */ 'd', 'o', 't', 'k', 'o', 'd', '.', 'c', 'o', 'm', '\0',
   /* "dotkod.pl", true */ 'd', 'o', 't', 'k', 'o', 'd', '.', 'p', 'l', '\0',
   /* "dotrox.net", true */ 'd', 'o', 't', 'r', 'o', 'x', '.', 'n', 'e', 't', '\0',
   /* "dotsiam.com", true */ 'd', 'o', 't', 's', 'i', 'a', 'm', '.', 'c', 'o', 'm', '\0',
@@ -3236,17 +3241,16 @@ static const char kSTSHostTable[] = {
   /* "dragonteam.ninja", true */ 'd', 'r', 'a', 'g', 'o', 'n', 't', 'e', 'a', 'm', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "drahcro.uk", true */ 'd', 'r', 'a', 'h', 'c', 'r', 'o', '.', 'u', 'k', '\0',
   /* "drainagebuizen.nl", true */ 'd', 'r', 'a', 'i', 'n', 'a', 'g', 'e', 'b', 'u', 'i', 'z', 'e', 'n', '.', 'n', 'l', '\0',
   /* "drakefortreasurer.sexy", true */ 'd', 'r', 'a', 'k', 'e', 'f', 'o', 'r', 't', 'r', 'e', 'a', 's', 'u', 'r', 'e', 'r', '.', 's', 'e', 'x', 'y', '\0',
   /* "drakeluce.com", true */ 'd', 'r', 'a', 'k', 'e', 'l', 'u', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "drakenprospero.com", true */ 'd', 'r', 'a', 'k', 'e', 'n', 'p', 'r', 'o', 's', 'p', 'e', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "dramaticpeople.com", true */ 'd', 'r', 'a', 'm', 'a', 't', 'i', 'c', 'p', 'e', 'o', 'p', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "dranderle.com", true */ 'd', 'r', 'a', 'n', 'd', 'e', 'r', 'l', 'e', '.', 'c', 'o', 'm', '\0',
-  /* "dranek.com", true */ 'd', 'r', 'a', 'n', 'e', 'k', '.', 'c', 'o', 'm', '\0',
   /* "draugr.de", true */ 'd', 'r', 'a', 'u', 'g', 'r', '.', 'd', 'e', '\0',
   /* "drawesome.uy", true */ 'd', 'r', 'a', 'w', 'e', 's', 'o', 'm', 'e', '.', 'u', 'y', '\0',
   /* "drawingcode.net", true */ 'd', 'r', 'a', 'w', 'i', 'n', 'g', 'c', 'o', 'd', 'e', '.', 'n', 'e', 't', '\0',
   /* "drdevil.ru", true */ 'd', 'r', 'd', 'e', 'v', 'i', 'l', '.', 'r', 'u', '\0',
   /* "drdim.ru", true */ 'd', 'r', 'd', 'i', 'm', '.', 'r', 'u', '\0',
   /* "dreamcreator108.com", true */ 'd', 'r', 'e', 'a', 'm', 'c', 'r', 'e', 'a', 't', 'o', 'r', '1', '0', '8', '.', 'c', 'o', 'm', '\0',
   /* "dreaming.solutions", true */ 'd', 'r', 'e', 'a', 'm', 'i', 'n', 'g', '.', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '\0',
   /* "dreamsforabetterworld.com.au", true */ 'd', 'r', 'e', 'a', 'm', 's', 'f', 'o', 'r', 'a', 'b', 'e', 't', 't', 'e', 'r', 'w', 'o', 'r', 'l', 'd', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
@@ -3286,17 +3290,19 @@ static const char kSTSHostTable[] = {
   /* "drweissbrot.net", true */ 'd', 'r', 'w', 'e', 'i', 's', 's', 'b', 'r', 'o', 't', '.', 'n', 'e', 't', '\0',
   /* "drycreekphoto.com", true */ 'd', 'r', 'y', 'c', 'r', 'e', 'e', 'k', 'p', 'h', 'o', 't', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ds-christiansen.de", true */ 'd', 's', '-', 'c', 'h', 'r', 'i', 's', 't', 'i', 'a', 'n', 's', 'e', 'n', '.', 'd', 'e', '\0',
   /* "dsbrowser.com", true */ 'd', 's', 'b', 'r', 'o', 'w', 's', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "dsebastien.net", true */ 'd', 's', 'e', 'b', 'a', 's', 't', 'i', 'e', 'n', '.', 'n', 'e', 't', '\0',
   /* "dsol.hu", true */ 'd', 's', 'o', 'l', '.', 'h', 'u', '\0',
   /* "dt27.org", true */ 'd', 't', '2', '7', '.', 'o', 'r', 'g', '\0',
   /* "dubaieveningsafari.com", true */ 'd', 'u', 'b', 'a', 'i', 'e', 'v', 'e', 'n', 'i', 'n', 'g', 's', 'a', 'f', 'a', 'r', 'i', '.', 'c', 'o', 'm', '\0',
+  /* "dubrovskiy.pro", true */ 'd', 'u', 'b', 'r', 'o', 'v', 's', 'k', 'i', 'y', '.', 'p', 'r', 'o', '\0',
   /* "duch.cloud", true */ 'd', 'u', 'c', 'h', '.', 'c', 'l', 'o', 'u', 'd', '\0',
+  /* "duckasylum.com", true */ 'd', 'u', 'c', 'k', 'a', 's', 'y', 'l', 'u', 'm', '.', 'c', 'o', 'm', '\0',
   /* "duckduckstart.com", true */ 'd', 'u', 'c', 'k', 'd', 'u', 'c', 'k', 's', 't', 'a', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "duckinc.net", true */ 'd', 'u', 'c', 'k', 'i', 'n', 'c', '.', 'n', 'e', 't', '\0',
   /* "ducohosting.com", true */ 'd', 'u', 'c', 'o', 'h', 'o', 's', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "duelysthub.com", true */ 'd', 'u', 'e', 'l', 'y', 's', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '\0',
   /* "duernberg.at", true */ 'd', 'u', 'e', 'r', 'n', 'b', 'e', 'r', 'g', '.', 'a', 't', '\0',
   /* "duijf.info", true */ 'd', 'u', 'i', 'j', 'f', '.', 'i', 'n', 'f', 'o', '\0',
   /* "duijfathome.nl", true */ 'd', 'u', 'i', 'j', 'f', 'a', 't', 'h', 'o', 'm', 'e', '.', 'n', 'l', '\0',
   /* "dukan-recepty.ru", true */ 'd', 'u', 'k', 'a', 'n', '-', 'r', 'e', 'c', 'e', 'p', 't', 'y', '.', 'r', 'u', '\0',
@@ -3679,16 +3685,17 @@ static const char kSTSHostTable[] = {
   /* "ericdiao.com", true */ 'e', 'r', 'i', 'c', 'd', 'i', 'a', 'o', '.', 'c', 'o', 'm', '\0',
   /* "erichalv.com", true */ 'e', 'r', 'i', 'c', 'h', 'a', 'l', 'v', '.', 'c', 'o', 'm', '\0',
   /* "erichorstmanshof.nl", true */ 'e', 'r', 'i', 'c', 'h', 'o', 'r', 's', 't', 'm', 'a', 'n', 's', 'h', 'o', 'f', '.', 'n', 'l', '\0',
   /* "ericisaweso.me", true */ 'e', 'r', 'i', 'c', 'i', 's', 'a', 'w', 'e', 's', 'o', '.', 'm', 'e', '\0',
   /* "ericleuthardt.com", true */ 'e', 'r', 'i', 'c', 'l', 'e', 'u', 't', 'h', 'a', 'r', 'd', 't', '.', 'c', 'o', 'm', '\0',
   /* "erico.jp", true */ 'e', 'r', 'i', 'c', 'o', '.', 'j', 'p', '\0',
   /* "ericwie.se", true */ 'e', 'r', 'i', 'c', 'w', 'i', 'e', '.', 's', 'e', '\0',
   /* "erigrid.eu", true */ 'e', 'r', 'i', 'g', 'r', 'i', 'd', '.', 'e', 'u', '\0',
+  /* "eriix.org", true */ 'e', 'r', 'i', 'i', 'x', '.', 'o', 'r', 'g', '\0',
   /* "erikhubers.nl", true */ 'e', 'r', 'i', 'k', 'h', 'u', 'b', 'e', 'r', 's', '.', 'n', 'l', '\0',
   /* "erikseth.de", true */ 'e', 'r', 'i', 'k', 's', 'e', 't', 'h', '.', 'd', 'e', '\0',
   /* "eriner.me", true */ 'e', 'r', 'i', 'n', 'e', 'r', '.', 'm', 'e', '\0',
   /* "erisrenee.com", true */ 'e', 'r', 'i', 's', 'r', 'e', 'n', 'e', 'e', '.', 'c', 'o', 'm', '\0',
   /* "ernest.ly", true */ 'e', 'r', 'n', 'e', 's', 't', '.', 'l', 'y', '\0',
   /* "ernesto.at", true */ 'e', 'r', 'n', 'e', 's', 't', 'o', '.', 'a', 't', '\0',
   /* "erp-band.ru", true */ 'e', 'r', 'p', '-', 'b', 'a', 'n', 'd', '.', 'r', 'u', '\0',
   /* "erp.band", true */ 'e', 'r', 'p', '.', 'b', 'a', 'n', 'd', '\0',
@@ -3785,19 +3792,21 @@ static const char kSTSHostTable[] = {
   /* "evasion-energie.com", true */ 'e', 'v', 'a', 's', 'i', 'o', 'n', '-', 'e', 'n', 'e', 'r', 'g', 'i', 'e', '.', 'c', 'o', 'm', '\0',
   /* "evasovova.cz", true */ 'e', 'v', 'a', 's', 'o', 'v', 'o', 'v', 'a', '.', 'c', 'z', '\0',
   /* "evdenevenakliyatankara.pw", false */ 'e', 'v', 'd', 'e', 'n', 'e', 'v', 'e', 'n', 'a', 'k', 'l', 'i', 'y', 'a', 't', 'a', 'n', 'k', 'a', 'r', 'a', '.', 'p', 'w', '\0',
   /* "evegalaxy.net", true */ 'e', 'v', 'e', 'g', 'a', 'l', 'a', 'x', 'y', '.', 'n', 'e', 't', '\0',
   /* "evelyndayman.com", true */ 'e', 'v', 'e', 'l', 'y', 'n', 'd', 'a', 'y', 'm', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "eventaro.com", true */ 'e', 'v', 'e', 'n', 't', 'a', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "everhome.de", true */ 'e', 'v', 'e', 'r', 'h', 'o', 'm', 'e', '.', 'd', 'e', '\0',
   /* "everling.lu", true */ 'e', 'v', 'e', 'r', 'l', 'i', 'n', 'g', '.', 'l', 'u', '\0',
+  /* "everwaking.com", false */ 'e', 'v', 'e', 'r', 'w', 'a', 'k', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "everylab.org", true */ 'e', 'v', 'e', 'r', 'y', 'l', 'a', 'b', '.', 'o', 'r', 'g', '\0',
   /* "everymove.org", true */ 'e', 'v', 'e', 'r', 'y', 'm', 'o', 'v', 'e', '.', 'o', 'r', 'g', '\0',
   /* "everywhere.cloud", true */ 'e', 'v', 'e', 'r', 'y', 'w', 'h', 'e', 'r', 'e', '.', 'c', 'l', 'o', 'u', 'd', '\0',
+  /* "eveseat.net", true */ 'e', 'v', 'e', 's', 'e', 'a', 't', '.', 'n', 'e', 't', '\0',
   /* "eveshamglass.co.uk", true */ 'e', 'v', 'e', 's', 'h', 'a', 'm', 'g', 'l', 'a', 's', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "evilized.de", true */ 'e', 'v', 'i', 'l', 'i', 'z', 'e', 'd', '.', 'd', 'e', '\0',
   /* "evilsay.com", true */ 'e', 'v', 'i', 'l', 's', 'a', 'y', '.', 'c', 'o', 'm', '\0',
   /* "evites.me", true */ 'e', 'v', 'i', 't', 'e', 's', '.', 'm', 'e', '\0',
   /* "evlear.com", true */ 'e', 'v', 'l', 'e', 'a', 'r', '.', 'c', 'o', 'm', '\0',
   /* "evodation.com", true */ 'e', 'v', 'o', 'd', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "evolutionlending.co.uk", true */ 'e', 'v', 'o', 'l', 'u', 't', 'i', 'o', 'n', 'l', 'e', 'n', 'd', 'i', 'n', 'g', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "evomon.com", true */ 'e', 'v', 'o', 'm', 'o', 'n', '.', 'c', 'o', 'm', '\0',
@@ -3812,16 +3821,17 @@ static const char kSTSHostTable[] = {
   /* "exceltobarcode.com", true */ 'e', 'x', 'c', 'e', 'l', 't', 'o', 'b', 'a', 'r', 'c', 'o', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "excessamerica.com", true */ 'e', 'x', 'c', 'e', 's', 's', 'a', 'm', 'e', 'r', 'i', 'c', 'a', '.', 'c', 'o', 'm', '\0',
   /* "exchangeworks.co", true */ 'e', 'x', 'c', 'h', 'a', 'n', 'g', 'e', 'w', 'o', 'r', 'k', 's', '.', 'c', 'o', '\0',
   /* "exekutori.com", true */ 'e', 'x', 'e', 'k', 'u', 't', 'o', 'r', 'i', '.', 'c', 'o', 'm', '\0',
   /* "exemples-de-stands.com", true */ 'e', 'x', 'e', 'm', 'p', 'l', 'e', 's', '-', 'd', 'e', '-', 's', 't', 'a', 'n', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "exeria.de", true */ 'e', 'x', 'e', 'r', 'i', 'a', '.', 'd', 'e', '\0',
   /* "exgaywatch.com", true */ 'e', 'x', 'g', 'a', 'y', 'w', 'a', 't', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "exiahost.com", true */ 'e', 'x', 'i', 'a', 'h', 'o', 's', 't', '.', 'c', 'o', 'm', '\0',
+  /* "exon.io", true */ 'e', 'x', 'o', 'n', '.', 'i', 'o', '\0',
   /* "exoscale.ch", true */ 'e', 'x', 'o', 's', 'c', 'a', 'l', 'e', '.', 'c', 'h', '\0',
   /* "exoticads.com", true */ 'e', 'x', 'o', 't', 'i', 'c', 'a', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "exousiakaidunamis.xyz", true */ 'e', 'x', 'o', 'u', 's', 'i', 'a', 'k', 'a', 'i', 'd', 'u', 'n', 'a', 'm', 'i', 's', '.', 'x', 'y', 'z', '\0',
   /* "exp.de", true */ 'e', 'x', 'p', '.', 'd', 'e', '\0',
   /* "expatads.com", true */ 'e', 'x', 'p', 'a', 't', 'a', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "experienceoz.com.au", true */ 'e', 'x', 'p', 'e', 'r', 'i', 'e', 'n', 'c', 'e', 'o', 'z', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "experteasy.com.au", true */ 'e', 'x', 'p', 'e', 'r', 't', 'e', 'a', 's', 'y', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "experts-en-gestion.fr", true */ 'e', 'x', 'p', 'e', 'r', 't', 's', '-', 'e', 'n', '-', 'g', 'e', 's', 't', 'i', 'o', 'n', '.', 'f', 'r', '\0',
@@ -3917,16 +3927,17 @@ static const char kSTSHostTable[] = {
   /* "fanvoice.com", true */ 'f', 'a', 'n', 'v', 'o', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "fanyue123.tk", true */ 'f', 'a', 'n', 'y', 'u', 'e', '1', '2', '3', '.', 't', 'k', '\0',
   /* "fanz.pro", true */ 'f', 'a', 'n', 'z', '.', 'p', 'r', 'o', '\0',
   /* "fap.no", true */ 'f', 'a', 'p', '.', 'n', 'o', '\0',
   /* "faq.lookout.com", false */ 'f', 'a', 'q', '.', 'l', 'o', 'o', 'k', 'o', 'u', 't', '.', 'c', 'o', 'm', '\0',
   /* "faretravel.co.uk", true */ 'f', 'a', 'r', 'e', 't', 'r', 'a', 'v', 'e', 'l', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "fargtorget.se", true */ 'f', 'a', 'r', 'g', 't', 'o', 'r', 'g', 'e', 't', '.', 's', 'e', '\0',
   /* "farhadexchange.com", true */ 'f', 'a', 'r', 'h', 'a', 'd', 'e', 'x', 'c', 'h', 'a', 'n', 'g', 'e', '.', 'c', 'o', 'm', '\0',
+  /* "farhood.org", true */ 'f', 'a', 'r', 'h', 'o', 'o', 'd', '.', 'o', 'r', 'g', '\0',
   /* "farmacialaboratorio.it", true */ 'f', 'a', 'r', 'm', 'a', 'c', 'i', 'a', 'l', 'a', 'b', 'o', 'r', 'a', 't', 'o', 'r', 'i', 'o', '.', 'i', 't', '\0',
   /* "fasdoutreach.ca", true */ 'f', 'a', 's', 'd', 'o', 'u', 't', 'r', 'e', 'a', 'c', 'h', '.', 'c', 'a', '\0',
   /* "fashion.net", true */ 'f', 'a', 's', 'h', 'i', 'o', 'n', '.', 'n', 'e', 't', '\0',
   /* "fashionholic.my", true */ 'f', 'a', 's', 'h', 'i', 'o', 'n', 'h', 'o', 'l', 'i', 'c', '.', 'm', 'y', '\0',
   /* "fashionunited.cl", true */ 'f', 'a', 's', 'h', 'i', 'o', 'n', 'u', 'n', 'i', 't', 'e', 'd', '.', 'c', 'l', '\0',
   /* "fashionunited.com", true */ 'f', 'a', 's', 'h', 'i', 'o', 'n', 'u', 'n', 'i', 't', 'e', 'd', '.', 'c', 'o', 'm', '\0',
   /* "fashionunited.com.ar", true */ 'f', 'a', 's', 'h', 'i', 'o', 'n', 'u', 'n', 'i', 't', 'e', 'd', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0',
   /* "fashionunited.hk", true */ 'f', 'a', 's', 'h', 'i', 'o', 'n', 'u', 'n', 'i', 't', 'e', 'd', '.', 'h', 'k', '\0',
@@ -3982,17 +3993,16 @@ static const char kSTSHostTable[] = {
   /* "fernandes.org", true */ 'f', 'e', 'r', 'n', 'a', 'n', 'd', 'e', 's', '.', 'o', 'r', 'g', '\0',
   /* "fernandob.com", true */ 'f', 'e', 'r', 'n', 'a', 'n', 'd', 'o', 'b', '.', 'c', 'o', 'm', '\0',
   /* "fernandobarillas.com", true */ 'f', 'e', 'r', 'n', 'a', 'n', 'd', 'o', 'b', 'a', 'r', 'i', 'l', 'l', 'a', 's', '.', 'c', 'o', 'm', '\0',
   /* "fernseher-kauf.de", true */ 'f', 'e', 'r', 'n', 's', 'e', 'h', 'e', 'r', '-', 'k', 'a', 'u', 'f', '.', 'd', 'e', '\0',
   /* "ferrolatino.ch", true */ 'f', 'e', 'r', 'r', 'o', 'l', 'a', 't', 'i', 'n', 'o', '.', 'c', 'h', '\0',
   /* "ferrolatino.com", true */ 'f', 'e', 'r', 'r', 'o', 'l', 'a', 't', 'i', 'n', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ferrugem.org", true */ 'f', 'e', 'r', 'r', 'u', 'g', 'e', 'm', '.', 'o', 'r', 'g', '\0',
   /* "festivalxdentro.com", true */ 'f', 'e', 's', 't', 'i', 'v', 'a', 'l', 'x', 'd', 'e', 'n', 't', 'r', 'o', '.', 'c', 'o', 'm', '\0',
-  /* "festrip.com", true */ 'f', 'e', 's', 't', 'r', 'i', 'p', '.', 'c', 'o', 'm', '\0',
   /* "fetch.co.uk", true */ 'f', 'e', 't', 'c', 'h', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "feudalisten.de", true */ 'f', 'e', 'u', 'd', 'a', 'l', 'i', 's', 't', 'e', 'n', '.', 'd', 'e', '\0',
   /* "feuerwehr-oberkotzau.de", true */ 'f', 'e', 'u', 'e', 'r', 'w', 'e', 'h', 'r', '-', 'o', 'b', 'e', 'r', 'k', 'o', 't', 'z', 'a', 'u', '.', 'd', 'e', '\0',
   /* "fewo-thueringer-wald.de", true */ 'f', 'e', 'w', 'o', '-', 't', 'h', 'u', 'e', 'r', 'i', 'n', 'g', 'e', 'r', '-', 'w', 'a', 'l', 'd', '.', 'd', 'e', '\0',
   /* "fexco.com", true */ 'f', 'e', 'x', 'c', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ff-bad-hoehenstadt.de", true */ 'f', 'f', '-', 'b', 'a', 'd', '-', 'h', 'o', 'e', 'h', 'e', 'n', 's', 't', 'a', 'd', 't', '.', 'd', 'e', '\0',
   /* "ff-obersunzing-niedersunzing.de", true */ 'f', 'f', '-', 'o', 'b', 'e', 'r', 's', 'u', 'n', 'z', 'i', 'n', 'g', '-', 'n', 'i', 'e', 'd', 'e', 'r', 's', 'u', 'n', 'z', 'i', 'n', 'g', '.', 'd', 'e', '\0',
   /* "ffbans.org", true */ 'f', 'f', 'b', 'a', 'n', 's', '.', 'o', 'r', 'g', '\0',
@@ -4068,17 +4078,16 @@ static const char kSTSHostTable[] = {
   /* "fish-hook.ru", true */ 'f', 'i', 's', 'h', '-', 'h', 'o', 'o', 'k', '.', 'r', 'u', '\0',
   /* "fitbylo.com", true */ 'f', 'i', 't', 'b', 'y', 'l', 'o', '.', 'c', 'o', 'm', '\0',
   /* "fitiapp.com", true */ 'f', 'i', 't', 'i', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
   /* "fitkram.cz", true */ 'f', 'i', 't', 'k', 'r', 'a', 'm', '.', 'c', 'z', '\0',
   /* "fitnesswerk.de", true */ 'f', 'i', 't', 'n', 'e', 's', 's', 'w', 'e', 'r', 'k', '.', 'd', 'e', '\0',
   /* "fittelo.cz", true */ 'f', 'i', 't', 't', 'e', 'l', 'o', '.', 'c', 'z', '\0',
   /* "fitzsim.org", true */ 'f', 'i', 't', 'z', 's', 'i', 'm', '.', 'o', 'r', 'g', '\0',
   /* "fiws.net", true */ 'f', 'i', 'w', 's', '.', 'n', 'e', 't', '\0',
-  /* "fixatom.com", true */ 'f', 'i', 'x', 'a', 't', 'o', 'm', '.', 'c', 'o', 'm', '\0',
   /* "fixel.express", true */ 'f', 'i', 'x', 'e', 'l', '.', 'e', 'x', 'p', 'r', 'e', 's', 's', '\0',
   /* "fixforce.nl", true */ 'f', 'i', 'x', 'f', 'o', 'r', 'c', 'e', '.', 'n', 'l', '\0',
   /* "fixhotsauce.com", true */ 'f', 'i', 'x', 'h', 'o', 't', 's', 'a', 'u', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "fixmycomputerdude.com", true */ 'f', 'i', 'x', 'm', 'y', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r', 'd', 'u', 'd', 'e', '.', 'c', 'o', 'm', '\0',
   /* "fizz.buzz", true */ 'f', 'i', 'z', 'z', '.', 'b', 'u', 'z', 'z', '\0',
   /* "fj.simple.com", false */ 'f', 'j', '.', 's', 'i', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "fjruiz.es", true */ 'f', 'j', 'r', 'u', 'i', 'z', '.', 'e', 's', '\0',
   /* "flaemig42.de", true */ 'f', 'l', 'a', 'e', 'm', 'i', 'g', '4', '2', '.', 'd', 'e', '\0',
@@ -4123,16 +4132,17 @@ static const char kSTSHostTable[] = {
   /* "floriankeller.de", true */ 'f', 'l', 'o', 'r', 'i', 'a', 'n', 'k', 'e', 'l', 'l', 'e', 'r', '.', 'd', 'e', '\0',
   /* "florianmitrea.uk", true */ 'f', 'l', 'o', 'r', 'i', 'a', 'n', 'm', 'i', 't', 'r', 'e', 'a', '.', 'u', 'k', '\0',
   /* "floridafieros.org", true */ 'f', 'l', 'o', 'r', 'i', 'd', 'a', 'f', 'i', 'e', 'r', 'o', 's', '.', 'o', 'r', 'g', '\0',
   /* "florismoo.nl", true */ 'f', 'l', 'o', 'r', 'i', 's', 'm', 'o', 'o', '.', 'n', 'l', '\0',
   /* "florismouwen.com", true */ 'f', 'l', 'o', 'r', 'i', 's', 'm', 'o', 'u', 'w', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "florisvdk.net", true */ 'f', 'l', 'o', 'r', 'i', 's', 'v', 'd', 'k', '.', 'n', 'e', 't', '\0',
   /* "floskelwolke.de", true */ 'f', 'l', 'o', 's', 'k', 'e', 'l', 'w', 'o', 'l', 'k', 'e', '.', 'd', 'e', '\0',
   /* "flow.pe", true */ 'f', 'l', 'o', 'w', '.', 'p', 'e', '\0',
+  /* "flow.su", true */ 'f', 'l', 'o', 'w', '.', 's', 'u', '\0',
   /* "floweslawncare.com", true */ 'f', 'l', 'o', 'w', 'e', 's', 'l', 'a', 'w', 'n', 'c', 'a', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "flowlo.me", true */ 'f', 'l', 'o', 'w', 'l', 'o', '.', 'm', 'e', '\0',
   /* "flox.io", true */ 'f', 'l', 'o', 'x', '.', 'i', 'o', '\0',
   /* "flra.gov", true */ 'f', 'l', 'r', 'a', '.', 'g', 'o', 'v', '\0',
   /* "fluidojobs.com", true */ 'f', 'l', 'u', 'i', 'd', 'o', 'j', 'o', 'b', 's', '.', 'c', 'o', 'm', '\0',
   /* "flukethoughts.com", true */ 'f', 'l', 'u', 'k', 'e', 't', 'h', 'o', 'u', 'g', 'h', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "fluxent.de", false */ 'f', 'l', 'u', 'x', 'e', 'n', 't', '.', 'd', 'e', '\0',
   /* "fluxfingers.net", true */ 'f', 'l', 'u', 'x', 'f', 'i', 'n', 'g', 'e', 'r', 's', '.', 'n', 'e', 't', '\0',
@@ -4284,17 +4294,16 @@ static const char kSTSHostTable[] = {
   /* "frogatto.com", true */ 'f', 'r', 'o', 'g', 'a', 't', 't', 'o', '.', 'c', 'o', 'm', '\0',
   /* "frogeye.fr", true */ 'f', 'r', 'o', 'g', 'e', 'y', 'e', '.', 'f', 'r', '\0',
   /* "fromix.de", true */ 'f', 'r', 'o', 'm', 'i', 'x', '.', 'd', 'e', '\0',
   /* "fromlemaytoz.com", true */ 'f', 'r', 'o', 'm', 'l', 'e', 'm', 'a', 'y', 't', 'o', 'z', '.', 'c', 'o', 'm', '\0',
   /* "fromscratch.rocks", true */ 'f', 'r', 'o', 'm', 's', 'c', 'r', 'a', 't', 'c', 'h', '.', 'r', 'o', 'c', 'k', 's', '\0',
   /* "fronteers.nl", true */ 'f', 'r', 'o', 'n', 't', 'e', 'e', 'r', 's', '.', 'n', 'l', '\0',
   /* "frontisme.nl", true */ 'f', 'r', 'o', 'n', 't', 'i', 's', 'm', 'e', '.', 'n', 'l', '\0',
   /* "froot.se", true */ 'f', 'r', 'o', 'o', 't', '.', 's', 'e', '\0',
-  /* "frost-ci.xyz", true */ 'f', 'r', 'o', 's', 't', '-', 'c', 'i', '.', 'x', 'y', 'z', '\0',
   /* "frosty-gaming.xyz", true */ 'f', 'r', 'o', 's', 't', 'y', '-', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'x', 'y', 'z', '\0',
   /* "frothy.coffee", true */ 'f', 'r', 'o', 't', 'h', 'y', '.', 'c', 'o', 'f', 'f', 'e', 'e', '\0',
   /* "frowin-stemmer.de", true */ 'f', 'r', 'o', 'w', 'i', 'n', '-', 's', 't', 'e', 'm', 'm', 'e', 'r', '.', 'd', 'e', '\0',
   /* "froxlor.support", true */ 'f', 'r', 'o', 'x', 'l', 'o', 'r', '.', 's', 'u', 'p', 'p', 'o', 'r', 't', '\0',
   /* "frtn.com", true */ 'f', 'r', 't', 'n', '.', 'c', 'o', 'm', '\0',
   /* "frtr.gov", true */ 'f', 'r', 't', 'r', '.', 'g', 'o', 'v', '\0',
   /* "fruchthof24.de", true */ 'f', 'r', 'u', 'c', 'h', 't', 'h', 'o', 'f', '2', '4', '.', 'd', 'e', '\0',
   /* "frugro.be", true */ 'f', 'r', 'u', 'g', 'r', 'o', '.', 'b', 'e', '\0',
@@ -4452,16 +4461,17 @@ static const char kSTSHostTable[] = {
   /* "ge1.me", false */ 'g', 'e', '1', '.', 'm', 'e', '\0',
   /* "ge3k.net", false */ 'g', 'e', '3', 'k', '.', 'n', 'e', 't', '\0',
   /* "gearset.com", true */ 'g', 'e', 'a', 'r', 's', 'e', 't', '.', 'c', 'o', 'm', '\0',
   /* "geblitzt.de", true */ 'g', 'e', 'b', 'l', 'i', 't', 'z', 't', '.', 'd', 'e', '\0',
   /* "gecem.org", true */ 'g', 'e', 'c', 'e', 'm', '.', 'o', 'r', 'g', '\0',
   /* "gechr.io", true */ 'g', 'e', 'c', 'h', 'r', '.', 'i', 'o', '\0',
   /* "geder.at", true */ 'g', 'e', 'd', 'e', 'r', '.', 'a', 't', '\0',
   /* "gee.is", true */ 'g', 'e', 'e', '.', 'i', 's', '\0',
+  /* "geek-hub.de", true */ 'g', 'e', 'e', 'k', '-', 'h', 'u', 'b', '.', 'd', 'e', '\0',
   /* "geek.com.tw", true */ 'g', 'e', 'e', 'k', '.', 'c', 'o', 'm', '.', 't', 'w', '\0',
   /* "geek.tw", true */ 'g', 'e', 'e', 'k', '.', 't', 'w', '\0',
   /* "geekabit.nl", true */ 'g', 'e', 'e', 'k', 'a', 'b', 'i', 't', '.', 'n', 'l', '\0',
   /* "geekandi.com", true */ 'g', 'e', 'e', 'k', 'a', 'n', 'd', 'i', '.', 'c', 'o', 'm', '\0',
   /* "geekariom.com", true */ 'g', 'e', 'e', 'k', 'a', 'r', 'i', 'o', 'm', '.', 'c', 'o', 'm', '\0',
   /* "geekbundle.org", true */ 'g', 'e', 'e', 'k', 'b', 'u', 'n', 'd', 'l', 'e', '.', 'o', 'r', 'g', '\0',
   /* "geeklair.net", true */ 'g', 'e', 'e', 'k', 'l', 'a', 'i', 'r', '.', 'n', 'e', 't', '\0',
   /* "geeknik.com", true */ 'g', 'e', 'e', 'k', 'n', 'i', 'k', '.', 'c', 'o', 'm', '\0',
@@ -4554,17 +4564,16 @@ static const char kSTSHostTable[] = {
   /* "gflclan.ru", true */ 'g', 'f', 'l', 'c', 'l', 'a', 'n', '.', 'r', 'u', '\0',
   /* "ggmmontascale.it", true */ 'g', 'g', 'm', 'm', 'o', 'n', 't', 'a', 's', 'c', 'a', 'l', 'e', '.', 'i', 't', '\0',
   /* "ggp2.com", true */ 'g', 'g', 'p', '2', '.', 'c', 'o', 'm', '\0',
   /* "ggservers.com", true */ 'g', 'g', 's', 'e', 'r', 'v', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "ggss.cf", true */ 'g', 'g', 's', 's', '.', 'c', 'f', '\0',
   /* "ggss.ml", true */ 'g', 'g', 's', 's', '.', 'm', 'l', '\0',
   /* "ggx.us", true */ 'g', 'g', 'x', '.', 'u', 's', '\0',
   /* "gh16.com.ar", true */ 'g', 'h', '1', '6', '.', 'c', 'o', 'm', '.', 'a', 'r', '\0',
-  /* "gha.st", true */ 'g', 'h', 'a', '.', 's', 't', '\0',
   /* "ghcif.de", true */ 'g', 'h', 'c', 'i', 'f', '.', 'd', 'e', '\0',
   /* "gheorghe-sarcov.ga", true */ 'g', 'h', 'e', 'o', 'r', 'g', 'h', 'e', '-', 's', 'a', 'r', 'c', 'o', 'v', '.', 'g', 'a', '\0',
   /* "ghostblog.info", true */ 'g', 'h', 'o', 's', 't', 'b', 'l', 'o', 'g', '.', 'i', 'n', 'f', 'o', '\0',
   /* "ghostwritershigh.com", true */ 'g', 'h', 'o', 's', 't', 'w', 'r', 'i', 't', 'e', 'r', 's', 'h', 'i', 'g', 'h', '.', 'c', 'o', 'm', '\0',
   /* "ghrelinblocker.info", true */ 'g', 'h', 'r', 'e', 'l', 'i', 'n', 'b', 'l', 'o', 'c', 'k', 'e', 'r', '.', 'i', 'n', 'f', 'o', '\0',
   /* "giacomodrago.com", true */ 'g', 'i', 'a', 'c', 'o', 'm', 'o', 'd', 'r', 'a', 'g', 'o', '.', 'c', 'o', 'm', '\0',
   /* "giacomodrago.it", true */ 'g', 'i', 'a', 'c', 'o', 'm', 'o', 'd', 'r', 'a', 'g', 'o', '.', 'i', 't', '\0',
   /* "giacomopelagatti.it", true */ 'g', 'i', 'a', 'c', 'o', 'm', 'o', 'p', 'e', 'l', 'a', 'g', 'a', 't', 't', 'i', '.', 'i', 't', '\0',
@@ -4814,18 +4823,16 @@ static const char kSTSHostTable[] = {
   /* "groth.xyz", true */ 'g', 'r', 'o', 't', 'h', '.', 'x', 'y', 'z', '\0',
   /* "groupebaillargeon.com", true */ 'g', 'r', 'o', 'u', 'p', 'e', 'b', 'a', 'i', 'l', 'l', 'a', 'r', 'g', 'e', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "groups.google.com", true */ 'g', 'r', 'o', 'u', 'p', 's', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "grozip.com", true */ 'g', 'r', 'o', 'z', 'i', 'p', '.', 'c', 'o', 'm', '\0',
   /* "grsecurity.net", true */ 'g', 'r', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'n', 'e', 't', '\0',
   /* "gruelang.org", true */ 'g', 'r', 'u', 'e', 'l', 'a', 'n', 'g', '.', 'o', 'r', 'g', '\0',
   /* "grunwasser.fr", true */ 'g', 'r', 'u', 'n', 'w', 'a', 's', 's', 'e', 'r', '.', 'f', 'r', '\0',
   /* "grusig-geil.ch", true */ 'g', 'r', 'u', 's', 'i', 'g', '-', 'g', 'e', 'i', 'l', '.', 'c', 'h', '\0',
-  /* "gryffin.ml", true */ 'g', 'r', 'y', 'f', 'f', 'i', 'n', '.', 'm', 'l', '\0',
-  /* "gryffin.tk", true */ 'g', 'r', 'y', 'f', 'f', 'i', 'n', '.', 't', 'k', '\0',
   /* "grytics.com", true */ 'g', 'r', 'y', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
   /* "gs-net.at", true */ 'g', 's', '-', 'n', 'e', 't', '.', 'a', 't', '\0',
   /* "gsimagebank.co.uk", true */ 'g', 's', 'i', 'm', 'a', 'g', 'e', 'b', 'a', 'n', 'k', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "gsnort.com", true */ 'g', 's', 'n', 'o', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "gsrc.io", true */ 'g', 's', 'r', 'c', '.', 'i', 'o', '\0',
   /* "gta-arabs.com", true */ 'g', 't', 'a', '-', 'a', 'r', 'a', 'b', 's', '.', 'c', 'o', 'm', '\0',
   /* "gtamodshop.org", true */ 'g', 't', 'a', 'm', 'o', 'd', 's', 'h', 'o', 'p', '.', 'o', 'r', 'g', '\0',
   /* "gtchipsi.org", true */ 'g', 't', 'c', 'h', 'i', 'p', 's', 'i', '.', 'o', 'r', 'g', '\0',
@@ -4859,17 +4866,19 @@ static const char kSTSHostTable[] = {
   /* "guphi.net", true */ 'g', 'u', 'p', 'h', 'i', '.', 'n', 'e', 't', '\0',
   /* "gurkan.in", true */ 'g', 'u', 'r', 'k', 'a', 'n', '.', 'i', 'n', '\0',
   /* "gurmel.ru", true */ 'g', 'u', 'r', 'm', 'e', 'l', '.', 'r', 'u', '\0',
   /* "gurochan.ch", true */ 'g', 'u', 'r', 'o', 'c', 'h', 'a', 'n', '.', 'c', 'h', '\0',
   /* "gurom.lv", true */ 'g', 'u', 'r', 'o', 'm', '.', 'l', 'v', '\0',
   /* "guru-naradi.cz", true */ 'g', 'u', 'r', 'u', '-', 'n', 'a', 'r', 'a', 'd', 'i', '.', 'c', 'z', '\0',
   /* "gurueffect.com", true */ 'g', 'u', 'r', 'u', 'e', 'f', 'f', 'e', 'c', 't', '.', 'c', 'o', 'm', '\0',
   /* "guscaplan.me", true */ 'g', 'u', 's', 'c', 'a', 'p', 'l', 'a', 'n', '.', 'm', 'e', '\0',
+  /* "gussi.is", true */ 'g', 'u', 's', 's', 'i', '.', 'i', 's', '\0',
   /* "guthabenkarten-billiger.de", true */ 'g', 'u', 't', 'h', 'a', 'b', 'e', 'n', 'k', 'a', 'r', 't', 'e', 'n', '-', 'b', 'i', 'l', 'l', 'i', 'g', 'e', 'r', '.', 'd', 'e', '\0',
+  /* "guts.me", true */ 'g', 'u', 't', 's', '.', 'm', 'e', '\0',
   /* "guvernalternativa.ro", true */ 'g', 'u', 'v', 'e', 'r', 'n', 'a', 'l', 't', 'e', 'r', 'n', 'a', 't', 'i', 'v', 'a', '.', 'r', 'o', '\0',
   /* "gv-neumann.de", true */ 'g', 'v', '-', 'n', 'e', 'u', 'm', 'a', 'n', 'n', '.', 'd', 'e', '\0',
   /* "gvatas.in", true */ 'g', 'v', 'a', 't', 'a', 's', '.', 'i', 'n', '\0',
   /* "gveh.de", true */ 'g', 'v', 'e', 'h', '.', 'd', 'e', '\0',
   /* "gvt2.com", true */ 'g', 'v', 't', '2', '.', 'c', 'o', 'm', '\0',
   /* "gvt3.com", true */ 'g', 'v', 't', '3', '.', 'c', 'o', 'm', '\0',
   /* "gw2reload.eu", true */ 'g', 'w', '2', 'r', 'e', 'l', 'o', 'a', 'd', '.', 'e', 'u', '\0',
   /* "gw2treasures.com", true */ 'g', 'w', '2', 't', 'r', 'e', 'a', 's', 'u', 'r', 'e', 's', '.', 'c', 'o', 'm', '\0',
@@ -4991,17 +5000,16 @@ static const char kSTSHostTable[] = {
   /* "hauntedfishtank.com", true */ 'h', 'a', 'u', 'n', 't', 'e', 'd', 'f', 'i', 's', 'h', 't', 'a', 'n', 'k', '.', 'c', 'o', 'm', '\0',
   /* "hausarzt-stader-str.de", true */ 'h', 'a', 'u', 's', 'a', 'r', 'z', 't', '-', 's', 't', 'a', 'd', 'e', 'r', '-', 's', 't', 'r', '.', 'd', 'e', '\0',
   /* "hausverbrauch.de", true */ 'h', 'a', 'u', 's', 'v', 'e', 'r', 'b', 'r', 'a', 'u', 'c', 'h', '.', 'd', 'e', '\0',
   /* "hautarztzentrum.ch", true */ 'h', 'a', 'u', 't', 'a', 'r', 'z', 't', 'z', 'e', 'n', 't', 'r', 'u', 'm', '.', 'c', 'h', '\0',
   /* "haveibeenpwned.com", true */ 'h', 'a', 'v', 'e', 'i', 'b', 'e', 'e', 'n', 'p', 'w', 'n', 'e', 'd', '.', 'c', 'o', 'm', '\0',
   /* "havellab.de", true */ 'h', 'a', 'v', 'e', 'l', 'l', 'a', 'b', '.', 'd', 'e', '\0',
   /* "havelland-obstler.de", true */ 'h', 'a', 'v', 'e', 'l', 'l', 'a', 'n', 'd', '-', 'o', 'b', 's', 't', 'l', 'e', 'r', '.', 'd', 'e', '\0',
   /* "hawkeyeinsight.com", true */ 'h', 'a', 'w', 'k', 'e', 'y', 'e', 'i', 'n', 's', 'i', 'g', 'h', 't', '.', 'c', 'o', 'm', '\0',
-  /* "hawksguild.com", true */ 'h', 'a', 'w', 'k', 's', 'g', 'u', 'i', 'l', 'd', '.', 'c', 'o', 'm', '\0',
   /* "hawthornharpist.com", true */ 'h', 'a', 'w', 't', 'h', 'o', 'r', 'n', 'h', 'a', 'r', 'p', 'i', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "haxo.nl", false */ 'h', 'a', 'x', 'o', '.', 'n', 'l', '\0',
   /* "haxoff.com", true */ 'h', 'a', 'x', 'o', 'f', 'f', '.', 'c', 'o', 'm', '\0',
   /* "hboeck.de", true */ 'h', 'b', 'o', 'e', 'c', 'k', '.', 'd', 'e', '\0',
   /* "hbpowell.com", true */ 'h', 'b', 'p', 'o', 'w', 'e', 'l', 'l', '.', 'c', 'o', 'm', '\0',
   /* "hcfhomelottery.ca", true */ 'h', 'c', 'f', 'h', 'o', 'm', 'e', 'l', 'o', 't', 't', 'e', 'r', 'y', '.', 'c', 'a', '\0',
   /* "hcs-company.com", true */ 'h', 'c', 's', '-', 'c', 'o', 'm', 'p', 'a', 'n', 'y', '.', 'c', 'o', 'm', '\0',
   /* "hcs-company.nl", true */ 'h', 'c', 's', '-', 'c', 'o', 'm', 'p', 'a', 'n', 'y', '.', 'n', 'l', '\0',
@@ -5188,17 +5196,16 @@ static const char kSTSHostTable[] = {
   /* "hongzhaxiaofendui.com", true */ 'h', 'o', 'n', 'g', 'z', 'h', 'a', 'x', 'i', 'a', 'o', 'f', 'e', 'n', 'd', 'u', 'i', '.', 'c', 'o', 'm', '\0',
   /* "honkhonk.net", true */ 'h', 'o', 'n', 'k', 'h', 'o', 'n', 'k', '.', 'n', 'e', 't', '\0',
   /* "honkion.net", true */ 'h', 'o', 'n', 'k', 'i', 'o', 'n', '.', 'n', 'e', 't', '\0',
   /* "hoodoo.io", true */ 'h', 'o', 'o', 'd', 'o', 'o', '.', 'i', 'o', '\0',
   /* "hoodoo.tech", true */ 'h', 'o', 'o', 'd', 'o', 'o', '.', 't', 'e', 'c', 'h', '\0',
   /* "hoodtrader.com", true */ 'h', 'o', 'o', 'd', 't', 'r', 'a', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "hooowl.com", true */ 'h', 'o', 'o', 'o', 'w', 'l', '.', 'c', 'o', 'm', '\0',
   /* "hoopsacademyusa.com", true */ 'h', 'o', 'o', 'p', 's', 'a', 'c', 'a', 'd', 'e', 'm', 'y', 'u', 's', 'a', '.', 'c', 'o', 'm', '\0',
-  /* "hooray.beer", true */ 'h', 'o', 'o', 'r', 'a', 'y', '.', 'b', 'e', 'e', 'r', '\0',
   /* "hoovism.com", true */ 'h', 'o', 'o', 'v', 'i', 's', 'm', '.', 'c', 'o', 'm', '\0',
   /* "hopesb.org", true */ 'h', 'o', 'p', 'e', 's', 'b', '.', 'o', 'r', 'g', '\0',
   /* "hopewellproperties.co.uk", true */ 'h', 'o', 'p', 'e', 'w', 'e', 'l', 'l', 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "hopps.me", true */ 'h', 'o', 'p', 'p', 's', '.', 'm', 'e', '\0',
   /* "hord.ca", true */ 'h', 'o', 'r', 'd', '.', 'c', 'a', '\0',
   /* "horning.co", true */ 'h', 'o', 'r', 'n', 'i', 'n', 'g', '.', 'c', 'o', '\0',
   /* "horstmanshof.eu", true */ 'h', 'o', 'r', 's', 't', 'm', 'a', 'n', 's', 'h', 'o', 'f', '.', 'e', 'u', '\0',
   /* "horvathd.eu", false */ 'h', 'o', 'r', 'v', 'a', 't', 'h', 'd', '.', 'e', 'u', '\0',
@@ -5541,20 +5548,16 @@ static const char kSTSHostTable[] = {
   /* "innovaptor.com", true */ 'i', 'n', 'n', 'o', 'v', 'a', 'p', 't', 'o', 'r', '.', 'c', 'o', 'm', '\0',
   /* "inovatec.com", true */ 'i', 'n', 'o', 'v', 'a', 't', 'e', 'c', '.', 'c', 'o', 'm', '\0',
   /* "ins1gn1a.com", true */ 'i', 'n', 's', '1', 'g', 'n', '1', 'a', '.', 'c', 'o', 'm', '\0',
   /* "insane-bullets.com", true */ 'i', 'n', 's', 'a', 'n', 'e', '-', 'b', 'u', 'l', 'l', 'e', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "insane.zone", true */ 'i', 'n', 's', 'a', 'n', 'e', '.', 'z', 'o', 'n', 'e', '\0',
   /* "insertcoins.net", true */ 'i', 'n', 's', 'e', 'r', 't', 'c', 'o', 'i', 'n', 's', '.', 'n', 'e', 't', '\0',
   /* "insideaudit.com", true */ 'i', 'n', 's', 'i', 'd', 'e', 'a', 'u', 'd', 'i', 't', '.', 'c', 'o', 'm', '\0',
   /* "insightera.co.th", true */ 'i', 'n', 's', 'i', 'g', 'h', 't', 'e', 'r', 'a', '.', 'c', 'o', '.', 't', 'h', '\0',
-  /* "insighti.com", true */ 'i', 'n', 's', 'i', 'g', 'h', 't', 'i', '.', 'c', 'o', 'm', '\0',
-  /* "insighti.eu", true */ 'i', 'n', 's', 'i', 'g', 'h', 't', 'i', '.', 'e', 'u', '\0',
-  /* "insighti.org", true */ 'i', 'n', 's', 'i', 'g', 'h', 't', 'i', '.', 'o', 'r', 'g', '\0',
-  /* "insighti.sk", true */ 'i', 'n', 's', 'i', 'g', 'h', 't', 'i', '.', 's', 'k', '\0',
   /* "insouciant.org", true */ 'i', 'n', 's', 'o', 'u', 'c', 'i', 'a', 'n', 't', '.', 'o', 'r', 'g', '\0',
   /* "inspire-av.com", true */ 'i', 'n', 's', 'p', 'i', 'r', 'e', '-', 'a', 'v', '.', 'c', 'o', 'm', '\0',
   /* "inspired-lua.org", true */ 'i', 'n', 's', 'p', 'i', 'r', 'e', 'd', '-', 'l', 'u', 'a', '.', 'o', 'r', 'g', '\0',
   /* "inspy.me", true */ 'i', 'n', 's', 'p', 'y', '.', 'm', 'e', '\0',
   /* "instagram-atom.appspot.com", true */ 'i', 'n', 's', 't', 'a', 'g', 'r', 'a', 'm', '-', 'a', 't', 'o', 'm', '.', 'a', 'p', 'p', 's', 'p', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "instagrammernews.com", true */ 'i', 'n', 's', 't', 'a', 'g', 'r', 'a', 'm', 'm', 'e', 'r', 'n', 'e', 'w', 's', '.', 'c', 'o', 'm', '\0',
   /* "instant-hack.com", true */ 'i', 'n', 's', 't', 'a', 'n', 't', '-', 'h', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0',
   /* "instant.io", true */ 'i', 'n', 's', 't', 'a', 'n', 't', '.', 'i', 'o', '\0',
@@ -5803,17 +5806,16 @@ static const char kSTSHostTable[] = {
   /* "jackyyf.com", false */ 'j', 'a', 'c', 'k', 'y', 'y', 'f', '.', 'c', 'o', 'm', '\0',
   /* "jacobhaug.com", true */ 'j', 'a', 'c', 'o', 'b', 'h', 'a', 'u', 'g', '.', 'c', 'o', 'm', '\0',
   /* "jacobian.org", true */ 'j', 'a', 'c', 'o', 'b', 'i', 'a', 'n', '.', 'o', 'r', 'g', '\0',
   /* "jacobphono.com", true */ 'j', 'a', 'c', 'o', 'b', 'p', 'h', 'o', 'n', 'o', '.', 'c', 'o', 'm', '\0',
   /* "jacuzziprozone.com", true */ 'j', 'a', 'c', 'u', 'z', 'z', 'i', 'p', 'r', 'o', 'z', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "jadopado.com", true */ 'j', 'a', 'd', 'o', 'p', 'a', 'd', 'o', '.', 'c', 'o', 'm', '\0',
   /* "jaegerlacke.de", true */ 'j', 'a', 'e', 'g', 'e', 'r', 'l', 'a', 'c', 'k', 'e', '.', 'd', 'e', '\0',
   /* "jagerman.com", true */ 'j', 'a', 'g', 'e', 'r', 'm', 'a', 'n', '.', 'c', 'o', 'm', '\0',
-  /* "jagido.de", true */ 'j', 'a', 'g', 'i', 'd', 'o', '.', 'd', 'e', '\0',
   /* "jahofmann.de", true */ 'j', 'a', 'h', 'o', 'f', 'm', 'a', 'n', 'n', '.', 'd', 'e', '\0',
   /* "jaimechanaga.com", true */ 'j', 'a', 'i', 'm', 'e', 'c', 'h', 'a', 'n', 'a', 'g', 'a', '.', 'c', 'o', 'm', '\0',
   /* "jaispirit.com", true */ 'j', 'a', 'i', 's', 'p', 'i', 'r', 'i', 't', '.', 'c', 'o', 'm', '\0',
   /* "jaitnetworking.com", false */ 'j', 'a', 'i', 't', 'n', 'e', 't', 'w', 'o', 'r', 'k', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "jakecurtis.de", true */ 'j', 'a', 'k', 'e', 'c', 'u', 'r', 't', 'i', 's', '.', 'd', 'e', '\0',
   /* "jakereynolds.co", true */ 'j', 'a', 'k', 'e', 'r', 'e', 'y', 'n', 'o', 'l', 'd', 's', '.', 'c', 'o', '\0',
   /* "jaketremper.com", true */ 'j', 'a', 'k', 'e', 't', 'r', 'e', 'm', 'p', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "jakobejitblokaci.cz", true */ 'j', 'a', 'k', 'o', 'b', 'e', 'j', 'i', 't', 'b', 'l', 'o', 'k', 'a', 'c', 'i', '.', 'c', 'z', '\0',
@@ -5850,17 +5852,16 @@ static const char kSTSHostTable[] = {
   /* "janosh.com", true */ 'j', 'a', 'n', 'o', 's', 'h', '.', 'c', 'o', 'm', '\0',
   /* "janverlaan.nl", true */ 'j', 'a', 'n', 'v', 'e', 'r', 'l', 'a', 'a', 'n', '.', 'n', 'l', '\0',
   /* "jaot.info", true */ 'j', 'a', 'o', 't', '.', 'i', 'n', 'f', 'o', '\0',
   /* "japan-foods.co.uk", true */ 'j', 'a', 'p', 'a', 'n', '-', 'f', 'o', 'o', 'd', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "japan4you.org", true */ 'j', 'a', 'p', 'a', 'n', '4', 'y', 'o', 'u', '.', 'o', 'r', 'g', '\0',
   /* "japaniac.de", true */ 'j', 'a', 'p', 'a', 'n', 'i', 'a', 'c', '.', 'd', 'e', '\0',
   /* "jardins-utopie.net", true */ 'j', 'a', 'r', 'd', 'i', 'n', 's', '-', 'u', 't', 'o', 'p', 'i', 'e', '.', 'n', 'e', 't', '\0',
   /* "jaredbates.net", false */ 'j', 'a', 'r', 'e', 'd', 'b', 'a', 't', 'e', 's', '.', 'n', 'e', 't', '\0',
-  /* "jaredfernandez.com", true */ 'j', 'a', 'r', 'e', 'd', 'f', 'e', 'r', 'n', 'a', 'n', 'd', 'e', 'z', '.', 'c', 'o', 'm', '\0',
   /* "jarsater.com", true */ 'j', 'a', 'r', 's', 'a', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "jasonamorrow.com", true */ 'j', 'a', 's', 'o', 'n', 'a', 'm', 'o', 'r', 'r', 'o', 'w', '.', 'c', 'o', 'm', '\0',
   /* "jasonsansone.com", true */ 'j', 'a', 's', 'o', 'n', 's', 'a', 'n', 's', 'o', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "jasperespejo.com", true */ 'j', 'a', 's', 'p', 'e', 'r', 'e', 's', 'p', 'e', 'j', 'o', '.', 'c', 'o', 'm', '\0',
   /* "jasperhammink.com", true */ 'j', 'a', 's', 'p', 'e', 'r', 'h', 'a', 'm', 'm', 'i', 'n', 'k', '.', 'c', 'o', 'm', '\0',
   /* "jasperhuttenmedia.com", true */ 'j', 'a', 's', 'p', 'e', 'r', 'h', 'u', 't', 't', 'e', 'n', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'o', 'm', '\0',
   /* "jav-collective.com", true */ 'j', 'a', 'v', '-', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0',
   /* "javalestari.com", true */ 'j', 'a', 'v', 'a', 'l', 'e', 's', 't', 'a', 'r', 'i', '.', 'c', 'o', 'm', '\0',
@@ -6102,17 +6103,16 @@ static const char kSTSHostTable[] = {
   /* "k2mts.org", true */ 'k', '2', 'm', 't', 's', '.', 'o', 'r', 'g', '\0',
   /* "ka-clan.com", true */ 'k', 'a', '-', 'c', 'l', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "kaangenc.me", true */ 'k', 'a', 'a', 'n', 'g', 'e', 'n', 'c', '.', 'm', 'e', '\0',
   /* "kaasbijwijn.nl", true */ 'k', 'a', 'a', 's', 'b', 'i', 'j', 'w', 'i', 'j', 'n', '.', 'n', 'l', '\0',
   /* "kab-s.de", true */ 'k', 'a', 'b', '-', 's', '.', 'd', 'e', '\0',
   /* "kabat-fans.cz", true */ 'k', 'a', 'b', 'a', 't', '-', 'f', 'a', 'n', 's', '.', 'c', 'z', '\0',
   /* "kabeuchi.com", true */ 'k', 'a', 'b', 'e', 'u', 'c', 'h', 'i', '.', 'c', 'o', 'm', '\0',
   /* "kabuabc.com", true */ 'k', 'a', 'b', 'u', 'a', 'b', 'c', '.', 'c', 'o', 'm', '\0',
-  /* "kabus.org", true */ 'k', 'a', 'b', 'u', 's', '.', 'o', 'r', 'g', '\0',
   /* "kachlikova2.cz", true */ 'k', 'a', 'c', 'h', 'l', 'i', 'k', 'o', 'v', 'a', '2', '.', 'c', 'z', '\0',
   /* "kackscharf.de", true */ 'k', 'a', 'c', 'k', 's', 'c', 'h', 'a', 'r', 'f', '.', 'd', 'e', '\0',
   /* "kadmec.com", true */ 'k', 'a', 'd', 'm', 'e', 'c', '.', 'c', 'o', 'm', '\0',
   /* "kaela.design", true */ 'k', 'a', 'e', 'l', 'a', '.', 'd', 'e', 's', 'i', 'g', 'n', '\0',
   /* "kaheim.de", false */ 'k', 'a', 'h', 'e', 'i', 'm', '.', 'd', 'e', '\0',
   /* "kaileymslusser.com", true */ 'k', 'a', 'i', 'l', 'e', 'y', 'm', 's', 'l', 'u', 's', 's', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "kainz.bayern", true */ 'k', 'a', 'i', 'n', 'z', '.', 'b', 'a', 'y', 'e', 'r', 'n', '\0',
   /* "kainz.be", true */ 'k', 'a', 'i', 'n', 'z', '.', 'b', 'e', '\0',
@@ -6536,16 +6536,17 @@ static const char kSTSHostTable[] = {
   /* "kutukupret.com", true */ 'k', 'u', 't', 'u', 'k', 'u', 'p', 'r', 'e', 't', '.', 'c', 'o', 'm', '\0',
   /* "kuwago.io", true */ 'k', 'u', 'w', 'a', 'g', 'o', '.', 'i', 'o', '\0',
   /* "kvalita-1a.cz", true */ 'k', 'v', 'a', 'l', 'i', 't', 'a', '-', '1', 'a', '.', 'c', 'z', '\0',
   /* "kwbresidential.com", true */ 'k', 'w', 'b', 'r', 'e', 's', 'i', 'd', 'e', 'n', 't', 'i', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "kwidz.fr", true */ 'k', 'w', 'i', 'd', 'z', '.', 'f', 'r', '\0',
   /* "kwikmed.eu", false */ 'k', 'w', 'i', 'k', 'm', 'e', 'd', '.', 'e', 'u', '\0',
   /* "kwmr.me", true */ 'k', 'w', 'm', 'r', '.', 'm', 'e', '\0',
   /* "kwok.cc", true */ 'k', 'w', 'o', 'k', '.', 'c', 'c', '\0',
+  /* "kwok.tv", true */ 'k', 'w', 'o', 'k', '.', 't', 'v', '\0',
   /* "kybi.sk", true */ 'k', 'y', 'b', 'i', '.', 's', 'k', '\0',
   /* "kykoonn.net", true */ 'k', 'y', 'k', 'o', 'o', 'n', 'n', '.', 'n', 'e', 't', '\0',
   /* "kylapps.com", true */ 'k', 'y', 'l', 'a', 'p', 'p', 's', '.', 'c', 'o', 'm', '\0',
   /* "kylelaker.com", true */ 'k', 'y', 'l', 'e', 'l', 'a', 'k', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "kyliehunt.com", true */ 'k', 'y', 'l', 'i', 'e', 'h', 'u', 'n', 't', '.', 'c', 'o', 'm', '\0',
   /* "kylling.io", true */ 'k', 'y', 'l', 'l', 'i', 'n', 'g', '.', 'i', 'o', '\0',
   /* "kynaston.org.uk", true */ 'k', 'y', 'n', 'a', 's', 't', 'o', 'n', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "kynastonwedding.co.uk", true */ 'k', 'y', 'n', 'a', 's', 't', 'o', 'n', 'w', 'e', 'd', 'd', 'i', 'n', 'g', '.', 'c', 'o', '.', 'u', 'k', '\0',
@@ -6672,17 +6673,16 @@ static const char kSTSHostTable[] = {
   /* "leadbook.ru", true */ 'l', 'e', 'a', 'd', 'b', 'o', 'o', 'k', '.', 'r', 'u', '\0',
   /* "leadingsalons.com", true */ 'l', 'e', 'a', 'd', 'i', 'n', 'g', 's', 'a', 'l', 'o', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "leakedminecraft.net", true */ 'l', 'e', 'a', 'k', 'e', 'd', 'm', 'i', 'n', 'e', 'c', 'r', 'a', 'f', 't', '.', 'n', 'e', 't', '\0',
   /* "leakforums.net", true */ 'l', 'e', 'a', 'k', 'f', 'o', 'r', 'u', 'm', 's', '.', 'n', 'e', 't', '\0',
   /* "leanclub.org", true */ 'l', 'e', 'a', 'n', 'c', 'l', 'u', 'b', '.', 'o', 'r', 'g', '\0',
   /* "leandre.cn", true */ 'l', 'e', 'a', 'n', 'd', 'r', 'e', '.', 'c', 'n', '\0',
   /* "leanplando.com", true */ 'l', 'e', 'a', 'n', 'p', 'l', 'a', 'n', 'd', 'o', '.', 'c', 'o', 'm', '\0',
   /* "leardev.de", false */ 'l', 'e', 'a', 'r', 'd', 'e', 'v', '.', 'd', 'e', '\0',
-  /* "learnedovo.com", true */ 'l', 'e', 'a', 'r', 'n', 'e', 'd', 'o', 'v', 'o', '.', 'c', 'o', 'm', '\0',
   /* "learnflakes.net", true */ 'l', 'e', 'a', 'r', 'n', 'f', 'l', 'a', 'k', 'e', 's', '.', 'n', 'e', 't', '\0',
   /* "learntube.cz", true */ 'l', 'e', 'a', 'r', 'n', 't', 'u', 'b', 'e', '.', 'c', 'z', '\0',
   /* "leatherfurnitureexpo.com", true */ 'l', 'e', 'a', 't', 'h', 'e', 'r', 'f', 'u', 'r', 'n', 'i', 't', 'u', 'r', 'e', 'e', 'x', 'p', 'o', '.', 'c', 'o', 'm', '\0',
   /* "leaversmith.com", true */ 'l', 'e', 'a', 'v', 'e', 'r', 's', 'm', 'i', 't', 'h', '.', 'c', 'o', 'm', '\0',
   /* "lebanesearmy.gov.lb", true */ 'l', 'e', 'b', 'a', 'n', 'e', 's', 'e', 'a', 'r', 'm', 'y', '.', 'g', 'o', 'v', '.', 'l', 'b', '\0',
   /* "lebarmy.gov.lb", true */ 'l', 'e', 'b', 'a', 'r', 'm', 'y', '.', 'g', 'o', 'v', '.', 'l', 'b', '\0',
   /* "leblanc.io", true */ 'l', 'e', 'b', 'l', 'a', 'n', 'c', '.', 'i', 'o', '\0',
   /* "lechiennoir.net", true */ 'l', 'e', 'c', 'h', 'i', 'e', 'n', 'n', 'o', 'i', 'r', '.', 'n', 'e', 't', '\0',
@@ -6823,16 +6823,17 @@ static const char kSTSHostTable[] = {
   /* "linuxcommand.ru", true */ 'l', 'i', 'n', 'u', 'x', 'c', 'o', 'm', 'm', 'a', 'n', 'd', '.', 'r', 'u', '\0',
   /* "linuxhostsupport.com", true */ 'l', 'i', 'n', 'u', 'x', 'h', 'o', 's', 't', 's', 'u', 'p', 'p', 'o', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "linuxlounge.net", true */ 'l', 'i', 'n', 'u', 'x', 'l', 'o', 'u', 'n', 'g', 'e', '.', 'n', 'e', 't', '\0',
   /* "linuxmonitoring.net", true */ 'l', 'i', 'n', 'u', 'x', 'm', 'o', 'n', 'i', 't', 'o', 'r', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "linuxwebservertips.in", true */ 'l', 'i', 'n', 'u', 'x', 'w', 'e', 'b', 's', 'e', 'r', 'v', 'e', 'r', 't', 'i', 'p', 's', '.', 'i', 'n', '\0',
   /* "linvx.org", true */ 'l', 'i', 'n', 'v', 'x', '.', 'o', 'r', 'g', '\0',
   /* "linx.li", true */ 'l', 'i', 'n', 'x', '.', 'l', 'i', '\0',
   /* "linx.net", true */ 'l', 'i', 'n', 'x', '.', 'n', 'e', 't', '\0',
+  /* "linzgau.de", true */ 'l', 'i', 'n', 'z', 'g', 'a', 'u', '.', 'd', 'e', '\0',
   /* "liornavok.com", true */ 'l', 'i', 'o', 'r', 'n', 'a', 'v', 'o', 'k', '.', 'c', 'o', 'm', '\0',
   /* "liquid.cz", true */ 'l', 'i', 'q', 'u', 'i', 'd', '.', 'c', 'z', '\0',
   /* "liquidcomm.net", true */ 'l', 'i', 'q', 'u', 'i', 'd', 'c', 'o', 'm', 'm', '.', 'n', 'e', 't', '\0',
   /* "lirion.de", true */ 'l', 'i', 'r', 'i', 'o', 'n', '.', 'd', 'e', '\0',
   /* "liris-beautywelt.de", true */ 'l', 'i', 'r', 'i', 's', '-', 'b', 'e', 'a', 'u', 't', 'y', 'w', 'e', 'l', 't', '.', 'd', 'e', '\0',
   /* "lisaco.de", true */ 'l', 'i', 's', 'a', 'c', 'o', '.', 'd', 'e', '\0',
   /* "lislan.org.uk", true */ 'l', 'i', 's', 'l', 'a', 'n', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "lisonfan.com", true */ 'l', 'i', 's', 'o', 'n', 'f', 'a', 'n', '.', 'c', 'o', 'm', '\0',
@@ -6840,17 +6841,17 @@ static const char kSTSHostTable[] = {
   /* "lister-kirchweg.de", true */ 'l', 'i', 's', 't', 'e', 'r', '-', 'k', 'i', 'r', 'c', 'h', 'w', 'e', 'g', '.', 'd', 'e', '\0',
   /* "listminut.be", true */ 'l', 'i', 's', 't', 'm', 'i', 'n', 'u', 't', '.', 'b', 'e', '\0',
   /* "lists.fedoraproject.org", true */ 'l', 'i', 's', 't', 's', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "lists.mayfirst.org", false */ 'l', 'i', 's', 't', 's', '.', 'm', 'a', 'y', 'f', 'i', 'r', 's', 't', '.', 'o', 'r', 'g', '\0',
   /* "lists.stg.fedoraproject.org", true */ 'l', 'i', 's', 't', 's', '.', 's', 't', 'g', '.', 'f', 'e', 'd', 'o', 'r', 'a', 'p', 'r', 'o', 'j', 'e', 'c', 't', '.', 'o', 'r', 'g', '\0',
   /* "litchidova.nl", true */ 'l', 'i', 't', 'c', 'h', 'i', 'd', 'o', 'v', 'a', '.', 'n', 'l', '\0',
   /* "litevault.net", true */ 'l', 'i', 't', 'e', 'v', 'a', 'u', 'l', 't', '.', 'n', 'e', 't', '\0',
   /* "litfin.name", true */ 'l', 'i', 't', 'f', 'i', 'n', '.', 'n', 'a', 'm', 'e', '\0',
-  /* "lithesalar.se", false */ 'l', 'i', 't', 'h', 'e', 's', 'a', 'l', 'a', 'r', '.', 's', 'e', '\0',
+  /* "lithesalar.se", true */ 'l', 'i', 't', 'h', 'e', 's', 'a', 'l', 'a', 'r', '.', 's', 'e', '\0',
   /* "little.pw", true */ 'l', 'i', 't', 't', 'l', 'e', '.', 'p', 'w', '\0',
   /* "littlefreelibrary.org", true */ 'l', 'i', 't', 't', 'l', 'e', 'f', 'r', 'e', 'e', 'l', 'i', 'b', 'r', 'a', 'r', 'y', '.', 'o', 'r', 'g', '\0',
   /* "litvideoserver.de", true */ 'l', 'i', 't', 'v', 'i', 'd', 'e', 'o', 's', 'e', 'r', 'v', 'e', 'r', '.', 'd', 'e', '\0',
   /* "liud.im", true */ 'l', 'i', 'u', 'd', '.', 'i', 'm', '\0',
   /* "liudon.org", true */ 'l', 'i', 'u', 'd', 'o', 'n', '.', 'o', 'r', 'g', '\0',
   /* "livedesign.at", true */ 'l', 'i', 'v', 'e', 'd', 'e', 's', 'i', 'g', 'n', '.', 'a', 't', '\0',
   /* "liveforspeed.se", true */ 'l', 'i', 'v', 'e', 'f', 'o', 'r', 's', 'p', 'e', 'e', 'd', '.', 's', 'e', '\0',
   /* "liveregistratie.nl", true */ 'l', 'i', 'v', 'e', 'r', 'e', 'g', 'i', 's', 't', 'r', 'a', 't', 'i', 'e', '.', 'n', 'l', '\0',
@@ -6930,16 +6931,17 @@ static const char kSTSHostTable[] = {
   /* "lolkot.ru", true */ 'l', 'o', 'l', 'k', 'o', 't', '.', 'r', 'u', '\0',
   /* "lolpatrol.de", true */ 'l', 'o', 'l', 'p', 'a', 't', 'r', 'o', 'l', '.', 'd', 'e', '\0',
   /* "lonal.com", true */ 'l', 'o', 'n', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "lonasdigital.com", true */ 'l', 'o', 'n', 'a', 's', 'd', 'i', 'g', 'i', 't', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "london-transfers.com", true */ 'l', 'o', 'n', 'd', 'o', 'n', '-', 't', 'r', 'a', 'n', 's', 'f', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "london.dating", true */ 'l', 'o', 'n', 'd', 'o', 'n', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0',
   /* "londonlanguageexchange.com", true */ 'l', 'o', 'n', 'd', 'o', 'n', 'l', 'a', 'n', 'g', 'u', 'a', 'g', 'e', 'e', 'x', 'c', 'h', 'a', 'n', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "lone-gunman.be", true */ 'l', 'o', 'n', 'e', '-', 'g', 'u', 'n', 'm', 'a', 'n', '.', 'b', 'e', '\0',
+  /* "longboarding-ulm.de", true */ 'l', 'o', 'n', 'g', 'b', 'o', 'a', 'r', 'd', 'i', 'n', 'g', '-', 'u', 'l', 'm', '.', 'd', 'e', '\0',
   /* "longhorn.id.au", true */ 'l', 'o', 'n', 'g', 'h', 'o', 'r', 'n', '.', 'i', 'd', '.', 'a', 'u', '\0',
   /* "look.co.il", true */ 'l', 'o', 'o', 'k', '.', 'c', 'o', '.', 'i', 'l', '\0',
   /* "lookasik.eu", true */ 'l', 'o', 'o', 'k', 'a', 's', 'i', 'k', '.', 'e', 'u', '\0',
   /* "lookyman.net", true */ 'l', 'o', 'o', 'k', 'y', 'm', 'a', 'n', '.', 'n', 'e', 't', '\0',
   /* "loony.info", true */ 'l', 'o', 'o', 'n', 'y', '.', 'i', 'n', 'f', 'o', '\0',
   /* "loopower.com", true */ 'l', 'o', 'o', 'p', 'o', 'w', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "loopstart.org", true */ 'l', 'o', 'o', 'p', 's', 't', 'a', 'r', 't', '.', 'o', 'r', 'g', '\0',
   /* "loothole.com", true */ 'l', 'o', 'o', 't', 'h', 'o', 'l', 'e', '.', 'c', 'o', 'm', '\0',
@@ -7082,17 +7084,16 @@ static const char kSTSHostTable[] = {
   /* "madeglobal.com", true */ 'm', 'a', 'd', 'e', 'g', 'l', 'o', 'b', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "madeitwor.se", true */ 'm', 'a', 'd', 'e', 'i', 't', 'w', 'o', 'r', '.', 's', 'e', '\0',
   /* "madin.ru", true */ 'm', 'a', 'd', 'i', 'n', '.', 'r', 'u', '\0',
   /* "madnetwork.org", true */ 'm', 'a', 'd', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'o', 'r', 'g', '\0',
   /* "madokami.net", true */ 'm', 'a', 'd', 'o', 'k', 'a', 'm', 'i', '.', 'n', 'e', 't', '\0',
   /* "madrants.net", true */ 'm', 'a', 'd', 'r', 'a', 'n', 't', 's', '.', 'n', 'e', 't', '\0',
   /* "madreacqua.org", true */ 'm', 'a', 'd', 'r', 'e', 'a', 'c', 'q', 'u', 'a', '.', 'o', 'r', 'g', '\0',
   /* "madtec.de", true */ 'm', 'a', 'd', 't', 'e', 'c', '.', 'd', 'e', '\0',
-  /* "madusecurity.com", true */ 'm', 'a', 'd', 'u', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "maelstrom.ninja", true */ 'm', 'a', 'e', 'l', 's', 't', 'r', 'o', 'm', '.', 'n', 'i', 'n', 'j', 'a', '\0',
   /* "mafiaforum.de", true */ 'm', 'a', 'f', 'i', 'a', 'f', 'o', 'r', 'u', 'm', '.', 'd', 'e', '\0',
   /* "mafiasi.de", true */ 'm', 'a', 'f', 'i', 'a', 's', 'i', '.', 'd', 'e', '\0',
   /* "magdic.eu", true */ 'm', 'a', 'g', 'd', 'i', 'c', '.', 'e', 'u', '\0',
   /* "magenbrot.net", true */ 'm', 'a', 'g', 'e', 'n', 'b', 'r', 'o', 't', '.', 'n', 'e', 't', '\0',
   /* "magenda.sk", true */ 'm', 'a', 'g', 'e', 'n', 'd', 'a', '.', 's', 'k', '\0',
   /* "magia360.com", true */ 'm', 'a', 'g', 'i', 'a', '3', '6', '0', '.', 'c', 'o', 'm', '\0',
   /* "magicball.co", true */ 'm', 'a', 'g', 'i', 'c', 'b', 'a', 'l', 'l', '.', 'c', 'o', '\0',
@@ -7112,17 +7113,16 @@ static const char kSTSHostTable[] = {
   /* "mailer-dot.de", true */ 'm', 'a', 'i', 'l', 'e', 'r', '-', 'd', 'o', 't', '.', 'd', 'e', '\0',
   /* "mailfence.com", true */ 'm', 'a', 'i', 'l', 'f', 'e', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "mailgarant.nl", true */ 'm', 'a', 'i', 'l', 'g', 'a', 'r', 'a', 'n', 't', '.', 'n', 'l', '\0',
   /* "mailhost.it", true */ 'm', 'a', 'i', 'l', 'h', 'o', 's', 't', '.', 'i', 't', '\0',
   /* "mailinabox.email", true */ 'm', 'a', 'i', 'l', 'i', 'n', 'a', 'b', 'o', 'x', '.', 'e', 'm', 'a', 'i', 'l', '\0',
   /* "mailing-jbgg.com", true */ 'm', 'a', 'i', 'l', 'i', 'n', 'g', '-', 'j', 'b', 'g', 'g', '.', 'c', 'o', 'm', '\0',
   /* "mailmag.net", true */ 'm', 'a', 'i', 'l', 'm', 'a', 'g', '.', 'n', 'e', 't', '\0',
   /* "mailpenny.com", true */ 'm', 'a', 'i', 'l', 'p', 'e', 'n', 'n', 'y', '.', 'c', 'o', 'm', '\0',
-  /* "mainframeserver.space", true */ 'm', 'a', 'i', 'n', 'f', 'r', 'a', 'm', 'e', 's', 'e', 'r', 'v', 'e', 'r', '.', 's', 'p', 'a', 'c', 'e', '\0',
   /* "mainlined.org", true */ 'm', 'a', 'i', 'n', 'l', 'i', 'n', 'e', 'd', '.', 'o', 'r', 'g', '\0',
   /* "mainlywrenches.co", true */ 'm', 'a', 'i', 'n', 'l', 'y', 'w', 'r', 'e', 'n', 'c', 'h', 'e', 's', '.', 'c', 'o', '\0',
   /* "mainzelmaennchen.net", true */ 'm', 'a', 'i', 'n', 'z', 'e', 'l', 'm', 'a', 'e', 'n', 'n', 'c', 'h', 'e', 'n', '.', 'n', 'e', 't', '\0',
   /* "maisgasolina.com", true */ 'm', 'a', 'i', 's', 'g', 'a', 's', 'o', 'l', 'i', 'n', 'a', '.', 'c', 'o', 'm', '\0',
   /* "majaweb.cz", true */ 'm', 'a', 'j', 'a', 'w', 'e', 'b', '.', 'c', 'z', '\0',
   /* "majesnix.org", true */ 'm', 'a', 'j', 'e', 's', 'n', 'i', 'x', '.', 'o', 'r', 'g', '\0',
   /* "make-pizza.info", true */ 'm', 'a', 'k', 'e', '-', 'p', 'i', 'z', 'z', 'a', '.', 'i', 'n', 'f', 'o', '\0',
   /* "makedin.net", true */ 'm', 'a', 'k', 'e', 'd', 'i', 'n', '.', 'n', 'e', 't', '\0',
@@ -7228,16 +7228,17 @@ static const char kSTSHostTable[] = {
   /* "markusehrlicher.de", true */ 'm', 'a', 'r', 'k', 'u', 's', 'e', 'h', 'r', 'l', 'i', 'c', 'h', 'e', 'r', '.', 'd', 'e', '\0',
   /* "markusueberallassetmanagement.de", true */ 'm', 'a', 'r', 'k', 'u', 's', 'u', 'e', 'b', 'e', 'r', 'a', 'l', 'l', 'a', 's', 's', 'e', 't', 'm', 'a', 'n', 'a', 'g', 'e', 'm', 'e', 'n', 't', '.', 'd', 'e', '\0',
   /* "marlen.cz", true */ 'm', 'a', 'r', 'l', 'e', 'n', '.', 'c', 'z', '\0',
   /* "marquiseclub.se", true */ 'm', 'a', 'r', 'q', 'u', 'i', 's', 'e', 'c', 'l', 'u', 'b', '.', 's', 'e', '\0',
   /* "marriottvetcareers.com", true */ 'm', 'a', 'r', 'r', 'i', 'o', 't', 't', 'v', 'e', 't', 'c', 'a', 'r', 'e', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "martelange.ovh", true */ 'm', 'a', 'r', 't', 'e', 'l', 'a', 'n', 'g', 'e', '.', 'o', 'v', 'h', '\0',
   /* "martensmxservice.nl", true */ 'm', 'a', 'r', 't', 'e', 'n', 's', 'm', 'x', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'n', 'l', '\0',
   /* "martialc.be", true */ 'm', 'a', 'r', 't', 'i', 'a', 'l', 'c', '.', 'b', 'e', '\0',
+  /* "martiert.com", true */ 'm', 'a', 'r', 't', 'i', 'e', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "martin-smith.info", true */ 'm', 'a', 'r', 't', 'i', 'n', '-', 's', 'm', 'i', 't', 'h', '.', 'i', 'n', 'f', 'o', '\0',
   /* "martineve.com", true */ 'm', 'a', 'r', 't', 'i', 'n', 'e', 'v', 'e', '.', 'c', 'o', 'm', '\0',
   /* "martinkup.cz", true */ 'm', 'a', 'r', 't', 'i', 'n', 'k', 'u', 'p', '.', 'c', 'z', '\0',
   /* "martinkus.eu", true */ 'm', 'a', 'r', 't', 'i', 'n', 'k', 'u', 's', '.', 'e', 'u', '\0',
   /* "martinmuc.de", true */ 'm', 'a', 'r', 't', 'i', 'n', 'm', 'u', 'c', '.', 'd', 'e', '\0',
   /* "martinp.no", true */ 'm', 'a', 'r', 't', 'i', 'n', 'p', '.', 'n', 'o', '\0',
   /* "martinreed.net", true */ 'm', 'a', 'r', 't', 'i', 'n', 'r', 'e', 'e', 'd', '.', 'n', 'e', 't', '\0',
   /* "marumagic.com", true */ 'm', 'a', 'r', 'u', 'm', 'a', 'g', 'i', 'c', '.', 'c', 'o', 'm', '\0',
@@ -7370,16 +7371,17 @@ static const char kSTSHostTable[] = {
   /* "mediamarkt.pl", true */ 'm', 'e', 'd', 'i', 'a', 'm', 'a', 'r', 'k', 't', '.', 'p', 'l', '\0',
   /* "mediaselection.eu", true */ 'm', 'e', 'd', 'i', 'a', 's', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '.', 'e', 'u', '\0',
   /* "mediawiki.org", true */ 'm', 'e', 'd', 'i', 'a', 'w', 'i', 'k', 'i', '.', 'o', 'r', 'g', '\0',
   /* "medic-world.com", true */ 'm', 'e', 'd', 'i', 'c', '-', 'w', 'o', 'r', 'l', 'd', '.', 'c', 'o', 'm', '\0',
   /* "medicinesfast.com", false */ 'm', 'e', 'd', 'i', 'c', 'i', 'n', 'e', 's', 'f', 'a', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "medicinia.com.br", true */ 'm', 'e', 'd', 'i', 'c', 'i', 'n', 'i', 'a', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "medicoresponde.com.br", true */ 'm', 'e', 'd', 'i', 'c', 'o', 'r', 'e', 's', 'p', 'o', 'n', 'd', 'e', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "medifi.com", true */ 'm', 'e', 'd', 'i', 'f', 'i', '.', 'c', 'o', 'm', '\0',
+  /* "medirich.co", true */ 'm', 'e', 'd', 'i', 'r', 'i', 'c', 'h', '.', 'c', 'o', '\0',
   /* "meditek-dv.ru", true */ 'm', 'e', 'd', 'i', 't', 'e', 'k', '-', 'd', 'v', '.', 'r', 'u', '\0',
   /* "medium.com", true */ 'm', 'e', 'd', 'i', 'u', 'm', '.', 'c', 'o', 'm', '\0',
   /* "medm-test.com", true */ 'm', 'e', 'd', 'm', '-', 't', 'e', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "medo64.com", true */ 'm', 'e', 'd', 'o', '6', '4', '.', 'c', 'o', 'm', '\0',
   /* "medovea.ru", true */ 'm', 'e', 'd', 'o', 'v', 'e', 'a', '.', 'r', 'u', '\0',
   /* "medtehnika.ua", true */ 'm', 'e', 'd', 't', 'e', 'h', 'n', 'i', 'k', 'a', '.', 'u', 'a', '\0',
   /* "medusa.wtf", true */ 'm', 'e', 'd', 'u', 's', 'a', '.', 'w', 't', 'f', '\0',
   /* "meedoenhartvanwestbrabant.nl", true */ 'm', 'e', 'e', 'd', 'o', 'e', 'n', 'h', 'a', 'r', 't', 'v', 'a', 'n', 'w', 'e', 's', 't', 'b', 'r', 'a', 'b', 'a', 'n', 't', '.', 'n', 'l', '\0',
@@ -7459,17 +7461,16 @@ static const char kSTSHostTable[] = {
   /* "meteobox.es", true */ 'm', 'e', 't', 'e', 'o', 'b', 'o', 'x', '.', 'e', 's', '\0',
   /* "meteobox.fr", true */ 'm', 'e', 't', 'e', 'o', 'b', 'o', 'x', '.', 'f', 'r', '\0',
   /* "meteobox.mx", true */ 'm', 'e', 't', 'e', 'o', 'b', 'o', 'x', '.', 'm', 'x', '\0',
   /* "meteobox.pl", true */ 'm', 'e', 't', 'e', 'o', 'b', 'o', 'x', '.', 'p', 'l', '\0',
   /* "meteobox.sk", true */ 'm', 'e', 't', 'e', 'o', 'b', 'o', 'x', '.', 's', 'k', '\0',
   /* "meteorapp.space", true */ 'm', 'e', 't', 'e', 'o', 'r', 'a', 'p', 'p', '.', 's', 'p', 'a', 'c', 'e', '\0',
   /* "meter.md", true */ 'm', 'e', 't', 'e', 'r', '.', 'm', 'd', '\0',
   /* "metricaid.com", true */ 'm', 'e', 't', 'r', 'i', 'c', 'a', 'i', 'd', '.', 'c', 'o', 'm', '\0',
-  /* "metronaut.de", true */ 'm', 'e', 't', 'r', 'o', 'n', 'a', 'u', 't', '.', 'd', 'e', '\0',
   /* "metzgerei-birkenhof.de", true */ 'm', 'e', 't', 'z', 'g', 'e', 'r', 'e', 'i', '-', 'b', 'i', 'r', 'k', 'e', 'n', 'h', 'o', 'f', '.', 'd', 'e', '\0',
   /* "meusigno.com", true */ 'm', 'e', 'u', 's', 'i', 'g', 'n', 'o', '.', 'c', 'o', 'm', '\0',
   /* "mevs.cz", true */ 'm', 'e', 'v', 's', '.', 'c', 'z', '\0',
   /* "mexicansbook.ru", false */ 'm', 'e', 'x', 'i', 'c', 'a', 'n', 's', 'b', 'o', 'o', 'k', '.', 'r', 'u', '\0',
   /* "meyeraviation.com", true */ 'm', 'e', 'y', 'e', 'r', 'a', 'v', 'i', 'a', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "mfcatalin.com", true */ 'm', 'f', 'c', 'a', 't', 'a', 'l', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "mfiles.pl", true */ 'm', 'f', 'i', 'l', 'e', 's', '.', 'p', 'l', '\0',
   /* "mfxbe.de", true */ 'm', 'f', 'x', 'b', 'e', '.', 'd', 'e', '\0',
@@ -7520,16 +7521,17 @@ static const char kSTSHostTable[] = {
   /* "mijnreisoverzicht.nl", true */ 'm', 'i', 'j', 'n', 'r', 'e', 'i', 's', 'o', 'v', 'e', 'r', 'z', 'i', 'c', 'h', 't', '.', 'n', 'l', '\0',
   /* "mijnstembureau.nl", true */ 'm', 'i', 'j', 'n', 's', 't', 'e', 'm', 'b', 'u', 'r', 'e', 'a', 'u', '.', 'n', 'l', '\0',
   /* "mijntransacties.nl", true */ 'm', 'i', 'j', 'n', 't', 'r', 'a', 'n', 's', 'a', 'c', 't', 'i', 'e', 's', '.', 'n', 'l', '\0',
   /* "mikadesign.se", false */ 'm', 'i', 'k', 'a', 'd', 'e', 's', 'i', 'g', 'n', '.', 's', 'e', '\0',
   /* "mikadoe.nl", true */ 'm', 'i', 'k', 'a', 'd', 'o', 'e', '.', 'n', 'l', '\0',
   /* "mikaela.info", true */ 'm', 'i', 'k', 'a', 'e', 'l', 'a', '.', 'i', 'n', 'f', 'o', '\0',
   /* "mike-bland.com", true */ 'm', 'i', 'k', 'e', '-', 'b', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0',
   /* "mikecb.org", true */ 'm', 'i', 'k', 'e', 'c', 'b', '.', 'o', 'r', 'g', '\0',
+  /* "mikeg.de", true */ 'm', 'i', 'k', 'e', 'g', '.', 'd', 'e', '\0',
   /* "mikek.work", true */ 'm', 'i', 'k', 'e', 'k', '.', 'w', 'o', 'r', 'k', '\0',
   /* "mikeology.org", true */ 'm', 'i', 'k', 'e', 'o', 'l', 'o', 'g', 'y', '.', 'o', 'r', 'g', '\0',
   /* "miketabor.com", true */ 'm', 'i', 'k', 'e', 't', 'a', 'b', 'o', 'r', '.', 'c', 'o', 'm', '\0',
   /* "mikewest.org", true */ 'm', 'i', 'k', 'e', 'w', 'e', 's', 't', '.', 'o', 'r', 'g', '\0',
   /* "mikewillia.ms", true */ 'm', 'i', 'k', 'e', 'w', 'i', 'l', 'l', 'i', 'a', '.', 'm', 's', '\0',
   /* "mikeybot.com", true */ 'm', 'i', 'k', 'e', 'y', 'b', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "mikii.club", true */ 'm', 'i', 'k', 'i', 'i', '.', 'c', 'l', 'u', 'b', '\0',
   /* "miknight.com", true */ 'm', 'i', 'k', 'n', 'i', 'g', 'h', 't', '.', 'c', 'o', 'm', '\0',
@@ -7600,17 +7602,16 @@ static const char kSTSHostTable[] = {
   /* "missoy.me", true */ 'm', 'i', 's', 's', 'o', 'y', '.', 'm', 'e', '\0',
   /* "mistacms.com", true */ 'm', 'i', 's', 't', 'a', 'c', 'm', 's', '.', 'c', 'o', 'm', '\0',
   /* "mister.hosting", true */ 'm', 'i', 's', 't', 'e', 'r', '.', 'h', 'o', 's', 't', 'i', 'n', 'g', '\0',
   /* "misterl.net", true */ 'm', 'i', 's', 't', 'e', 'r', 'l', '.', 'n', 'e', 't', '\0',
   /* "mistreaded.com", true */ 'm', 'i', 's', 't', 'r', 'e', 'a', 'd', 'e', 'd', '.', 'c', 'o', 'm', '\0',
   /* "mit-uns.org", true */ 'm', 'i', 't', '-', 'u', 'n', 's', '.', 'o', 'r', 'g', '\0',
   /* "mita.me", true */ 'm', 'i', 't', 'a', '.', 'm', 'e', '\0',
   /* "mitarbeiter-pc.de", true */ 'm', 'i', 't', 'a', 'r', 'b', 'e', 'i', 't', 'e', 'r', '-', 'p', 'c', '.', 'd', 'e', '\0',
-  /* "mitchellrenouf.ca", false */ 'm', 'i', 't', 'c', 'h', 'e', 'l', 'l', 'r', 'e', 'n', 'o', 'u', 'f', '.', 'c', 'a', '\0',
   /* "mitell.jp", false */ 'm', 'i', 't', 'e', 'l', 'l', '.', 'j', 'p', '\0',
   /* "mitnetz-gas.de", true */ 'm', 'i', 't', 'n', 'e', 't', 'z', '-', 'g', 'a', 's', '.', 'd', 'e', '\0',
   /* "mitnetz-strom.de", true */ 'm', 'i', 't', 'n', 'e', 't', 'z', '-', 's', 't', 'r', 'o', 'm', '.', 'd', 'e', '\0',
   /* "mitrecaasd.org", true */ 'm', 'i', 't', 'r', 'e', 'c', 'a', 'a', 's', 'd', '.', 'o', 'r', 'g', '\0',
   /* "mitremai.org", true */ 'm', 'i', 't', 'r', 'e', 'm', 'a', 'i', '.', 'o', 'r', 'g', '\0',
   /* "mitsukabose.com", true */ 'm', 'i', 't', 's', 'u', 'k', 'a', 'b', 'o', 's', 'e', '.', 'c', 'o', 'm', '\0',
   /* "mittelunsachlich.de", true */ 'm', 'i', 't', 't', 'e', 'l', 'u', 'n', 's', 'a', 'c', 'h', 'l', 'i', 'c', 'h', '.', 'd', 'e', '\0',
   /* "mitzpettel.com", true */ 'm', 'i', 't', 'z', 'p', 'e', 't', 't', 'e', 'l', '.', 'c', 'o', 'm', '\0',
@@ -7912,37 +7913,38 @@ static const char kSTSHostTable[] = {
   /* "myownconference.ru", true */ 'm', 'y', 'o', 'w', 'n', 'c', 'o', 'n', 'f', 'e', 'r', 'e', 'n', 'c', 'e', '.', 'r', 'u', '\0',
   /* "myownwebinar.com", true */ 'm', 'y', 'o', 'w', 'n', 'w', 'e', 'b', 'i', 'n', 'a', 'r', '.', 'c', 'o', 'm', '\0',
   /* "mypaperwriter.com", true */ 'm', 'y', 'p', 'a', 'p', 'e', 'r', 'w', 'r', 'i', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "mypayoffloan.com", true */ 'm', 'y', 'p', 'a', 'y', 'o', 'f', 'f', 'l', 'o', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "mypension.ca", true */ 'm', 'y', 'p', 'e', 'n', 's', 'i', 'o', 'n', '.', 'c', 'a', '\0',
   /* "myphonebox.de", true */ 'm', 'y', 'p', 'h', 'o', 'n', 'e', 'b', 'o', 'x', '.', 'd', 'e', '\0',
   /* "myprintcard.de", true */ 'm', 'y', 'p', 'r', 'i', 'n', 't', 'c', 'a', 'r', 'd', '.', 'd', 'e', '\0',
   /* "myptsite.com", true */ 'm', 'y', 'p', 't', 's', 'i', 't', 'e', '.', 'c', 'o', 'm', '\0',
+  /* "myraytech.net", false */ 'm', 'y', 'r', 'a', 'y', 't', 'e', 'c', 'h', '.', 'n', 'e', 't', '\0',
   /* "myrealestatemate.com.au", true */ 'm', 'y', 'r', 'e', 'a', 'l', 'e', 's', 't', 'a', 't', 'e', 'm', 'a', 't', 'e', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "myrepublic.co.id", true */ 'm', 'y', 'r', 'e', 'p', 'u', 'b', 'l', 'i', 'c', '.', 'c', 'o', '.', 'i', 'd', '\0',
   /* "myresearchapp.com", true */ 'm', 'y', 'r', 'e', 's', 'e', 'a', 'r', 'c', 'h', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
   /* "myruststats.com", true */ 'm', 'y', 'r', 'u', 's', 't', 's', 't', 'a', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "myschoolphoto.org", true */ 'm', 'y', 's', 'c', 'h', 'o', 'o', 'l', 'p', 'h', 'o', 't', 'o', '.', 'o', 'r', 'g', '\0',
   /* "mysecretcase.com", true */ 'm', 'y', 's', 'e', 'c', 'r', 'e', 't', 'c', 'a', 's', 'e', '.', 'c', 'o', 'm', '\0',
   /* "myshirtsize.com", true */ 'm', 'y', 's', 'h', 'i', 'r', 't', 's', 'i', 'z', 'e', '.', 'c', 'o', 'm', '\0',
   /* "mysignal.com", true */ 'm', 'y', 's', 'i', 'g', 'n', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "mysmelly.com", true */ 'm', 'y', 's', 'm', 'e', 'l', 'l', 'y', '.', 'c', 'o', 'm', '\0',
   /* "mysoundtalks.com", true */ 'm', 'y', 's', 'o', 'u', 'n', 'd', 't', 'a', 'l', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "mystery-science-theater-3000.de", true */ 'm', 'y', 's', 't', 'e', 'r', 'y', '-', 's', 'c', 'i', 'e', 'n', 'c', 'e', '-', 't', 'h', 'e', 'a', 't', 'e', 'r', '-', '3', '0', '0', '0', '.', 'd', 'e', '\0',
   /* "mysticplumes.com", true */ 'm', 'y', 's', 't', 'i', 'c', 'p', 'l', 'u', 'm', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "mytc.fr", true */ 'm', 'y', 't', 'c', '.', 'f', 'r', '\0',
   /* "mythengay.ch", true */ 'm', 'y', 't', 'h', 'e', 'n', 'g', 'a', 'y', '.', 'c', 'h', '\0',
+  /* "mythslegendscollection.com", true */ 'm', 'y', 't', 'h', 's', 'l', 'e', 'g', 'e', 'n', 'd', 's', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "mytraiteurs.com", true */ 'm', 'y', 't', 'r', 'a', 'i', 't', 'e', 'u', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "mytripcar.co.uk", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "mytripcar.com", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'c', 'o', 'm', '\0',
   /* "mytripcar.de", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'd', 'e', '\0',
   /* "mytripcar.es", true */ 'm', 'y', 't', 'r', 'i', 'p', 'c', 'a', 'r', '.', 'e', 's', '\0',
   /* "mytty.net", true */ 'm', 'y', 't', 't', 'y', '.', 'n', 'e', 't', '\0',
-  /* "mytweeps.com", true */ 'm', 'y', 't', 'w', 'e', 'e', 'p', 's', '.', 'c', 'o', 'm', '\0',
   /* "myvpl.com", true */ 'm', 'y', 'v', 'p', 'l', '.', 'c', 'o', 'm', '\0',
   /* "myworkinfo.com", true */ 'm', 'y', 'w', 'o', 'r', 'k', 'i', 'n', 'f', 'o', '.', 'c', 'o', 'm', '\0',
   /* "myworth.com.au", true */ 'm', 'y', 'w', 'o', 'r', 't', 'h', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "myzina.cz", false */ 'm', 'y', 'z', 'i', 'n', 'a', '.', 'c', 'z', '\0',
   /* "n-pix.com", false */ 'n', '-', 'p', 'i', 'x', '.', 'c', 'o', 'm', '\0',
   /* "n-soft.info", true */ 'n', '-', 's', 'o', 'f', 't', '.', 'i', 'n', 'f', 'o', '\0',
   /* "n0paste.tk", true */ 'n', '0', 'p', 'a', 's', 't', 'e', '.', 't', 'k', '\0',
   /* "n0psled.nl", true */ 'n', '0', 'p', 's', 'l', 'e', 'd', '.', 'n', 'l', '\0',
@@ -8049,17 +8051,16 @@ static const char kSTSHostTable[] = {
   /* "nedraconsult.ru", true */ 'n', 'e', 'd', 'r', 'a', 'c', 'o', 'n', 's', 'u', 'l', 't', '.', 'r', 'u', '\0',
   /* "neer.io", true */ 'n', 'e', 'e', 'r', '.', 'i', 'o', '\0',
   /* "nefertitis.cz", true */ 'n', 'e', 'f', 'e', 'r', 't', 'i', 't', 'i', 's', '.', 'c', 'z', '\0',
   /* "neftebitum-kngk.ru", true */ 'n', 'e', 'f', 't', 'e', 'b', 'i', 't', 'u', 'm', '-', 'k', 'n', 'g', 'k', '.', 'r', 'u', '\0',
   /* "neg9.org", false */ 'n', 'e', 'g', '9', '.', 'o', 'r', 'g', '\0',
   /* "negai.moe", true */ 'n', 'e', 'g', 'a', 'i', '.', 'm', 'o', 'e', '\0',
   /* "negativecurvature.net", true */ 'n', 'e', 'g', 'a', 't', 'i', 'v', 'e', 'c', 'u', 'r', 'v', 'a', 't', 'u', 'r', 'e', '.', 'n', 'e', 't', '\0',
   /* "neglecteddiseases.gov", true */ 'n', 'e', 'g', 'l', 'e', 'c', 't', 'e', 'd', 'd', 'i', 's', 'e', 'a', 's', 'e', 's', '.', 'g', 'o', 'v', '\0',
-  /* "neilgreen.net", true */ 'n', 'e', 'i', 'l', 'g', 'r', 'e', 'e', 'n', '.', 'n', 'e', 't', '\0',
   /* "neillans.co.uk", true */ 'n', 'e', 'i', 'l', 'l', 'a', 'n', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "neillans.com", true */ 'n', 'e', 'i', 'l', 'l', 'a', 'n', 's', '.', 'c', 'o', 'm', '\0',
   /* "neilwynne.com", false */ 'n', 'e', 'i', 'l', 'w', 'y', 'n', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "neko-life.com", true */ 'n', 'e', 'k', 'o', '-', 'l', 'i', 'f', 'e', '.', 'c', 'o', 'm', '\0',
   /* "neko.li", true */ 'n', 'e', 'k', 'o', '.', 'l', 'i', '\0',
   /* "nekomimi.pl", true */ 'n', 'e', 'k', 'o', 'm', 'i', 'm', 'i', '.', 'p', 'l', '\0',
   /* "nekosc.com", true */ 'n', 'e', 'k', 'o', 's', 'c', '.', 'c', 'o', 'm', '\0',
   /* "nelhage.com", true */ 'n', 'e', 'l', 'h', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0',
@@ -8235,17 +8236,17 @@ static const char kSTSHostTable[] = {
   /* "nilrem.org", true */ 'n', 'i', 'l', 'r', 'e', 'm', '.', 'o', 'r', 'g', '\0',
   /* "nimeshjm.com", true */ 'n', 'i', 'm', 'e', 's', 'h', 'j', 'm', '.', 'c', 'o', 'm', '\0',
   /* "ninchat.com", true */ 'n', 'i', 'n', 'c', 'h', 'a', 't', '.', 'c', 'o', 'm', '\0',
   /* "ninchisho-online.com", true */ 'n', 'i', 'n', 'c', 'h', 'i', 's', 'h', 'o', '-', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "nine-hells.net", false */ 'n', 'i', 'n', 'e', '-', 'h', 'e', 'l', 'l', 's', '.', 'n', 'e', 't', '\0',
   /* "ninespec.com", true */ 'n', 'i', 'n', 'e', 's', 'p', 'e', 'c', '.', 'c', 'o', 'm', '\0',
   /* "ninjan.co", true */ 'n', 'i', 'n', 'j', 'a', 'n', '.', 'c', 'o', '\0',
   /* "ninthfloor.org", true */ 'n', 'i', 'n', 't', 'h', 'f', 'l', 'o', 'o', 'r', '.', 'o', 'r', 'g', '\0',
-  /* "ninux.ch", true */ 'n', 'i', 'n', 'u', 'x', '.', 'c', 'h', '\0',
+  /* "ninux.ch", false */ 'n', 'i', 'n', 'u', 'x', '.', 'c', 'h', '\0',
   /* "niouininon.eu", true */ 'n', 'i', 'o', 'u', 'i', 'n', 'i', 'n', 'o', 'n', '.', 'e', 'u', '\0',
   /* "nippler.org", true */ 'n', 'i', 'p', 'p', 'l', 'e', 'r', '.', 'o', 'r', 'g', '\0',
   /* "nippon-oku.com", true */ 'n', 'i', 'p', 'p', 'o', 'n', '-', 'o', 'k', 'u', '.', 'c', 'o', 'm', '\0',
   /* "nippon.fr", true */ 'n', 'i', 'p', 'p', 'o', 'n', '.', 'f', 'r', '\0',
   /* "nirada.info", true */ 'n', 'i', 'r', 'a', 'd', 'a', '.', 'i', 'n', 'f', 'o', '\0',
   /* "nitrix.me", true */ 'n', 'i', 't', 'r', 'i', 'x', '.', 'm', 'e', '\0',
   /* "nitropur.com", true */ 'n', 'i', 't', 'r', 'o', 'p', 'u', 'r', '.', 'c', 'o', 'm', '\0',
   /* "nitropur.de", true */ 'n', 'i', 't', 'r', 'o', 'p', 'u', 'r', '.', 'd', 'e', '\0',
@@ -8719,17 +8720,16 @@ static const char kSTSHostTable[] = {
   /* "parlamento.gub.uy", true */ 'p', 'a', 'r', 'l', 'a', 'm', 'e', 'n', 't', 'o', '.', 'g', 'u', 'b', '.', 'u', 'y', '\0',
   /* "parleu2016.nl", true */ 'p', 'a', 'r', 'l', 'e', 'u', '2', '0', '1', '6', '.', 'n', 'l', '\0',
   /* "parleur.net", true */ 'p', 'a', 'r', 'l', 'e', 'u', 'r', '.', 'n', 'e', 't', '\0',
   /* "parodybit.net", true */ 'p', 'a', 'r', 'o', 'd', 'y', 'b', 'i', 't', '.', 'n', 'e', 't', '\0',
   /* "parpaing-paillette.net", true */ 'p', 'a', 'r', 'p', 'a', 'i', 'n', 'g', '-', 'p', 'a', 'i', 'l', 'l', 'e', 't', 't', 'e', '.', 'n', 'e', 't', '\0',
   /* "parsemail.org", true */ 'p', 'a', 'r', 's', 'e', 'm', 'a', 'i', 'l', '.', 'o', 'r', 'g', '\0',
   /* "parser.nu", true */ 'p', 'a', 'r', 's', 'e', 'r', '.', 'n', 'u', '\0',
   /* "partirkyoto.jp", true */ 'p', 'a', 'r', 't', 'i', 'r', 'k', 'y', 'o', 't', 'o', '.', 'j', 'p', '\0',
-  /* "partnerbeam.com", true */ 'p', 'a', 'r', 't', 'n', 'e', 'r', 'b', 'e', 'a', 'm', '.', 'c', 'o', 'm', '\0',
   /* "partnercardservices.com", true */ 'p', 'a', 'r', 't', 'n', 'e', 'r', 'c', 'a', 'r', 'd', 's', 'e', 'r', 'v', 'i', 'c', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "partnersfcu.org", true */ 'p', 'a', 'r', 't', 'n', 'e', 'r', 's', 'f', 'c', 'u', '.', 'o', 'r', 'g', '\0',
   /* "partou.de", true */ 'p', 'a', 'r', 't', 'o', 'u', '.', 'd', 'e', '\0',
   /* "partyhaus.ovh", true */ 'p', 'a', 'r', 't', 'y', 'h', 'a', 'u', 's', '.', 'o', 'v', 'h', '\0',
   /* "partyvan.eu", true */ 'p', 'a', 'r', 't', 'y', 'v', 'a', 'n', '.', 'e', 'u', '\0',
   /* "partyvan.io", true */ 'p', 'a', 'r', 't', 'y', 'v', 'a', 'n', '.', 'i', 'o', '\0',
   /* "pasadenapooch.org", true */ 'p', 'a', 's', 'a', 'd', 'e', 'n', 'a', 'p', 'o', 'o', 'c', 'h', '.', 'o', 'r', 'g', '\0',
   /* "pascalleguern.com", true */ 'p', 'a', 's', 'c', 'a', 'l', 'l', 'e', 'g', 'u', 'e', 'r', 'n', '.', 'c', 'o', 'm', '\0',
@@ -8901,16 +8901,17 @@ static const char kSTSHostTable[] = {
   /* "pfadfinder-aurich.de", true */ 'p', 'f', 'a', 'd', 'f', 'i', 'n', 'd', 'e', 'r', '-', 'a', 'u', 'r', 'i', 'c', 'h', '.', 'd', 'e', '\0',
   /* "pfarchimedes-pensioen123.nl", true */ 'p', 'f', 'a', 'r', 'c', 'h', 'i', 'm', 'e', 'd', 'e', 's', '-', 'p', 'e', 'n', 's', 'i', 'o', 'e', 'n', '1', '2', '3', '.', 'n', 'l', '\0',
   /* "pfd-nz.com", false */ 'p', 'f', 'd', '-', 'n', 'z', '.', 'c', 'o', 'm', '\0',
   /* "pfo.io", true */ 'p', 'f', 'o', '.', 'i', 'o', '\0',
   /* "pfolta.net", true */ 'p', 'f', 'o', 'l', 't', 'a', '.', 'n', 'e', 't', '\0',
   /* "pgmann.cf", true */ 'p', 'g', 'm', 'a', 'n', 'n', '.', 'c', 'f', '\0',
   /* "pgmsource.com", true */ 'p', 'g', 'm', 's', 'o', 'u', 'r', 'c', 'e', '.', 'c', 'o', 'm', '\0',
   /* "pgnetwork.net", true */ 'p', 'g', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'n', 'e', 't', '\0',
+  /* "pgpmail.cc", true */ 'p', 'g', 'p', 'm', 'a', 'i', 'l', '.', 'c', 'c', '\0',
   /* "pgregg.com", false */ 'p', 'g', 'r', 'e', 'g', 'g', '.', 'c', 'o', 'm', '\0',
   /* "pgtb.be", true */ 'p', 'g', 't', 'b', '.', 'b', 'e', '\0',
   /* "ph.search.yahoo.com", false */ 'p', 'h', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "phalconist.com", true */ 'p', 'h', 'a', 'l', 'c', 'o', 'n', 'i', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "phantasie.cc", true */ 'p', 'h', 'a', 'n', 't', 'a', 's', 'i', 'e', '.', 'c', 'c', '\0',
   /* "phantastikon.de", true */ 'p', 'h', 'a', 'n', 't', 'a', 's', 't', 'i', 'k', 'o', 'n', '.', 'd', 'e', '\0',
   /* "pharmaboard.de", true */ 'p', 'h', 'a', 'r', 'm', 'a', 'b', 'o', 'a', 'r', 'd', '.', 'd', 'e', '\0',
   /* "pharmgkb.org", true */ 'p', 'h', 'a', 'r', 'm', 'g', 'k', 'b', '.', 'o', 'r', 'g', '\0',
@@ -8923,17 +8924,16 @@ static const char kSTSHostTable[] = {
   /* "phi-works.com", true */ 'p', 'h', 'i', '-', 'w', 'o', 'r', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "phil.tw", true */ 'p', 'h', 'i', 'l', '.', 't', 'w', '\0',
   /* "philadelphia.com.mx", true */ 'p', 'h', 'i', 'l', 'a', 'd', 'e', 'l', 'p', 'h', 'i', 'a', '.', 'c', 'o', 'm', '.', 'm', 'x', '\0',
   /* "philadelphiadancefoundation.org", true */ 'p', 'h', 'i', 'l', 'a', 'd', 'e', 'l', 'p', 'h', 'i', 'a', 'd', 'a', 'n', 'c', 'e', 'f', 'o', 'u', 'n', 'd', 'a', 't', 'i', 'o', 'n', '.', 'o', 'r', 'g', '\0',
   /* "philipkohn.com", true */ 'p', 'h', 'i', 'l', 'i', 'p', 'k', 'o', 'h', 'n', '.', 'c', 'o', 'm', '\0',
   /* "philipmordue.co.uk", true */ 'p', 'h', 'i', 'l', 'i', 'p', 'm', 'o', 'r', 'd', 'u', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "phillmoore.com", true */ 'p', 'h', 'i', 'l', 'l', 'm', 'o', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "phillprice.com", true */ 'p', 'h', 'i', 'l', 'l', 'p', 'r', 'i', 'c', 'e', '.', 'c', 'o', 'm', '\0',
-  /* "philosopherswool.com", true */ 'p', 'h', 'i', 'l', 'o', 's', 'o', 'p', 'h', 'e', 'r', 's', 'w', 'o', 'o', 'l', '.', 'c', 'o', 'm', '\0',
   /* "philosophyguides.org", true */ 'p', 'h', 'i', 'l', 'o', 's', 'o', 'p', 'h', 'y', 'g', 'u', 'i', 'd', 'e', 's', '.', 'o', 'r', 'g', '\0',
   /* "philphonic.de", true */ 'p', 'h', 'i', 'l', 'p', 'h', 'o', 'n', 'i', 'c', '.', 'd', 'e', '\0',
   /* "philpropertygroup.com", true */ 'p', 'h', 'i', 'l', 'p', 'r', 'o', 'p', 'e', 'r', 't', 'y', 'g', 'r', 'o', 'u', 'p', '.', 'c', 'o', 'm', '\0',
   /* "philsturgeon.uk", true */ 'p', 'h', 'i', 'l', 's', 't', 'u', 'r', 'g', 'e', 'o', 'n', '.', 'u', 'k', '\0',
   /* "phocean.net", true */ 'p', 'h', 'o', 'c', 'e', 'a', 'n', '.', 'n', 'e', 't', '\0',
   /* "phoebe.co.nz", true */ 'p', 'h', 'o', 'e', 'b', 'e', '.', 'c', 'o', '.', 'n', 'z', '\0',
   /* "phoenixlogan.com", true */ 'p', 'h', 'o', 'e', 'n', 'i', 'x', 'l', 'o', 'g', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "phone-service-center.de", true */ 'p', 'h', 'o', 'n', 'e', '-', 's', 'e', 'r', 'v', 'i', 'c', 'e', '-', 'c', 'e', 'n', 't', 'e', 'r', '.', 'd', 'e', '\0',
@@ -9154,17 +9154,16 @@ static const char kSTSHostTable[] = {
   /* "posobota.cz", true */ 'p', 'o', 's', 'o', 'b', 'o', 't', 'a', '.', 'c', 'z', '\0',
   /* "post4me.at", true */ 'p', 'o', 's', 't', '4', 'm', 'e', '.', 'a', 't', '\0',
   /* "postal.dk", true */ 'p', 'o', 's', 't', 'a', 'l', '.', 'd', 'k', '\0',
   /* "postblue.info", true */ 'p', 'o', 's', 't', 'b', 'l', 'u', 'e', '.', 'i', 'n', 'f', 'o', '\0',
   /* "postbox.life", true */ 'p', 'o', 's', 't', 'b', 'o', 'x', '.', 'l', 'i', 'f', 'e', '\0',
   /* "postcodegarant.nl", true */ 'p', 'o', 's', 't', 'c', 'o', 'd', 'e', 'g', 'a', 'r', 'a', 'n', 't', '.', 'n', 'l', '\0',
   /* "postcodewise.co.uk", true */ 'p', 'o', 's', 't', 'c', 'o', 'd', 'e', 'w', 'i', 's', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "posteo.de", false */ 'p', 'o', 's', 't', 'e', 'o', '.', 'd', 'e', '\0',
-  /* "posterspy.com", true */ 'p', 'o', 's', 't', 'e', 'r', 's', 'p', 'y', '.', 'c', 'o', 'm', '\0',
   /* "postfinance.ch", true */ 'p', 'o', 's', 't', 'f', 'i', 'n', 'a', 'n', 'c', 'e', '.', 'c', 'h', '\0',
   /* "postn.eu", true */ 'p', 'o', 's', 't', 'n', '.', 'e', 'u', '\0',
   /* "posttigo.com", true */ 'p', 'o', 's', 't', 't', 'i', 'g', 'o', '.', 'c', 'o', 'm', '\0',
   /* "potbar.com", true */ 'p', 'o', 't', 'b', 'a', 'r', '.', 'c', 'o', 'm', '\0',
   /* "potbox.com", true */ 'p', 'o', 't', 'b', 'o', 'x', '.', 'c', 'o', 'm', '\0',
   /* "pothe.com", true */ 'p', 'o', 't', 'h', 'e', '.', 'c', 'o', 'm', '\0',
   /* "pothe.de", true */ 'p', 'o', 't', 'h', 'e', '.', 'd', 'e', '\0',
   /* "potlytics.com", true */ 'p', 'o', 't', 'l', 'y', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
@@ -9206,16 +9205,17 @@ static const char kSTSHostTable[] = {
   /* "prefis.com", true */ 'p', 'r', 'e', 'f', 'i', 's', '.', 'c', 'o', 'm', '\0',
   /* "preisser-it.de", true */ 'p', 'r', 'e', 'i', 's', 's', 'e', 'r', '-', 'i', 't', '.', 'd', 'e', '\0',
   /* "prekladysanca.cz", true */ 'p', 'r', 'e', 'k', 'l', 'a', 'd', 'y', 's', 'a', 'n', 'c', 'a', '.', 'c', 'z', '\0',
   /* "preloaded-hsts.badssl.com", true */ 'p', 'r', 'e', 'l', 'o', 'a', 'd', 'e', 'd', '-', 'h', 's', 't', 's', '.', 'b', 'a', 'd', 's', 's', 'l', '.', 'c', 'o', 'm', '\0',
   /* "premierheart.com", true */ 'p', 'r', 'e', 'm', 'i', 'e', 'r', 'h', 'e', 'a', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "premiumzweirad.de", false */ 'p', 'r', 'e', 'm', 'i', 'u', 'm', 'z', 'w', 'e', 'i', 'r', 'a', 'd', '.', 'd', 'e', '\0',
   /* "prepandgo-euro.com", true */ 'p', 'r', 'e', 'p', 'a', 'n', 'd', 'g', 'o', '-', 'e', 'u', 'r', 'o', '.', 'c', 'o', 'm', '\0',
   /* "preparetheword.com", false */ 'p', 'r', 'e', 'p', 'a', 'r', 'e', 't', 'h', 'e', 'w', 'o', 'r', 'd', '.', 'c', 'o', 'm', '\0',
+  /* "prescotonline.co.uk", true */ 'p', 'r', 'e', 's', 'c', 'o', 't', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "prescriptiondrugs.com", true */ 'p', 'r', 'e', 's', 'c', 'r', 'i', 'p', 't', 'i', 'o', 'n', 'd', 'r', 'u', 'g', 's', '.', 'c', 'o', 'm', '\0',
   /* "presidentials2016.com", true */ 'p', 'r', 'e', 's', 'i', 'd', 'e', 'n', 't', 'i', 'a', 'l', 's', '2', '0', '1', '6', '.', 'c', 'o', 'm', '\0',
   /* "prespanok.sk", true */ 'p', 'r', 'e', 's', 'p', 'a', 'n', 'o', 'k', '.', 's', 'k', '\0',
   /* "press-anime-nenkan.com", true */ 'p', 'r', 'e', 's', 's', '-', 'a', 'n', 'i', 'm', 'e', '-', 'n', 'e', 'n', 'k', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "pressrush.com", true */ 'p', 'r', 'e', 's', 's', 'r', 'u', 's', 'h', '.', 'c', 'o', 'm', '\0',
   /* "prestburyscouts.org.uk", true */ 'p', 'r', 'e', 's', 't', 'b', 'u', 'r', 'y', 's', 'c', 'o', 'u', 't', 's', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "pretix.eu", true */ 'p', 'r', 'e', 't', 'i', 'x', '.', 'e', 'u', '\0',
   /* "pretty.hu", true */ 'p', 'r', 'e', 't', 't', 'y', '.', 'h', 'u', '\0',
@@ -9275,16 +9275,17 @@ static const char kSTSHostTable[] = {
   /* "projectbenson.com", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 'b', 'e', 'n', 's', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "projectblackbook.us", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 'b', 'l', 'a', 'c', 'k', 'b', 'o', 'o', 'k', '.', 'u', 's', '\0',
   /* "projectdp.net", true */ 'p', 'r', 'o', 'j', 'e', 'c', 't', 'd', 'p', '.', 'n', 'e', 't', '\0',
   /* "projektik.cz", true */ 'p', 'r', 'o', 'j', 'e', 'k', 't', 'i', 'k', '.', 'c', 'z', '\0',
   /* "projektzentrisch.de", true */ 'p', 'r', 'o', 'j', 'e', 'k', 't', 'z', 'e', 'n', 't', 'r', 'i', 's', 'c', 'h', '.', 'd', 'e', '\0',
   /* "prok.pw", true */ 'p', 'r', 'o', 'k', '.', 'p', 'w', '\0',
   /* "prometheanfire.net", true */ 'p', 'r', 'o', 'm', 'e', 't', 'h', 'e', 'a', 'n', 'f', 'i', 'r', 'e', '.', 'n', 'e', 't', '\0',
   /* "prometheanfire.org", true */ 'p', 'r', 'o', 'm', 'e', 't', 'h', 'e', 'a', 'n', 'f', 'i', 'r', 'e', '.', 'o', 'r', 'g', '\0',
+  /* "promhadan.com", true */ 'p', 'r', 'o', 'm', 'h', 'a', 'd', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "promisesaplus.com", true */ 'p', 'r', 'o', 'm', 'i', 's', 'e', 's', 'a', 'p', 'l', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "promoscuola.net", true */ 'p', 'r', 'o', 'm', 'o', 's', 'c', 'u', 'o', 'l', 'a', '.', 'n', 'e', 't', '\0',
   /* "promotiongeeks.com", false */ 'p', 'r', 'o', 'm', 'o', 't', 'i', 'o', 'n', 'g', 'e', 'e', 'k', 's', '.', 'c', 'o', 'm', '\0',
   /* "prontocleaners.co.uk", true */ 'p', 'r', 'o', 'n', 't', 'o', 'c', 'l', 'e', 'a', 'n', 'e', 'r', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "prontomovers.co.uk", true */ 'p', 'r', 'o', 'n', 't', 'o', 'm', 'o', 'v', 'e', 'r', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "proofwiki.org", true */ 'p', 'r', 'o', 'o', 'f', 'w', 'i', 'k', 'i', '.', 'o', 'r', 'g', '\0',
   /* "proos.nl", true */ 'p', 'r', 'o', 'o', 's', '.', 'n', 'l', '\0',
   /* "propactrading.com", true */ 'p', 'r', 'o', 'p', 'a', 'c', 't', 'r', 'a', 'd', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
@@ -9689,17 +9690,16 @@ static const char kSTSHostTable[] = {
   /* "renkenlaw.com", true */ 'r', 'e', 'n', 'k', 'e', 'n', 'l', 'a', 'w', '.', 'c', 'o', 'm', '\0',
   /* "renrenche.com", false */ 'r', 'e', 'n', 'r', 'e', 'n', 'c', 'h', 'e', '.', 'c', 'o', 'm', '\0',
   /* "rentacarcluj.xyz", true */ 'r', 'e', 'n', 't', 'a', 'c', 'a', 'r', 'c', 'l', 'u', 'j', '.', 'x', 'y', 'z', '\0',
   /* "rentasweb.gob.ar", true */ 'r', 'e', 'n', 't', 'a', 's', 'w', 'e', 'b', '.', 'g', 'o', 'b', '.', 'a', 'r', '\0',
   /* "rentbrowser.com", true */ 'r', 'e', 'n', 't', 'b', 'r', 'o', 'w', 's', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "rentbrowsertrain.me", true */ 'r', 'e', 'n', 't', 'b', 'r', 'o', 'w', 's', 'e', 'r', 't', 'r', 'a', 'i', 'n', '.', 'm', 'e', '\0',
   /* "rentinsingapore.com.sg", true */ 'r', 'e', 'n', 't', 'i', 'n', 's', 'i', 'n', 'g', 'a', 'p', 'o', 'r', 'e', '.', 'c', 'o', 'm', '.', 's', 'g', '\0',
   /* "renuo.ch", true */ 'r', 'e', 'n', 'u', 'o', '.', 'c', 'h', '\0',
-  /* "reox.at", true */ 'r', 'e', 'o', 'x', '.', 'a', 't', '\0',
   /* "repaxan.com", true */ 'r', 'e', 'p', 'a', 'x', 'a', 'n', '.', 'c', 'o', 'm', '\0',
   /* "replacemychina.com", true */ 'r', 'e', 'p', 'l', 'a', 'c', 'e', 'm', 'y', 'c', 'h', 'i', 'n', 'a', '.', 'c', 'o', 'm', '\0',
   /* "replicagunsswords.com", false */ 'r', 'e', 'p', 'l', 'i', 'c', 'a', 'g', 'u', 'n', 's', 's', 'w', 'o', 'r', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "report-uri.com", true */ 'r', 'e', 'p', 'o', 'r', 't', '-', 'u', 'r', 'i', '.', 'c', 'o', 'm', '\0',
   /* "report-uri.io", true */ 'r', 'e', 'p', 'o', 'r', 't', '-', 'u', 'r', 'i', '.', 'i', 'o', '\0',
   /* "reporturi.com", true */ 'r', 'e', 'p', 'o', 'r', 't', 'u', 'r', 'i', '.', 'c', 'o', 'm', '\0',
   /* "reporturi.io", true */ 'r', 'e', 'p', 'o', 'r', 't', 'u', 'r', 'i', '.', 'i', 'o', '\0',
   /* "republique.org", true */ 'r', 'e', 'p', 'u', 'b', 'l', 'i', 'q', 'u', 'e', '.', 'o', 'r', 'g', '\0',
@@ -9863,16 +9863,17 @@ static const char kSTSHostTable[] = {
   /* "rokki.ch", true */ 'r', 'o', 'k', 'k', 'i', '.', 'c', 'h', '\0',
   /* "rokort.dk", true */ 'r', 'o', 'k', 'o', 'r', 't', '.', 'd', 'k', '\0',
   /* "rokudenashi.de", true */ 'r', 'o', 'k', 'u', 'd', 'e', 'n', 'a', 's', 'h', 'i', '.', 'd', 'e', '\0',
   /* "roland.io", true */ 'r', 'o', 'l', 'a', 'n', 'd', '.', 'i', 'o', '\0',
   /* "rolandreed.cn", true */ 'r', 'o', 'l', 'a', 'n', 'd', 'r', 'e', 'e', 'd', '.', 'c', 'n', '\0',
   /* "rolandszabo.com", true */ 'r', 'o', 'l', 'a', 'n', 'd', 's', 'z', 'a', 'b', 'o', '.', 'c', 'o', 'm', '\0',
   /* "rolemaster.net", true */ 'r', 'o', 'l', 'e', 'm', 'a', 's', 't', 'e', 'r', '.', 'n', 'e', 't', '\0',
   /* "romab.com", true */ 'r', 'o', 'm', 'a', 'b', '.', 'c', 'o', 'm', '\0',
+  /* "romaimperator.com", true */ 'r', 'o', 'm', 'a', 'i', 'm', 'p', 'e', 'r', 'a', 't', 'o', 'r', '.', 'c', 'o', 'm', '\0',
   /* "romainmuller.xyz", true */ 'r', 'o', 'm', 'a', 'i', 'n', 'm', 'u', 'l', 'l', 'e', 'r', '.', 'x', 'y', 'z', '\0',
   /* "roman-pavlik.cz", true */ 'r', 'o', 'm', 'a', 'n', '-', 'p', 'a', 'v', 'l', 'i', 'k', '.', 'c', 'z', '\0',
   /* "romanpavlodar.kz", true */ 'r', 'o', 'm', 'a', 'n', 'p', 'a', 'v', 'l', 'o', 'd', 'a', 'r', '.', 'k', 'z', '\0',
   /* "romanticvillas.com.au", true */ 'r', 'o', 'm', 'a', 'n', 't', 'i', 'c', 'v', 'i', 'l', 'l', 'a', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "rome.dating", true */ 'r', 'o', 'm', 'e', '.', 'd', 'a', 't', 'i', 'n', 'g', '\0',
   /* "romeoferraris.com", false */ 'r', 'o', 'm', 'e', 'o', 'f', 'e', 'r', 'r', 'a', 'r', 'i', 's', '.', 'c', 'o', 'm', '\0',
   /* "rommelwood.de", true */ 'r', 'o', 'm', 'm', 'e', 'l', 'w', 'o', 'o', 'd', '.', 'd', 'e', '\0',
   /* "romulusapp.com", false */ 'r', 'o', 'm', 'u', 'l', 'u', 's', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
@@ -9888,16 +9889,17 @@ static const char kSTSHostTable[] = {
   /* "rootswitch.com", true */ 'r', 'o', 'o', 't', 's', 'w', 'i', 't', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "roquecenter.org", true */ 'r', 'o', 'q', 'u', 'e', 'c', 'e', 'n', 't', 'e', 'r', '.', 'o', 'r', 'g', '\0',
   /* "rose-prism.org", true */ 'r', 'o', 's', 'e', '-', 'p', 'r', 'i', 's', 'm', '.', 'o', 'r', 'g', '\0',
   /* "roseitsolutions.co.uk", true */ 'r', 'o', 's', 'e', 'i', 't', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "rosenkeller.org", true */ 'r', 'o', 's', 'e', 'n', 'k', 'e', 'l', 'l', 'e', 'r', '.', 'o', 'r', 'g', '\0',
   /* "rosewoodranch.com", true */ 'r', 'o', 's', 'e', 'w', 'o', 'o', 'd', 'r', 'a', 'n', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "roslynpad.net", true */ 'r', 'o', 's', 'l', 'y', 'n', 'p', 'a', 'd', '.', 'n', 'e', 't', '\0',
   /* "rossen.be", true */ 'r', 'o', 's', 's', 'e', 'n', '.', 'b', 'e', '\0',
+  /* "rosslug.org.uk", true */ 'r', 'o', 's', 's', 'l', 'u', 'g', '.', 'o', 'r', 'g', '.', 'u', 'k', '\0',
   /* "rot47.net", true */ 'r', 'o', 't', '4', '7', '.', 'n', 'e', 't', '\0',
   /* "rotozen.com", true */ 'r', 'o', 't', 'o', 'z', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "rottweil-hilft.de", true */ 'r', 'o', 't', 't', 'w', 'e', 'i', 'l', '-', 'h', 'i', 'l', 'f', 't', '.', 'd', 'e', '\0',
   /* "rotunneling.net", true */ 'r', 'o', 't', 'u', 'n', 'n', 'e', 'l', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "rotzonline.com", false */ 'r', 'o', 't', 'z', 'o', 'n', 'l', 'i', 'n', 'e', '.', 'c', 'o', 'm', '\0',
   /* "roughgrain.com", true */ 'r', 'o', 'u', 'g', 'h', 'g', 'r', 'a', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "roundcube.mayfirst.org", false */ 'r', 'o', 'u', 'n', 'd', 'c', 'u', 'b', 'e', '.', 'm', 'a', 'y', 'f', 'i', 'r', 's', 't', '.', 'o', 'r', 'g', '\0',
   /* "rous.se", true */ 'r', 'o', 'u', 's', '.', 's', 'e', '\0',
@@ -9929,17 +9931,16 @@ static const char kSTSHostTable[] = {
   /* "ru-sprachstudio.ch", true */ 'r', 'u', '-', 's', 'p', 'r', 'a', 'c', 'h', 's', 't', 'u', 'd', 'i', 'o', '.', 'c', 'h', '\0',
   /* "ru.search.yahoo.com", false */ 'r', 'u', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "ruanmi.de", true */ 'r', 'u', 'a', 'n', 'm', 'i', '.', 'd', 'e', '\0',
   /* "rubbermaidoutlet.com", true */ 'r', 'u', 'b', 'b', 'e', 'r', 'm', 'a', 'i', 'd', 'o', 'u', 't', 'l', 'e', 't', '.', 'c', 'o', 'm', '\0',
   /* "rubendv.be", true */ 'r', 'u', 'b', 'e', 'n', 'd', 'v', '.', 'b', 'e', '\0',
   /* "rubi-ka.net", false */ 'r', 'u', 'b', 'i', '-', 'k', 'a', '.', 'n', 'e', 't', '\0',
   /* "rubysecurity.org", true */ 'r', 'u', 'b', 'y', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'o', 'r', 'g', '\0',
   /* "rudd-o.com", true */ 'r', 'u', 'd', 'd', '-', 'o', '.', 'c', 'o', 'm', '\0',
-  /* "rudeotter.com", true */ 'r', 'u', 'd', 'e', 'o', 't', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "ruderverein-gelsenkirchen.de", true */ 'r', 'u', 'd', 'e', 'r', 'v', 'e', 'r', 'e', 'i', 'n', '-', 'g', 'e', 'l', 's', 'e', 'n', 'k', 'i', 'r', 'c', 'h', 'e', 'n', '.', 'd', 'e', '\0',
   /* "ruffbeatz.com", true */ 'r', 'u', 'f', 'f', 'b', 'e', 'a', 't', 'z', '.', 'c', 'o', 'm', '\0',
   /* "rugk.dedyn.io", true */ 'r', 'u', 'g', 'k', '.', 'd', 'e', 'd', 'y', 'n', '.', 'i', 'o', '\0',
   /* "rugstorene.co.uk", true */ 'r', 'u', 'g', 's', 't', 'o', 'r', 'e', 'n', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "ruh-veit.de", true */ 'r', 'u', 'h', '-', 'v', 'e', 'i', 't', '.', 'd', 'e', '\0',
   /* "ruhrmobil-e.de", true */ 'r', 'u', 'h', 'r', 'm', 'o', 'b', 'i', 'l', '-', 'e', '.', 'd', 'e', '\0',
   /* "ruja.dk", true */ 'r', 'u', 'j', 'a', '.', 'd', 'k', '\0',
   /* "runcarina.com", true */ 'r', 'u', 'n', 'c', 'a', 'r', 'i', 'n', 'a', '.', 'c', 'o', 'm', '\0',
@@ -9963,16 +9964,17 @@ static const char kSTSHostTable[] = {
   /* "rwanderlust.com", true */ 'r', 'w', 'a', 'n', 'd', 'e', 'r', 'l', 'u', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "rws-vertriebsportal.de", true */ 'r', 'w', 's', '-', 'v', 'e', 'r', 't', 'r', 'i', 'e', 'b', 's', 'p', 'o', 'r', 't', 'a', 'l', '.', 'd', 'e', '\0',
   /* "rww.name", true */ 'r', 'w', 'w', '.', 'n', 'a', 'm', 'e', '\0',
   /* "rx-contact.com", true */ 'r', 'x', '-', 'c', 'o', 'n', 't', 'a', 'c', 't', '.', 'c', 'o', 'm', '\0',
   /* "rxbn.de", true */ 'r', 'x', 'b', 'n', '.', 'd', 'e', '\0',
   /* "ryan-goldstein.com", true */ 'r', 'y', 'a', 'n', '-', 'g', 'o', 'l', 'd', 's', 't', 'e', 'i', 'n', '.', 'c', 'o', 'm', '\0',
   /* "ryanhowell.io", true */ 'r', 'y', 'a', 'n', 'h', 'o', 'w', 'e', 'l', 'l', '.', 'i', 'o', '\0',
   /* "ryanmcdonough.co.uk", true */ 'r', 'y', 'a', 'n', 'm', 'c', 'd', 'o', 'n', 'o', 'u', 'g', 'h', '.', 'c', 'o', '.', 'u', 'k', '\0',
+  /* "ryansmithphotography.com", true */ 'r', 'y', 'a', 'n', 's', 'm', 'i', 't', 'h', 'p', 'h', 'o', 't', 'o', 'g', 'r', 'a', 'p', 'h', 'y', '.', 'c', 'o', 'm', '\0',
   /* "rylin.net", true */ 'r', 'y', 'l', 'i', 'n', '.', 'n', 'e', 't', '\0',
   /* "rynekpierwotny.pl", true */ 'r', 'y', 'n', 'e', 'k', 'p', 'i', 'e', 'r', 'w', 'o', 't', 'n', 'y', '.', 'p', 'l', '\0',
   /* "s-c.se", true */ 's', '-', 'c', '.', 's', 'e', '\0',
   /* "s-cubed.net", true */ 's', '-', 'c', 'u', 'b', 'e', 'd', '.', 'n', 'e', 't', '\0',
   /* "s-mainte.com", true */ 's', '-', 'm', 'a', 'i', 'n', 't', 'e', '.', 'c', 'o', 'm', '\0',
   /* "s-mdb.com", true */ 's', '-', 'm', 'd', 'b', '.', 'c', 'o', 'm', '\0',
   /* "s.how", true */ 's', '.', 'h', 'o', 'w', '\0',
   /* "s007.co", true */ 's', '0', '0', '7', '.', 'c', 'o', '\0',
@@ -10062,17 +10064,16 @@ static const char kSTSHostTable[] = {
   /* "sanissimo.com.mx", true */ 's', 'a', 'n', 'i', 's', 's', 'i', 'm', 'o', '.', 'c', 'o', 'm', '.', 'm', 'x', '\0',
   /* "sanradon.by", true */ 's', 'a', 'n', 'r', 'a', 'd', 'o', 'n', '.', 'b', 'y', '\0',
   /* "sansonehowell.com", true */ 's', 'a', 'n', 's', 'o', 'n', 'e', 'h', 'o', 'w', 'e', 'l', 'l', '.', 'c', 'o', 'm', '\0',
   /* "santanderideas.com", true */ 's', 'a', 'n', 't', 'a', 'n', 'd', 'e', 'r', 'i', 'd', 'e', 'a', 's', '.', 'c', 'o', 'm', '\0',
   /* "santing.net", true */ 's', 'a', 'n', 't', 'i', 'n', 'g', '.', 'n', 'e', 't', '\0',
   /* "saorsat.ie", true */ 's', 'a', 'o', 'r', 's', 'a', 't', '.', 'i', 'e', '\0',
   /* "saorviewconnect.ie", true */ 's', 'a', 'o', 'r', 'v', 'i', 'e', 'w', 'c', 'o', 'n', 'n', 'e', 'c', 't', '.', 'i', 'e', '\0',
   /* "sapience.com", true */ 's', 'a', 'p', 'i', 'e', 'n', 'c', 'e', '.', 'c', 'o', 'm', '\0',
-  /* "sapk.fr", true */ 's', 'a', 'p', 'k', '.', 'f', 'r', '\0',
   /* "sapporobeer.com", true */ 's', 'a', 'p', 'p', 'o', 'r', 'o', 'b', 'e', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "sarahbeckettharpist.com", true */ 's', 'a', 'r', 'a', 'h', 'b', 'e', 'c', 'k', 'e', 't', 't', 'h', 'a', 'r', 'p', 'i', 's', 't', '.', 'c', 'o', 'm', '\0',
   /* "sarahlicity.co.uk", false */ 's', 'a', 'r', 'a', 'h', 'l', 'i', 'c', 'i', 't', 'y', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "sarahlicity.me.uk", true */ 's', 'a', 'r', 'a', 'h', 'l', 'i', 'c', 'i', 't', 'y', '.', 'm', 'e', '.', 'u', 'k', '\0',
   /* "sarahs-roestcafe.de", false */ 's', 'a', 'r', 'a', 'h', 's', '-', 'r', 'o', 'e', 's', 't', 'c', 'a', 'f', 'e', '.', 'd', 'e', '\0',
   /* "sarahsweger.com", true */ 's', 'a', 'r', 'a', 'h', 's', 'w', 'e', 'g', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "sarahvictor.co.uk", true */ 's', 'a', 'r', 'a', 'h', 'v', 'i', 'c', 't', 'o', 'r', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "sarakas.com", true */ 's', 'a', 'r', 'a', 'k', 'a', 's', '.', 'c', 'o', 'm', '\0',
@@ -10172,17 +10173,16 @@ static const char kSTSHostTable[] = {
   /* "schwarzer.it", true */ 's', 'c', 'h', 'w', 'a', 'r', 'z', 'e', 'r', '.', 'i', 't', '\0',
   /* "schwarzkopfforyou.de", true */ 's', 'c', 'h', 'w', 'a', 'r', 'z', 'k', 'o', 'p', 'f', 'f', 'o', 'r', 'y', 'o', 'u', '.', 'd', 'e', '\0',
   /* "schwarzwaldcon.de", true */ 's', 'c', 'h', 'w', 'a', 'r', 'z', 'w', 'a', 'l', 'd', 'c', 'o', 'n', '.', 'd', 'e', '\0',
   /* "schwinabart.com", true */ 's', 'c', 'h', 'w', 'i', 'n', 'a', 'b', 'a', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "schwinger.me", true */ 's', 'c', 'h', 'w', 'i', 'n', 'g', 'e', 'r', '.', 'm', 'e', '\0',
   /* "scicasts.com", true */ 's', 'c', 'i', 'c', 'a', 's', 't', 's', '.', 'c', 'o', 'm', '\0',
   /* "science-texts.de", true */ 's', 'c', 'i', 'e', 'n', 'c', 'e', '-', 't', 'e', 'x', 't', 's', '.', 'd', 'e', '\0',
   /* "sciencesolutions.eu", true */ 's', 'c', 'i', 'e', 'n', 'c', 'e', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '.', 'e', 'u', '\0',
-  /* "sciencex.com", true */ 's', 'c', 'i', 'e', 'n', 'c', 'e', 'x', '.', 'c', 'o', 'm', '\0',
   /* "scivillage.com", true */ 's', 'c', 'i', 'v', 'i', 'l', 'l', 'a', 'g', 'e', '.', 'c', 'o', 'm', '\0',
   /* "sclgroup.cc", true */ 's', 'c', 'l', 'g', 'r', 'o', 'u', 'p', '.', 'c', 'c', '\0',
   /* "scores4schools.com", true */ 's', 'c', 'o', 'r', 'e', 's', '4', 's', 'c', 'h', 'o', 'o', 'l', 's', '.', 'c', 'o', 'm', '\0',
   /* "scottainslie.me.uk", true */ 's', 'c', 'o', 't', 't', 'a', 'i', 'n', 's', 'l', 'i', 'e', '.', 'm', 'e', '.', 'u', 'k', '\0',
   /* "scottdial.com", true */ 's', 'c', 'o', 't', 't', 'd', 'i', 'a', 'l', '.', 'c', 'o', 'm', '\0',
   /* "scottgruber.me", true */ 's', 'c', 'o', 't', 't', 'g', 'r', 'u', 'b', 'e', 'r', '.', 'm', 'e', '\0',
   /* "scotthel.me", true */ 's', 'c', 'o', 't', 't', 'h', 'e', 'l', '.', 'm', 'e', '\0',
   /* "scotthelme.co.uk", true */ 's', 'c', 'o', 't', 't', 'h', 'e', 'l', 'm', 'e', '.', 'c', 'o', '.', 'u', 'k', '\0',
@@ -10927,17 +10927,16 @@ static const char kSTSHostTable[] = {
   /* "srevilak.net", true */ 's', 'r', 'e', 'v', 'i', 'l', 'a', 'k', '.', 'n', 'e', 't', '\0',
   /* "sritest.io", true */ 's', 'r', 'i', 't', 'e', 's', 't', '.', 'i', 'o', '\0',
   /* "sro.center", true */ 's', 'r', 'o', '.', 'c', 'e', 'n', 't', 'e', 'r', '\0',
   /* "srpdb.com", true */ 's', 'r', 'p', 'd', 'b', '.', 'c', 'o', 'm', '\0',
   /* "srrr.ca", true */ 's', 'r', 'r', 'r', '.', 'c', 'a', '\0',
   /* "srv47.de", true */ 's', 'r', 'v', '4', '7', '.', 'd', 'e', '\0',
   /* "ss-x.ru", true */ 's', 's', '-', 'x', '.', 'r', 'u', '\0',
   /* "ss.lv", false */ 's', 's', '.', 'l', 'v', '\0',
-  /* "ss.wtf", true */ 's', 's', '.', 'w', 't', 'f', '\0',
   /* "ssa.gov", false */ 's', 's', 'a', '.', 'g', 'o', 'v', '\0',
   /* "ssbrm.ch", true */ 's', 's', 'b', 'r', 'm', '.', 'c', 'h', '\0',
   /* "sscd.no", true */ 's', 's', 'c', 'd', '.', 'n', 'o', '\0',
   /* "ssdax.com", true */ 's', 's', 'd', 'a', 'x', '.', 'c', 'o', 'm', '\0',
   /* "ssl-zertifikate.de", true */ 's', 's', 'l', '-', 'z', 'e', 'r', 't', 'i', 'f', 'i', 'k', 'a', 't', 'e', '.', 'd', 'e', '\0',
   /* "ssl.google-analytics.com", true */ 's', 's', 'l', '.', 'g', 'o', 'o', 'g', 'l', 'e', '-', 'a', 'n', 'a', 'l', 'y', 't', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
   /* "ssl.md", true */ 's', 's', 'l', '.', 'm', 'd', '\0',
   /* "ssl247.co.uk", true */ 's', 's', 'l', '2', '4', '7', '.', 'c', 'o', '.', 'u', 'k', '\0',
@@ -11273,16 +11272,17 @@ static const char kSTSHostTable[] = {
   /* "sysctl.se", false */ 's', 'y', 's', 'c', 't', 'l', '.', 's', 'e', '\0',
   /* "sysdb.io", true */ 's', 'y', 's', 'd', 'b', '.', 'i', 'o', '\0',
   /* "sysert.tv", true */ 's', 'y', 's', 'e', 'r', 't', '.', 't', 'v', '\0',
   /* "sysmike.de", true */ 's', 'y', 's', 'm', 'i', 'k', 'e', '.', 'd', 'e', '\0',
   /* "sysmike.net", true */ 's', 'y', 's', 'm', 'i', 'k', 'e', '.', 'n', 'e', 't', '\0',
   /* "syss.de", true */ 's', 'y', 's', 's', '.', 'd', 'e', '\0',
   /* "system.is", true */ 's', 'y', 's', 't', 'e', 'm', '.', 'i', 's', '\0',
   /* "systemintegra.ru", true */ 's', 'y', 's', 't', 'e', 'm', 'i', 'n', 't', 'e', 'g', 'r', 'a', '.', 'r', 'u', '\0',
+  /* "systemreboot.net", true */ 's', 'y', 's', 't', 'e', 'm', 'r', 'e', 'b', 'o', 'o', 't', '.', 'n', 'e', 't', '\0',
   /* "syzygy-tables.info", true */ 's', 'y', 'z', 'y', 'g', 'y', '-', 't', 'a', 'b', 'l', 'e', 's', '.', 'i', 'n', 'f', 'o', '\0',
   /* "szagun.net", true */ 's', 'z', 'a', 'g', 'u', 'n', '.', 'n', 'e', 't', '\0',
   /* "szamitogepdepo.com", true */ 's', 'z', 'a', 'm', 'i', 't', 'o', 'g', 'e', 'p', 'd', 'e', 'p', 'o', '.', 'c', 'o', 'm', '\0',
   /* "szechenyi2020.hu", true */ 's', 'z', 'e', 'c', 'h', 'e', 'n', 'y', 'i', '2', '0', '2', '0', '.', 'h', 'u', '\0',
   /* "szentistvanpt.sk", true */ 's', 'z', 'e', 'n', 't', 'i', 's', 't', 'v', 'a', 'n', 'p', 't', '.', 's', 'k', '\0',
   /* "szongott.net", true */ 's', 'z', 'o', 'n', 'g', 'o', 't', 't', '.', 'n', 'e', 't', '\0',
   /* "t-complex.space", true */ 't', '-', 'c', 'o', 'm', 'p', 'l', 'e', 'x', '.', 's', 'p', 'a', 'c', 'e', '\0',
   /* "t-hawk.com", true */ 't', '-', 'h', 'a', 'w', 'k', '.', 'c', 'o', 'm', '\0',
@@ -11423,22 +11423,22 @@ static const char kSTSHostTable[] = {
   /* "technogroup.cz", true */ 't', 'e', 'c', 'h', 'n', 'o', 'g', 'r', 'o', 'u', 'p', '.', 'c', 'z', '\0',
   /* "technoparcepsilon.fr", true */ 't', 'e', 'c', 'h', 'n', 'o', 'p', 'a', 'r', 'c', 'e', 'p', 's', 'i', 'l', 'o', 'n', '.', 'f', 'r', '\0',
   /* "technotonic.com.au", false */ 't', 'e', 'c', 'h', 'n', 'o', 't', 'o', 'n', 'i', 'c', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "techold.ru", true */ 't', 'e', 'c', 'h', 'o', 'l', 'd', '.', 'r', 'u', '\0',
   /* "techorbiter.com", true */ 't', 'e', 'c', 'h', 'o', 'r', 'b', 'i', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "techpivot.net", true */ 't', 'e', 'c', 'h', 'p', 'i', 'v', 'o', 't', '.', 'n', 'e', 't', '\0',
   /* "techpointed.com", true */ 't', 'e', 'c', 'h', 'p', 'o', 'i', 'n', 't', 'e', 'd', '.', 'c', 'o', 'm', '\0',
   /* "techtalks.no", true */ 't', 'e', 'c', 'h', 't', 'a', 'l', 'k', 's', '.', 'n', 'o', '\0',
+  /* "techvalue.gr", true */ 't', 'e', 'c', 'h', 'v', 'a', 'l', 'u', 'e', '.', 'g', 'r', '\0',
   /* "techwords.io", true */ 't', 'e', 'c', 'h', 'w', 'o', 'r', 'd', 's', '.', 'i', 'o', '\0',
   /* "tecnogaming.com", true */ 't', 'e', 'c', 'n', 'o', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "tecture.de", true */ 't', 'e', 'c', 't', 'u', 'r', 'e', '.', 'd', 'e', '\0',
   /* "teddy.ch", true */ 't', 'e', 'd', 'd', 'y', '.', 'c', 'h', '\0',
   /* "tedeh.net", true */ 't', 'e', 'd', 'e', 'h', '.', 'n', 'e', 't', '\0',
-  /* "tedovo.com", true */ 't', 'e', 'd', 'o', 'v', 'o', '.', 'c', 'o', 'm', '\0',
   /* "teebeedee.org", true */ 't', 'e', 'e', 'b', 'e', 'e', 'd', 'e', 'e', '.', 'o', 'r', 'g', '\0',
   /* "teemo.gg", true */ 't', 'e', 'e', 'm', 'o', '.', 'g', 'g', '\0',
   /* "teemperor.de", true */ 't', 'e', 'e', 'm', 'p', 'e', 'r', 'o', 'r', '.', 'd', 'e', '\0',
   /* "tege-elektronik.hu", true */ 't', 'e', 'g', 'e', '-', 'e', 'l', 'e', 'k', 't', 'r', 'o', 'n', 'i', 'k', '.', 'h', 'u', '\0',
   /* "tehotuotanto.net", true */ 't', 'e', 'h', 'o', 't', 'u', 'o', 't', 'a', 'n', 't', 'o', '.', 'n', 'e', 't', '\0',
   /* "tehrabbitt.com", false */ 't', 'e', 'h', 'r', 'a', 'b', 'b', 'i', 't', 't', '.', 'c', 'o', 'm', '\0',
   /* "teknologi.or.id", true */ 't', 'e', 'k', 'n', 'o', 'l', 'o', 'g', 'i', '.', 'o', 'r', '.', 'i', 'd', '\0',
   /* "tektoria.de", false */ 't', 'e', 'k', 't', 'o', 'r', 'i', 'a', '.', 'd', 'e', '\0',
@@ -11466,17 +11466,16 @@ static const char kSTSHostTable[] = {
   /* "tensei-slime.com", true */ 't', 'e', 'n', 's', 'e', 'i', '-', 's', 'l', 'i', 'm', 'e', '.', 'c', 'o', 'm', '\0',
   /* "tenshoku-hanashi.com", true */ 't', 'e', 'n', 's', 'h', 'o', 'k', 'u', '-', 'h', 'a', 'n', 'a', 's', 'h', 'i', '.', 'c', 'o', 'm', '\0',
   /* "tent.io", true */ 't', 'e', 'n', 't', '.', 'i', 'o', '\0',
   /* "tenta.com", true */ 't', 'e', 'n', 't', 'a', '.', 'c', 'o', 'm', '\0',
   /* "tentations-voyages.com", true */ 't', 'e', 'n', 't', 'a', 't', 'i', 'o', 'n', 's', '-', 'v', 'o', 'y', 'a', 'g', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "tenyx.de", true */ 't', 'e', 'n', 'y', 'x', '.', 'd', 'e', '\0',
   /* "teos.online", true */ 't', 'e', 'o', 's', '.', 'o', 'n', 'l', 'i', 'n', 'e', '\0',
   /* "teoskanta.fi", true */ 't', 'e', 'o', 's', 'k', 'a', 'n', 't', 'a', '.', 'f', 'i', '\0',
-  /* "tepid.org", true */ 't', 'e', 'p', 'i', 'd', '.', 'o', 'r', 'g', '\0',
   /* "teracloud.at", true */ 't', 'e', 'r', 'a', 'c', 'l', 'o', 'u', 'd', '.', 'a', 't', '\0',
   /* "teriiphotography.com", true */ 't', 'e', 'r', 'i', 'i', 'p', 'h', 'o', 't', 'o', 'g', 'r', 'a', 'p', 'h', 'y', '.', 'c', 'o', 'm', '\0',
   /* "terrab.de", true */ 't', 'e', 'r', 'r', 'a', 'b', '.', 'd', 'e', '\0',
   /* "terracloud.de", true */ 't', 'e', 'r', 'r', 'a', 'c', 'l', 'o', 'u', 'd', '.', 'd', 'e', '\0',
   /* "terraelectronica.ru", true */ 't', 'e', 'r', 'r', 'a', 'e', 'l', 'e', 'c', 't', 'r', 'o', 'n', 'i', 'c', 'a', '.', 'r', 'u', '\0',
   /* "terraform.io", true */ 't', 'e', 'r', 'r', 'a', 'f', 'o', 'r', 'm', '.', 'i', 'o', '\0',
   /* "terragni-sarasin.ch", true */ 't', 'e', 'r', 'r', 'a', 'g', 'n', 'i', '-', 's', 'a', 'r', 'a', 's', 'i', 'n', '.', 'c', 'h', '\0',
   /* "terrastaffinggroup.com", false */ 't', 'e', 'r', 'r', 'a', 's', 't', 'a', 'f', 'f', 'i', 'n', 'g', 'g', 'r', 'o', 'u', 'p', '.', 'c', 'o', 'm', '\0',
@@ -11624,16 +11623,17 @@ static const char kSTSHostTable[] = {
   /* "theunitedstates.io", true */ 't', 'h', 'e', 'u', 'n', 'i', 't', 'e', 'd', 's', 't', 'a', 't', 'e', 's', '.', 'i', 'o', '\0',
   /* "theweilai.com", false */ 't', 'h', 'e', 'w', 'e', 'i', 'l', 'a', 'i', '.', 'c', 'o', 'm', '\0',
   /* "thewhitehat.club", true */ 't', 'h', 'e', 'w', 'h', 'i', 't', 'e', 'h', 'a', 't', '.', 'c', 'l', 'u', 'b', '\0',
   /* "thewhiterabbit.space", true */ 't', 'h', 'e', 'w', 'h', 'i', 't', 'e', 'r', 'a', 'b', 'b', 'i', 't', '.', 's', 'p', 'a', 'c', 'e', '\0',
   /* "thewindow.com", true */ 't', 'h', 'e', 'w', 'i', 'n', 'd', 'o', 'w', '.', 'c', 'o', 'm', '\0',
   /* "thewoodkid.com.au", true */ 't', 'h', 'e', 'w', 'o', 'o', 'd', 'k', 'i', 'd', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "theworldsend.eu", true */ 't', 'h', 'e', 'w', 'o', 'r', 'l', 'd', 's', 'e', 'n', 'd', '.', 'e', 'u', '\0',
   /* "thexme.de", true */ 't', 'h', 'e', 'x', 'm', 'e', '.', 'd', 'e', '\0',
+  /* "theyosh.nl", true */ 't', 'h', 'e', 'y', 'o', 's', 'h', '.', 'n', 'l', '\0',
   /* "thezero.org", true */ 't', 'h', 'e', 'z', 'e', 'r', 'o', '.', 'o', 'r', 'g', '\0',
   /* "thibautcharles.net", true */ 't', 'h', 'i', 'b', 'a', 'u', 't', 'c', 'h', 'a', 'r', 'l', 'e', 's', '.', 'n', 'e', 't', '\0',
   /* "thierryhayoz.ch", true */ 't', 'h', 'i', 'e', 'r', 'r', 'y', 'h', 'a', 'y', 'o', 'z', '.', 'c', 'h', '\0',
   /* "thingies.site", true */ 't', 'h', 'i', 'n', 'g', 'i', 'e', 's', '.', 's', 'i', 't', 'e', '\0',
   /* "thinkcash.nl", true */ 't', 'h', 'i', 'n', 'k', 'c', 'a', 's', 'h', '.', 'n', 'l', '\0',
   /* "thinkdo.jp", true */ 't', 'h', 'i', 'n', 'k', 'd', 'o', '.', 'j', 'p', '\0',
   /* "thinkindifferent.net", true */ 't', 'h', 'i', 'n', 'k', 'i', 'n', 'd', 'i', 'f', 'f', 'e', 'r', 'e', 'n', 't', '.', 'n', 'e', 't', '\0',
   /* "thinklikeanentrepreneur.com", true */ 't', 'h', 'i', 'n', 'k', 'l', 'i', 'k', 'e', 'a', 'n', 'e', 'n', 't', 'r', 'e', 'p', 'r', 'e', 'n', 'e', 'u', 'r', '.', 'c', 'o', 'm', '\0',
@@ -11679,16 +11679,17 @@ static const char kSTSHostTable[] = {
   /* "thundr.eu", true */ 't', 'h', 'u', 'n', 'd', 'r', '.', 'e', 'u', '\0',
   /* "thusoy.com", true */ 't', 'h', 'u', 's', 'o', 'y', '.', 'c', 'o', 'm', '\0',
   /* "thyngster.com", false */ 't', 'h', 'y', 'n', 'g', 's', 't', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "thynx.io", true */ 't', 'h', 'y', 'n', 'x', '.', 'i', 'o', '\0',
   /* "ti-pla.net", true */ 't', 'i', '-', 'p', 'l', 'a', '.', 'n', 'e', 't', '\0',
   /* "ti.blog.br", true */ 't', 'i', '.', 'b', 'l', 'o', 'g', '.', 'b', 'r', '\0',
   /* "tiacollection.com", true */ 't', 'i', 'a', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "tianshili.me", true */ 't', 'i', 'a', 'n', 's', 'h', 'i', 'l', 'i', '.', 'm', 'e', '\0',
+  /* "tibbitshall.ca", true */ 't', 'i', 'b', 'b', 'i', 't', 's', 'h', 'a', 'l', 'l', '.', 'c', 'a', '\0',
   /* "ticfleet.com", true */ 't', 'i', 'c', 'f', 'l', 'e', 'e', 't', '.', 'c', 'o', 'm', '\0',
   /* "ticketmates.com.au", true */ 't', 'i', 'c', 'k', 'e', 't', 'm', 'a', 't', 'e', 's', '.', 'c', 'o', 'm', '.', 'a', 'u', '\0',
   /* "ticketoplichting.nl", true */ 't', 'i', 'c', 'k', 'e', 't', 'o', 'p', 'l', 'i', 'c', 'h', 't', 'i', 'n', 'g', '.', 'n', 'l', '\0',
   /* "tickettoaster.de", true */ 't', 'i', 'c', 'k', 'e', 't', 't', 'o', 'a', 's', 't', 'e', 'r', '.', 'd', 'e', '\0',
   /* "tid.jp", true */ 't', 'i', 'd', '.', 'j', 'p', '\0',
   /* "tidmore.us", true */ 't', 'i', 'd', 'm', 'o', 'r', 'e', '.', 'u', 's', '\0',
   /* "tidycustoms.net", true */ 't', 'i', 'd', 'y', 'c', 'u', 's', 't', 'o', 'm', 's', '.', 'n', 'e', 't', '\0',
   /* "tiendavertigo.com", true */ 't', 'i', 'e', 'n', 'd', 'a', 'v', 'e', 'r', 't', 'i', 'g', 'o', '.', 'c', 'o', 'm', '\0',
@@ -11748,17 +11749,16 @@ static const char kSTSHostTable[] = {
   /* "tjs.me", true */ 't', 'j', 's', '.', 'm', 'e', '\0',
   /* "tkat.ch", true */ 't', 'k', 'a', 't', '.', 'c', 'h', '\0',
   /* "tlach.cz", true */ 't', 'l', 'a', 'c', 'h', '.', 'c', 'z', '\0',
   /* "tlo.link", true */ 't', 'l', 'o', '.', 'l', 'i', 'n', 'k', '\0',
   /* "tlo.xyz", true */ 't', 'l', 'o', '.', 'x', 'y', 'z', '\0',
   /* "tls.builders", true */ 't', 'l', 's', '.', 'b', 'u', 'i', 'l', 'd', 'e', 'r', 's', '\0',
   /* "tls.care", true */ 't', 'l', 's', '.', 'c', 'a', 'r', 'e', '\0',
   /* "tls1914.org", true */ 't', 'l', 's', '1', '9', '1', '4', '.', 'o', 'r', 'g', '\0',
-  /* "tmaward.net", true */ 't', 'm', 'a', 'w', 'a', 'r', 'd', '.', 'n', 'e', 't', '\0',
   /* "tmf.ru", true */ 't', 'm', 'f', '.', 'r', 'u', '\0',
   /* "tmi-products.eu", true */ 't', 'm', 'i', '-', 'p', 'r', 'o', 'd', 'u', 'c', 't', 's', '.', 'e', 'u', '\0',
   /* "tmi-produkter.se", true */ 't', 'm', 'i', '-', 'p', 'r', 'o', 'd', 'u', 'k', 't', 'e', 'r', '.', 's', 'e', '\0',
   /* "tmitchell.io", true */ 't', 'm', 'i', 't', 'c', 'h', 'e', 'l', 'l', '.', 'i', 'o', '\0',
   /* "tmm.cx", true */ 't', 'm', 'm', '.', 'c', 'x', '\0',
   /* "tmpraider.net", true */ 't', 'm', 'p', 'r', 'a', 'i', 'd', 'e', 'r', '.', 'n', 'e', 't', '\0',
   /* "tmpsantos.com.br", true */ 't', 'm', 'p', 's', 'a', 'n', 't', 'o', 's', '.', 'c', 'o', 'm', '.', 'b', 'r', '\0',
   /* "tmtopup.com", true */ 't', 'm', 't', 'o', 'p', 'u', 'p', '.', 'c', 'o', 'm', '\0',
@@ -12058,17 +12058,16 @@ static const char kSTSHostTable[] = {
   /* "turtle.ai", true */ 't', 'u', 'r', 't', 'l', 'e', '.', 'a', 'i', '\0',
   /* "turtleduckstudios.com", true */ 't', 'u', 'r', 't', 'l', 'e', 'd', 'u', 'c', 'k', 's', 't', 'u', 'd', 'i', 'o', 's', '.', 'c', 'o', 'm', '\0',
   /* "tuxcall.de", true */ 't', 'u', 'x', 'c', 'a', 'l', 'l', '.', 'd', 'e', '\0',
   /* "tuxcloud.net", true */ 't', 'u', 'x', 'c', 'l', 'o', 'u', 'd', '.', 'n', 'e', 't', '\0',
   /* "tuxflow.de", true */ 't', 'u', 'x', 'f', 'l', 'o', 'w', '.', 'd', 'e', '\0',
   /* "tuxgeo.com", false */ 't', 'u', 'x', 'g', 'e', 'o', '.', 'c', 'o', 'm', '\0',
   /* "tuxie.com", true */ 't', 'u', 'x', 'i', 'e', '.', 'c', 'o', 'm', '\0',
   /* "tuxplace.nl", true */ 't', 'u', 'x', 'p', 'l', 'a', 'c', 'e', '.', 'n', 'l', '\0',
-  /* "tuxz.net", true */ 't', 'u', 'x', 'z', '.', 'n', 'e', 't', '\0',
   /* "tuzaijidi.com", true */ 't', 'u', 'z', 'a', 'i', 'j', 'i', 'd', 'i', '.', 'c', 'o', 'm', '\0',
   /* "tv2vie.org", true */ 't', 'v', '2', 'v', 'i', 'e', '.', 'o', 'r', 'g', '\0',
   /* "tvbeugels.nl", true */ 't', 'v', 'b', 'e', 'u', 'g', 'e', 'l', 's', '.', 'n', 'l', '\0',
   /* "tw.search.yahoo.com", false */ 't', 'w', '.', 's', 'e', 'a', 'r', 'c', 'h', '.', 'y', 'a', 'h', 'o', 'o', '.', 'c', 'o', 'm', '\0',
   /* "twaka.com", true */ 't', 'w', 'a', 'k', 'a', '.', 'c', 'o', 'm', '\0',
   /* "twd2.me", true */ 't', 'w', 'd', '2', '.', 'm', 'e', '\0',
   /* "twd2.net", false */ 't', 'w', 'd', '2', '.', 'n', 'e', 't', '\0',
   /* "tweakers.net", true */ 't', 'w', 'e', 'a', 'k', 'e', 'r', 's', '.', 'n', 'e', 't', '\0',
@@ -12298,16 +12297,17 @@ static const char kSTSHostTable[] = {
   /* "v0tti.com", false */ 'v', '0', 't', 't', 'i', '.', 'c', 'o', 'm', '\0',
   /* "v2.pw", true */ 'v', '2', '.', 'p', 'w', '\0',
   /* "v2ex.com", true */ 'v', '2', 'e', 'x', '.', 'c', 'o', 'm', '\0',
   /* "v4veedu.com", true */ 'v', '4', 'v', 'e', 'e', 'd', 'u', '.', 'c', 'o', 'm', '\0',
   /* "va-reitartikel.com", true */ 'v', 'a', '-', 'r', 'e', 'i', 't', 'a', 'r', 't', 'i', 'k', 'e', 'l', '.', 'c', 'o', 'm', '\0',
   /* "vagrantup.com", true */ 'v', 'a', 'g', 'r', 'a', 'n', 't', 'u', 'p', '.', 'c', 'o', 'm', '\0',
   /* "vakuutuskanava.fi", true */ 'v', 'a', 'k', 'u', 'u', 't', 'u', 's', 'k', 'a', 'n', 'a', 'v', 'a', '.', 'f', 'i', '\0',
   /* "val-sec.com", true */ 'v', 'a', 'l', '-', 's', 'e', 'c', '.', 'c', 'o', 'm', '\0',
+  /* "valasi.eu", true */ 'v', 'a', 'l', 'a', 's', 'i', '.', 'e', 'u', '\0',
   /* "valbonne-consulting.com", true */ 'v', 'a', 'l', 'b', 'o', 'n', 'n', 'e', '-', 'c', 'o', 'n', 's', 'u', 'l', 't', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "valentin-sundermann.de", true */ 'v', 'a', 'l', 'e', 'n', 't', 'i', 'n', '-', 's', 'u', 'n', 'd', 'e', 'r', 'm', 'a', 'n', 'n', '.', 'd', 'e', '\0',
   /* "validator.nu", true */ 'v', 'a', 'l', 'i', 'd', 'a', 't', 'o', 'r', '.', 'n', 'u', '\0',
   /* "validbrands.com", true */ 'v', 'a', 'l', 'i', 'd', 'b', 'r', 'a', 'n', 'd', 's', '.', 'c', 'o', 'm', '\0',
   /* "valitron.se", true */ 'v', 'a', 'l', 'i', 't', 'r', 'o', 'n', '.', 's', 'e', '\0',
   /* "valkohattu.fi", true */ 'v', 'a', 'l', 'k', 'o', 'h', 'a', 't', 't', 'u', '.', 'f', 'i', '\0',
   /* "valmagus.com", false */ 'v', 'a', 'l', 'm', 'a', 'g', 'u', 's', '.', 'c', 'o', 'm', '\0',
   /* "valokuva-albumi.fi", true */ 'v', 'a', 'l', 'o', 'k', 'u', 'v', 'a', '-', 'a', 'l', 'b', 'u', 'm', 'i', '.', 'f', 'i', '\0',
@@ -12322,16 +12322,17 @@ static const char kSTSHostTable[] = {
   /* "vandalfsen.me", true */ 'v', 'a', 'n', 'd', 'a', 'l', 'f', 's', 'e', 'n', '.', 'm', 'e', '\0',
   /* "vande-walle.eu", true */ 'v', 'a', 'n', 'd', 'e', '-', 'w', 'a', 'l', 'l', 'e', '.', 'e', 'u', '\0',
   /* "vanderziel.org", true */ 'v', 'a', 'n', 'd', 'e', 'r', 'z', 'i', 'e', 'l', '.', 'o', 'r', 'g', '\0',
   /* "vanestack.com", true */ 'v', 'a', 'n', 'e', 's', 't', 'a', 'c', 'k', '.', 'c', 'o', 'm', '\0',
   /* "vangeluwedeberlaere.be", true */ 'v', 'a', 'n', 'g', 'e', 'l', 'u', 'w', 'e', 'd', 'e', 'b', 'e', 'r', 'l', 'a', 'e', 'r', 'e', '.', 'b', 'e', '\0',
   /* "vanhoutte.be", false */ 'v', 'a', 'n', 'h', 'o', 'u', 't', 't', 'e', '.', 'b', 'e', '\0',
   /* "vanlaanen.com", false */ 'v', 'a', 'n', 'l', 'a', 'a', 'n', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "vanmalland.com", true */ 'v', 'a', 'n', 'm', 'a', 'l', 'l', 'a', 'n', 'd', '.', 'c', 'o', 'm', '\0',
+  /* "vantien.com", true */ 'v', 'a', 'n', 't', 'i', 'e', 'n', '.', 'c', 'o', 'm', '\0',
   /* "vantru.is", true */ 'v', 'a', 'n', 't', 'r', 'u', '.', 'i', 's', '\0',
   /* "vanwunnik.com", true */ 'v', 'a', 'n', 'w', 'u', 'n', 'n', 'i', 'k', '.', 'c', 'o', 'm', '\0',
   /* "vapemania.eu", true */ 'v', 'a', 'p', 'e', 'm', 'a', 'n', 'i', 'a', '.', 'e', 'u', '\0',
   /* "vapordepot.jp", false */ 'v', 'a', 'p', 'o', 'r', 'd', 'e', 'p', 'o', 't', '.', 'j', 'p', '\0',
   /* "varden.info", true */ 'v', 'a', 'r', 'd', 'e', 'n', '.', 'i', 'n', 'f', 'o', '\0',
   /* "varghese.de", true */ 'v', 'a', 'r', 'g', 'h', 'e', 's', 'e', '.', 'd', 'e', '\0',
   /* "variag-group.ru", true */ 'v', 'a', 'r', 'i', 'a', 'g', '-', 'g', 'r', 'o', 'u', 'p', '.', 'r', 'u', '\0',
   /* "varicoseveinssolution.com", true */ 'v', 'a', 'r', 'i', 'c', 'o', 's', 'e', 'v', 'e', 'i', 'n', 's', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', '.', 'c', 'o', 'm', '\0',
@@ -12575,22 +12576,23 @@ static const char kSTSHostTable[] = {
   /* "wangql.net", true */ 'w', 'a', 'n', 'g', 'q', 'l', '.', 'n', 'e', 't', '\0',
   /* "wanybug.cn", true */ 'w', 'a', 'n', 'y', 'b', 'u', 'g', '.', 'c', 'n', '\0',
   /* "warehost.de", true */ 'w', 'a', 'r', 'e', 'h', 'o', 's', 't', '.', 'd', 'e', '\0',
   /* "warekon.com", true */ 'w', 'a', 'r', 'e', 'k', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "warekon.dk", true */ 'w', 'a', 'r', 'e', 'k', 'o', 'n', '.', 'd', 'k', '\0',
   /* "warhaggis.com", true */ 'w', 'a', 'r', 'h', 'a', 'g', 'g', 'i', 's', '.', 'c', 'o', 'm', '\0',
   /* "warmservers.com", true */ 'w', 'a', 'r', 'm', 's', 'e', 'r', 'v', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "warr.ath.cx", true */ 'w', 'a', 'r', 'r', '.', 'a', 't', 'h', '.', 'c', 'x', '\0',
-  /* "warrencreative.com", false */ 'w', 'a', 'r', 'r', 'e', 'n', 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0',
+  /* "warrencreative.com", true */ 'w', 'a', 'r', 'r', 'e', 'n', 'c', 'r', 'e', 'a', 't', 'i', 'v', 'e', '.', 'c', 'o', 'm', '\0',
   /* "warsentech.com", true */ 'w', 'a', 'r', 's', 'e', 'n', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0',
   /* "warsh.moe", true */ 'w', 'a', 'r', 's', 'h', '.', 'm', 'o', 'e', '\0',
   /* "wartorngalaxy.com", true */ 'w', 'a', 'r', 't', 'o', 'r', 'n', 'g', 'a', 'l', 'a', 'x', 'y', '.', 'c', 'o', 'm', '\0',
   /* "wasema.com", true */ 'w', 'a', 's', 'e', 'm', 'a', '.', 'c', 'o', 'm', '\0',
   /* "washingtonviews.com", true */ 'w', 'a', 's', 'h', 'i', 'n', 'g', 't', 'o', 'n', 'v', 'i', 'e', 'w', 's', '.', 'c', 'o', 'm', '\0',
+  /* "wasserspucker.de", true */ 'w', 'a', 's', 's', 'e', 'r', 's', 'p', 'u', 'c', 'k', 'e', 'r', '.', 'd', 'e', '\0',
   /* "watchface.watch", true */ 'w', 'a', 't', 'c', 'h', 'f', 'a', 'c', 'e', '.', 'w', 'a', 't', 'c', 'h', '\0',
   /* "watchinventory.com", true */ 'w', 'a', 't', 'c', 'h', 'i', 'n', 'v', 'e', 'n', 't', 'o', 'r', 'y', '.', 'c', 'o', 'm', '\0',
   /* "watchstyle.com", true */ 'w', 'a', 't', 'c', 'h', 's', 't', 'y', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "waterfedpole.com", true */ 'w', 'a', 't', 'e', 'r', 'f', 'e', 'd', 'p', 'o', 'l', 'e', '.', 'c', 'o', 'm', '\0',
   /* "waterforlife.net.au", true */ 'w', 'a', 't', 'e', 'r', 'f', 'o', 'r', 'l', 'i', 'f', 'e', '.', 'n', 'e', 't', '.', 'a', 'u', '\0',
   /* "watersb.org", true */ 'w', 'a', 't', 'e', 'r', 's', 'b', '.', 'o', 'r', 'g', '\0',
   /* "watertrails.io", true */ 'w', 'a', 't', 'e', 'r', 't', 'r', 'a', 'i', 'l', 's', '.', 'i', 'o', '\0',
   /* "wavefrontsystemstech.com", true */ 'w', 'a', 'v', 'e', 'f', 'r', 'o', 'n', 't', 's', 'y', 's', 't', 'e', 'm', 's', 't', 'e', 'c', 'h', '.', 'c', 'o', 'm', '\0',
@@ -12759,17 +12761,16 @@ static const char kSTSHostTable[] = {
   /* "whatismyipaddress.ca", true */ 'w', 'h', 'a', 't', 'i', 's', 'm', 'y', 'i', 'p', 'a', 'd', 'd', 'r', 'e', 's', 's', '.', 'c', 'a', '\0',
   /* "whatnext.limited", true */ 'w', 'h', 'a', 't', 'n', 'e', 'x', 't', '.', 'l', 'i', 'm', 'i', 't', 'e', 'd', '\0',
   /* "whatsapp.com", true */ 'w', 'h', 'a', 't', 's', 'a', 'p', 'p', '.', 'c', 'o', 'm', '\0',
   /* "whatsmychaincert.com", true */ 'w', 'h', 'a', 't', 's', 'm', 'y', 'c', 'h', 'a', 'i', 'n', 'c', 'e', 'r', 't', '.', 'c', 'o', 'm', '\0',
   /* "whatsupgold.com.tw", true */ 'w', 'h', 'a', 't', 's', 'u', 'p', 'g', 'o', 'l', 'd', '.', 'c', 'o', 'm', '.', 't', 'w', '\0',
   /* "whatwebcando.today", true */ 'w', 'h', 'a', 't', 'w', 'e', 'b', 'c', 'a', 'n', 'd', 'o', '.', 't', 'o', 'd', 'a', 'y', '\0',
   /* "whatwg.org", true */ 'w', 'h', 'a', 't', 'w', 'g', '.', 'o', 'r', 'g', '\0',
   /* "whd-guide.de", true */ 'w', 'h', 'd', '-', 'g', 'u', 'i', 'd', 'e', '.', 'd', 'e', '\0',
-  /* "wheeler.kiwi.nz", true */ 'w', 'h', 'e', 'e', 'l', 'e', 'r', '.', 'k', 'i', 'w', 'i', '.', 'n', 'z', '\0',
   /* "when-release.ru", false */ 'w', 'h', 'e', 'n', '-', 'r', 'e', 'l', 'e', 'a', 's', 'e', '.', 'r', 'u', '\0',
   /* "when.fm", true */ 'w', 'h', 'e', 'n', '.', 'f', 'm', '\0',
   /* "where2trip.com", true */ 'w', 'h', 'e', 'r', 'e', '2', 't', 'r', 'i', 'p', '.', 'c', 'o', 'm', '\0',
   /* "whereisjason.com", true */ 'w', 'h', 'e', 'r', 'e', 'i', 's', 'j', 'a', 's', 'o', 'n', '.', 'c', 'o', 'm', '\0',
   /* "wherephoto.com", false */ 'w', 'h', 'e', 'r', 'e', 'p', 'h', 'o', 't', 'o', '.', 'c', 'o', 'm', '\0',
   /* "whey-protein.ch", true */ 'w', 'h', 'e', 'y', '-', 'p', 'r', 'o', 't', 'e', 'i', 'n', '.', 'c', 'h', '\0',
   /* "whing.org", true */ 'w', 'h', 'i', 'n', 'g', '.', 'o', 'r', 'g', '\0',
   /* "whisker.network", true */ 'w', 'h', 'i', 's', 'k', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '\0',
@@ -12822,17 +12823,16 @@ static const char kSTSHostTable[] = {
   /* "wildbee.org", true */ 'w', 'i', 'l', 'd', 'b', 'e', 'e', '.', 'o', 'r', 'g', '\0',
   /* "wilddog.com", true */ 'w', 'i', 'l', 'd', 'd', 'o', 'g', '.', 'c', 'o', 'm', '\0',
   /* "willberg.bayern", true */ 'w', 'i', 'l', 'l', 'b', 'e', 'r', 'g', '.', 'b', 'a', 'y', 'e', 'r', 'n', '\0',
   /* "willcipriano.com", true */ 'w', 'i', 'l', 'l', 'c', 'i', 'p', 'r', 'i', 'a', 'n', 'o', '.', 'c', 'o', 'm', '\0',
   /* "willi-graf-gymnasium.de", true */ 'w', 'i', 'l', 'l', 'i', '-', 'g', 'r', 'a', 'f', '-', 'g', 'y', 'm', 'n', 'a', 's', 'i', 'u', 'm', '.', 'd', 'e', '\0',
   /* "willi-graf-os.de", true */ 'w', 'i', 'l', 'l', 'i', '-', 'g', 'r', 'a', 'f', '-', 'o', 's', '.', 'd', 'e', '\0',
   /* "williamfeely.info", true */ 'w', 'i', 'l', 'l', 'i', 'a', 'm', 'f', 'e', 'e', 'l', 'y', '.', 'i', 'n', 'f', 'o', '\0',
   /* "williamsapiens.com", true */ 'w', 'i', 'l', 'l', 'i', 'a', 'm', 's', 'a', 'p', 'i', 'e', 'n', 's', '.', 'c', 'o', 'm', '\0',
-  /* "williamsonshore.com", true */ 'w', 'i', 'l', 'l', 'i', 'a', 'm', 's', 'o', 'n', 's', 'h', 'o', 'r', 'e', '.', 'c', 'o', 'm', '\0',
   /* "willnorris.com", true */ 'w', 'i', 'l', 'l', 'n', 'o', 'r', 'r', 'i', 's', '.', 'c', 'o', 'm', '\0',
   /* "wills.co.tt", true */ 'w', 'i', 'l', 'l', 's', '.', 'c', 'o', '.', 't', 't', '\0',
   /* "wilsonovi.com", true */ 'w', 'i', 'l', 's', 'o', 'n', 'o', 'v', 'i', '.', 'c', 'o', 'm', '\0',
   /* "wimake.solutions", true */ 'w', 'i', 'm', 'a', 'k', 'e', '.', 's', 'o', 'l', 'u', 't', 'i', 'o', 'n', 's', '\0',
   /* "winaes.com", true */ 'w', 'i', 'n', 'a', 'e', 's', '.', 'c', 'o', 'm', '\0',
   /* "wind.moe", true */ 'w', 'i', 'n', 'd', '.', 'm', 'o', 'e', '\0',
   /* "windhaven.nl", true */ 'w', 'i', 'n', 'd', 'h', 'a', 'v', 'e', 'n', '.', 'n', 'l', '\0',
   /* "windrunner.se", true */ 'w', 'i', 'n', 'd', 'r', 'u', 'n', 'n', 'e', 'r', '.', 's', 'e', '\0',
@@ -13141,16 +13141,17 @@ static const char kSTSHostTable[] = {
   /* "xps2pdf.co.uk", true */ 'x', 'p', 's', '2', 'p', 'd', 'f', '.', 'c', 'o', '.', 'u', 'k', '\0',
   /* "xqin.net", true */ 'x', 'q', 'i', 'n', '.', 'n', 'e', 't', '\0',
   /* "xrippedhd.com", true */ 'x', 'r', 'i', 'p', 'p', 'e', 'd', 'h', 'd', '.', 'c', 'o', 'm', '\0',
   /* "xrockx.de", true */ 'x', 'r', 'o', 'c', 'k', 'x', '.', 'd', 'e', '\0',
   /* "xroot.org", true */ 'x', 'r', 'o', 'o', 't', '.', 'o', 'r', 'g', '\0',
   /* "xscapers.com", true */ 'x', 's', 'c', 'a', 'p', 'e', 'r', 's', '.', 'c', 'o', 'm', '\0',
   /* "xss.ht", true */ 'x', 's', 's', '.', 'h', 't', '\0',
   /* "xss.sk", true */ 'x', 's', 's', '.', 's', 'k', '\0',
+  /* "xtremegaming.it", true */ 'x', 't', 'r', 'e', 'm', 'e', 'g', 'a', 'm', 'i', 'n', 'g', '.', 'i', 't', '\0',
   /* "xtrim.ru", true */ 'x', 't', 'r', 'i', 'm', '.', 'r', 'u', '\0',
   /* "xtronics.com", true */ 'x', 't', 'r', 'o', 'n', 'i', 'c', 's', '.', 'c', 'o', 'm', '\0',
   /* "xuc.me", true */ 'x', 'u', 'c', '.', 'm', 'e', '\0',
   /* "xuexb.com", true */ 'x', 'u', 'e', 'x', 'b', '.', 'c', 'o', 'm', '\0',
   /* "xunn.io", true */ 'x', 'u', 'n', 'n', '.', 'i', 'o', '\0',
   /* "xuntier.ch", true */ 'x', 'u', 'n', 't', 'i', 'e', 'r', '.', 'c', 'h', '\0',
   /* "xuyh0120.win", true */ 'x', 'u', 'y', 'h', '0', '1', '2', '0', '.', 'w', 'i', 'n', '\0',
   /* "xwalck.se", true */ 'x', 'w', 'a', 'l', 'c', 'k', '.', 's', 'e', '\0',
@@ -13290,26 +13291,26 @@ static const char kSTSHostTable[] = {
   /* "zaufanatrzeciastrona.pl", true */ 'z', 'a', 'u', 'f', 'a', 'n', 'a', 't', 'r', 'z', 'e', 'c', 'i', 'a', 's', 't', 'r', 'o', 'n', 'a', '.', 'p', 'l', '\0',
   /* "zberger.com", true */ 'z', 'b', 'e', 'r', 'g', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "zbrane-doplnky.cz", true */ 'z', 'b', 'r', 'a', 'n', 'e', '-', 'd', 'o', 'p', 'l', 'n', 'k', 'y', '.', 'c', 'z', '\0',
   /* "zbyga.cz", true */ 'z', 'b', 'y', 'g', 'a', '.', 'c', 'z', '\0',
   /* "zcarot.com", false */ 'z', 'c', 'a', 'r', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "zcarrot.com", true */ 'z', 'c', 'a', 'r', 'r', 'o', 't', '.', 'c', 'o', 'm', '\0',
   /* "zcon.nl", true */ 'z', 'c', 'o', 'n', '.', 'n', 'l', '\0',
   /* "zcr.ca", true */ 'z', 'c', 'r', '.', 'c', 'a', '\0',
-  /* "zdbl.de", true */ 'z', 'd', 'b', 'l', '.', 'd', 'e', '\0',
   /* "zdrojak.cz", true */ 'z', 'd', 'r', 'o', 'j', 'a', 'k', '.', 'c', 'z', '\0',
   /* "ze3kr.com", true */ 'z', 'e', '3', 'k', 'r', '.', 'c', 'o', 'm', '\0',
   /* "zebry.nl", true */ 'z', 'e', 'b', 'r', 'y', '.', 'n', 'l', '\0',
   /* "zeedroom.be", true */ 'z', 'e', 'e', 'd', 'r', 'o', 'o', 'm', '.', 'b', 'e', '\0',
   /* "zefu.ca", true */ 'z', 'e', 'f', 'u', '.', 'c', 'a', '\0',
   /* "zehdenick-bleibt-bunt.de", true */ 'z', 'e', 'h', 'd', 'e', 'n', 'i', 'c', 'k', '-', 'b', 'l', 'e', 'i', 'b', 't', '-', 'b', 'u', 'n', 't', '.', 'd', 'e', '\0',
   /* "zehntner.ch", true */ 'z', 'e', 'h', 'n', 't', 'n', 'e', 'r', '.', 'c', 'h', '\0',
   /* "zeitzer-turngala.de", true */ 'z', 'e', 'i', 't', 'z', 'e', 'r', '-', 't', 'u', 'r', 'n', 'g', 'a', 'l', 'a', '.', 'd', 'e', '\0',
   /* "zelfrijdendeautos.com", true */ 'z', 'e', 'l', 'f', 'r', 'i', 'j', 'd', 'e', 'n', 'd', 'e', 'a', 'u', 't', 'o', 's', '.', 'c', 'o', 'm', '\0',
+  /* "zellari.ru", true */ 'z', 'e', 'l', 'l', 'a', 'r', 'i', '.', 'r', 'u', '\0',
   /* "zemlova.cz", true */ 'z', 'e', 'm', 'l', 'o', 'v', 'a', '.', 'c', 'z', '\0',
   /* "zen-trader.com", false */ 'z', 'e', 'n', '-', 't', 'r', 'a', 'd', 'e', 'r', '.', 'c', 'o', 'm', '\0',
   /* "zenithmedia.ca", true */ 'z', 'e', 'n', 'i', 't', 'h', 'm', 'e', 'd', 'i', 'a', '.', 'c', 'a', '\0',
   /* "zenk-security.com", true */ 'z', 'e', 'n', 'k', '-', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'c', 'o', 'm', '\0',
   /* "zenlogic.com", true */ 'z', 'e', 'n', 'l', 'o', 'g', 'i', 'c', '.', 'c', 'o', 'm', '\0',
   /* "zeno-system.com", true */ 'z', 'e', 'n', 'o', '-', 's', 'y', 's', 't', 'e', 'm', '.', 'c', 'o', 'm', '\0',
   /* "zenvideocloud.com", true */ 'z', 'e', 'n', 'v', 'i', 'd', 'e', 'o', 'c', 'l', 'o', 'u', 'd', '.', 'c', 'o', 'm', '\0',
   /* "zeplin.io", true */ 'z', 'e', 'p', 'l', 'i', 'n', '.', 'i', 'o', '\0',
@@ -13319,16 +13320,17 @@ static const char kSTSHostTable[] = {
   /* "zeroday.sk", true */ 'z', 'e', 'r', 'o', 'd', 'a', 'y', '.', 's', 'k', '\0',
   /* "zerolab.org", true */ 'z', 'e', 'r', 'o', 'l', 'a', 'b', '.', 'o', 'r', 'g', '\0',
   /* "zeroling.com", true */ 'z', 'e', 'r', 'o', 'l', 'i', 'n', 'g', '.', 'c', 'o', 'm', '\0',
   /* "zeropush.com", true */ 'z', 'e', 'r', 'o', 'p', 'u', 's', 'h', '.', 'c', 'o', 'm', '\0',
   /* "zerossl.com", true */ 'z', 'e', 'r', 'o', 's', 's', 'l', '.', 'c', 'o', 'm', '\0',
   /* "zertif.info", true */ 'z', 'e', 'r', 't', 'i', 'f', '.', 'i', 'n', 'f', 'o', '\0',
   /* "zerudi.com", true */ 'z', 'e', 'r', 'u', 'd', 'i', '.', 'c', 'o', 'm', '\0',
   /* "zespia.tw", false */ 'z', 'e', 's', 'p', 'i', 'a', '.', 't', 'w', '\0',
+  /* "zeto365.pl", true */ 'z', 'e', 't', 'o', '3', '6', '5', '.', 'p', 'l', '\0',
   /* "zetorzeszow.pl", true */ 'z', 'e', 't', 'o', 'r', 'z', 'e', 's', 'z', 'o', 'w', '.', 'p', 'l', '\0',
   /* "zettaplan.ru", true */ 'z', 'e', 't', 't', 'a', 'p', 'l', 'a', 'n', '.', 'r', 'u', '\0',
   /* "zewtie.com", true */ 'z', 'e', 'w', 't', 'i', 'e', '.', 'c', 'o', 'm', '\0',
   /* "zeytin.pro", true */ 'z', 'e', 'y', 't', 'i', 'n', '.', 'p', 'r', 'o', '\0',
   /* "zgrep.org", true */ 'z', 'g', 'r', 'e', 'p', '.', 'o', 'r', 'g', '\0',
   /* "zhang-hao.com", true */ 'z', 'h', 'a', 'n', 'g', '-', 'h', 'a', 'o', '.', 'c', 'o', 'm', '\0',
   /* "zhanghao.me", true */ 'z', 'h', 'a', 'n', 'g', 'h', 'a', 'o', '.', 'm', 'e', '\0',
   /* "zhangruilin.com", true */ 'z', 'h', 'a', 'n', 'g', 'r', 'u', 'i', 'l', 'i', 'n', '.', 'c', 'o', 'm', '\0',
@@ -13470,6621 +13472,6621 @@ static const nsSTSPreload kSTSPreloadLis
   { 648, true },
   { 665, true },
   { 688, true },
   { 698, true },
   { 709, true },
   { 720, true },
   { 734, true },
   { 756, true },
-  { 765, true },
-  { 772, true },
-  { 783, true },
-  { 794, true },
-  { 801, true },
-  { 808, true },
-  { 819, true },
-  { 826, true },
-  { 843, true },
-  { 861, true },
-  { 875, true },
+  { 768, true },
+  { 777, true },
+  { 784, true },
+  { 795, true },
+  { 806, true },
+  { 813, true },
+  { 820, true },
+  { 831, true },
+  { 838, true },
+  { 855, true },
+  { 873, true },
   { 887, true },
-  { 898, true },
-  { 908, true },
-  { 917, true },
-  { 923, true },
-  { 938, true },
-  { 946, true },
-  { 955, true },
-  { 973, true },
+  { 899, true },
+  { 910, true },
+  { 920, true },
+  { 929, true },
+  { 935, true },
+  { 950, true },
+  { 958, true },
+  { 967, true },
   { 985, true },
-  { 1001, true },
-  { 1010, true },
-  { 1018, true },
-  { 1026, true },
-  { 1037, true },
+  { 997, true },
+  { 1013, true },
+  { 1022, true },
+  { 1030, true },
+  { 1038, true },
   { 1049, true },
-  { 1057, true },
-  { 1067, true },
-  { 1083, false },
-  { 1096, true },
-  { 1105, true },
-  { 1119, true },
-  { 1128, true },
-  { 1149, true },
-  { 1158, true },
-  { 1168, true },
-  { 1183, true },
-  { 1200, true },
-  { 1207, true },
-  { 1220, true },
-  { 1229, true },
+  { 1061, true },
+  { 1069, true },
+  { 1079, true },
+  { 1095, false },
+  { 1108, true },
+  { 1117, true },
+  { 1131, true },
+  { 1140, true },
+  { 1161, true },
+  { 1170, true },
+  { 1180, true },
+  { 1195, true },
+  { 1212, true },
+  { 1219, true },
+  { 1232, true },
   { 1241, true },
-  { 1249, true },
-  { 1260, true },
-  { 1269, true },
-  { 1278, false },
-  { 1294, true },
-  { 1307, true },
-  { 1316, true },
-  { 1335, true },
-  { 1354, true },
+  { 1253, true },
+  { 1261, true },
+  { 1272, true },
+  { 1281, true },
+  { 1290, false },
+  { 1306, true },
+  { 1319, true },
+  { 1328, true },
+  { 1347, true },
   { 1366, true },
-  { 1379, true },
-  { 1395, true },
-  { 1410, true },
-  { 1423, true },
-  { 1433, true },
-  { 1447, true },
-  { 1463, true },
-  { 1477, true },
-  { 1492, true },
-  { 1500, true },
-  { 1507, true },
-  { 1514, true },
+  { 1378, true },
+  { 1391, true },
+  { 1407, true },
+  { 1422, true },
+  { 1435, true },
+  { 1445, true },
+  { 1459, true },
+  { 1475, true },
+  { 1489, true },
+  { 1504, true },
+  { 1512, true },
+  { 1519, true },
   { 1526, true },
-  { 1537, true },
-  { 1546, true },
-  { 1557, false },
-  { 1568, true },
-  { 1583, true },
-  { 1591, true },
-  { 1600, false },
-  { 1613, true },
-  { 1621, true },
+  { 1538, true },
+  { 1549, true },
+  { 1558, true },
+  { 1569, false },
+  { 1580, true },
+  { 1595, true },
+  { 1603, true },
+  { 1612, false },
+  { 1625, true },
   { 1633, true },
-  { 1648, true },
-  { 1667, true },
-  { 1674, false },
-  { 1693, true },
-  { 1703, true },
-  { 1709, true },
-  { 1718, true },
-  { 1731, false },
-  { 1738, true },
+  { 1645, true },
+  { 1660, true },
+  { 1679, true },
+  { 1686, false },
+  { 1705, true },
+  { 1715, true },
+  { 1721, true },
+  { 1730, true },
+  { 1743, false },
   { 1750, true },
-  { 1759, true },
-  { 1772, true },
-  { 1782, true },
-  { 1790, false },
-  { 1797, true },
-  { 1808, true },
+  { 1762, true },
+  { 1771, true },
+  { 1784, true },
+  { 1794, true },
+  { 1802, false },
+  { 1809, true },
   { 1820, true },
-  { 1828, true },
-  { 1841, true },
-  { 1848, true },
-  { 1857, true },
+  { 1832, true },
+  { 1840, true },
+  { 1853, true },
+  { 1860, true },
   { 1869, true },
-  { 1878, true },
-  { 1899, true },
-  { 1923, true },
-  { 1934, true },
-  { 1940, true },
-  { 1953, true },
+  { 1881, true },
+  { 1890, true },
+  { 1911, true },
+  { 1935, true },
+  { 1946, true },
+  { 1952, true },
   { 1965, true },
   { 1977, true },
-  { 1987, true },
-  { 2004, true },
-  { 2011, true },
-  { 2020, true },
-  { 2041, false },
-  { 2054, true },
-  { 2061, true },
-  { 2071, true },
-  { 2082, true },
-  { 2091, true },
-  { 2101, true },
-  { 2112, true },
-  { 2120, true },
+  { 1989, true },
+  { 1999, true },
+  { 2016, true },
+  { 2023, true },
+  { 2032, true },
+  { 2053, false },
+  { 2066, true },
+  { 2073, true },
+  { 2083, true },
+  { 2094, true },
+  { 2103, true },
+  { 2113, true },
+  { 2124, true },
   { 2132, true },
-  { 2142, true },
-  { 2161, true },
-  { 2172, true },
+  { 2144, true },
+  { 2154, true },
+  { 2173, true },
   { 2184, true },
   { 2196, true },
   { 2208, true },
-  { 2219, true },
-  { 2228, true },
-  { 2241, true },
-  { 2252, true },
-  { 2267, true },
-  { 2282, true },
-  { 2290, true },
-  { 2300, true },
-  { 2317, true },
-  { 2332, true },
-  { 2339, true },
-  { 2354, true },
-  { 2373, true },
-  { 2383, true },
-  { 2394, true },
-  { 2412, true },
-  { 2426, true },
+  { 2220, true },
+  { 2231, true },
+  { 2240, true },
+  { 2253, true },
+  { 2264, true },
+  { 2279, true },
+  { 2294, true },
+  { 2302, true },
+  { 2312, true },
+  { 2329, true },
+  { 2344, true },
+  { 2351, true },
+  { 2366, true },
+  { 2385, true },
+  { 2395, true },
+  { 2406, true },
+  { 2424, true },
   { 2438, true },
-  { 2454, true },
-  { 2465, false },
-  { 2481, false },
-  { 2493, true },
-  { 2506, true },
-  { 2519, false },
-  { 2527, true },
-  { 2536, true },
-  { 2560, true },
-  { 2575, true },
-  { 2594, true },
-  { 2607, true },
+  { 2450, true },
+  { 2466, true },
+  { 2477, false },
+  { 2493, false },
+  { 2505, true },
+  { 2518, true },
+  { 2531, false },
+  { 2539, true },
+  { 2548, true },
+  { 2572, true },
+  { 2587, true },
+  { 2606, true },
   { 2619, true },
-  { 2630, true },
-  { 2654, true },
-  { 2667, true },
-  { 2676, true },
-  { 2693, true },
+  { 2631, true },
+  { 2642, true },
+  { 2666, true },
+  { 2679, true },
+  { 2688, true },
   { 2705, true },
-  { 2724, true },
-  { 2747, true },
-  { 2763, true },
-  { 2780, true },
-  { 2800, true },
-  { 2815, true },
-  { 2836, true },
-  { 2856, true },
+  { 2717, true },
+  { 2736, true },
+  { 2759, true },
+  { 2775, true },
+  { 2792, true },
+  { 2812, true },
+  { 2827, true },
+  { 2848, true },
   { 2868, true },
-  { 2879, true },
-  { 2886, true },
+  { 2880, true },
+  { 2891, true },
   { 2898, true },
-  { 2919, true },
+  { 2910, true },
   { 2931, true },
-  { 2948, true },
-  { 2961, true },
-  { 2977, true },
+  { 2943, true },
+  { 2960, true },
+  { 2973, true },
   { 2989, true },
-  { 3002, true },
-  { 3017, false },
-  { 3026, true },
-  { 3041, true },
-  { 3058, true },
-  { 3072, true },
-  { 3088, true },
-  { 3099, true },
+  { 3001, true },
+  { 3014, true },
+  { 3029, false },
+  { 3038, true },
+  { 3053, true },
+  { 3070, true },
+  { 3084, true },
+  { 3100, true },
   { 3111, true },
-  { 3132, true },
-  { 3149, false },
-  { 3159, true },
-  { 3174, true },
-  { 3188, false },
-  { 3201, true },
-  { 3210, true },
-  { 3224, true },
+  { 3123, true },
+  { 3144, true },
+  { 3161, false },
+  { 3171, true },
+  { 3186, true },
+  { 3200, false },
+  { 3213, true },
+  { 3222, true },
   { 3236, true },
-  { 3251, true },
-  { 3264, true },
+  { 3248, true },
+  { 3263, true },
   { 3276, true },
   { 3288, true },
   { 3300, true },
   { 3312, true },
   { 3324, true },
-  { 3335, true },
-  { 3352, true },
-  { 3366, true },
-  { 3382, true },
-  { 3395, true },
-  { 3412, true },
-  { 3428, true },
-  { 3443, true },
-  { 3458, true },
-  { 3476, true },
-  { 3485, true },
-  { 3498, true },
-  { 3519, true },
-  { 3528, true },
-  { 3538, true },
-  { 3563, true },
-  { 3574, true },
-  { 3593, true },
+  { 3336, true },
+  { 3347, true },
+  { 3364, true },
+  { 3378, true },
+  { 3394, true },
+  { 3407, true },
+  { 3424, true },
+  { 3440, true },
+  { 3455, true },
+  { 3470, true },
+  { 3488, true },
+  { 3497, true },
+  { 3510, true },
+  { 3531, true },
+  { 3540, true },
+  { 3550, true },
+  { 3575, true },
+  { 3586, true },
   { 3605, true },
-  { 3624, true },
-  { 3643, true },
-  { 3662, true },
-  { 3681, true },
-  { 3696, true },
-  { 3707, true },
-  { 3720, true },
+  { 3617, true },
+  { 3636, true },
+  { 3655, true },
+  { 3674, true },
+  { 3693, true },
+  { 3708, true },
+  { 3719, true },
   { 3732, true },
-  { 3745, true },
-  { 3759, true },
-  { 3772, true },
-  { 3782, true },
-  { 3793, true },
-  { 3802, true },
-  { 3816, true },
+  { 3744, true },
+  { 3757, true },
+  { 3771, true },
+  { 3784, true },
+  { 3794, true },
+  { 3805, true },
+  { 3814, true },
   { 3828, true },
-  { 3855, true },
-  { 3881, true },
-  { 3892, true },
-  { 3905, true },
-  { 3916, true },
-  { 3940, true },
-  { 3957, true },
-  { 3985, true },
-  { 4001, true },
-  { 4010, true },
-  { 4020, true },
-  { 4034, true },
-  { 4044, true },
-  { 4058, false },
-  { 4079, true },
-  { 4097, true },
-  { 4105, true },
-  { 4114, true },
-  { 4133, true },
-  { 4152, true },
-  { 4165, true },
-  { 4176, true },
-  { 4196, true },
-  { 4214, false },
-  { 4233, true },
-  { 4247, true },
-  { 4257, true },
-  { 4278, true },
-  { 4294, true },
-  { 4304, true },
-  { 4317, true },
-  { 4330, true },
-  { 4344, true },
-  { 4358, true },
-  { 4368, true },
-  { 4378, true },
-  { 4388, true },
-  { 4398, true },
-  { 4408, true },
-  { 4418, true },
-  { 4435, false },
-  { 4443, true },
-  { 4454, true },
-  { 4473, true },
-  { 4484, true },
-  { 4495, true },
-  { 4504, true },
-  { 4524, true },
-  { 4535, true },
-  { 4552, true },
-  { 4576, true },
-  { 4590, true },
-  { 4606, true },
+  { 3840, true },
+  { 3867, true },
+  { 3893, true },
+  { 3904, true },
+  { 3917, true },
+  { 3928, true },
+  { 3952, true },
+  { 3969, true },
+  { 3997, true },
+  { 4013, true },
+  { 4022, true },
+  { 4032, true },
+  { 4046, true },
+  { 4056, true },
+  { 4070, false },
+  { 4091, true },
+  { 4109, true },
+  { 4117, true },
+  { 4126, true },
+  { 4145, true },
+  { 4164, true },
+  { 4177, true },
+  { 4188, true },
+  { 4208, true },
+  { 4226, false },
+  { 4245, true },
+  { 4259, true },
+  { 4269, true },
+  { 4290, true },
+  { 4306, true },
+  { 4316, true },
+  { 4329, true },
+  { 4342, true },
+  { 4356, true },
+  { 4370, true },
+  { 4380, true },
+  { 4390, true },
+  { 4400, true },
+  { 4410, true },
+  { 4420, true },
+  { 4430, true },
+  { 4447, false },
+  { 4455, true },
+  { 4466, true },
+  { 4485, true },
+  { 4496, true },
+  { 4507, true },
+  { 4516, true },
+  { 4536, true },
+  { 4547, true },
+  { 4564, true },
+  { 4588, true },
+  { 4602, true },
   { 4618, true },
-  { 4634, true },
-  { 4645, true },
-  { 4659, true },
-  { 4675, true },
-  { 4690, true },
-  { 4698, true },
-  { 4715, true },
-  { 4739, true },
-  { 4756, true },
-  { 4764, true },
-  { 4780, true },
-  { 4788, true },
-  { 4802, true },
+  { 4630, true },
+  { 4646, true },
+  { 4657, true },
+  { 4671, true },
+  { 4687, true },
+  { 4702, true },
+  { 4710, true },
+  { 4727, true },
+  { 4751, true },
+  { 4768, true },
+  { 4776, true },
+  { 4792, true },
+  { 4800, true },
   { 4814, true },
   { 4826, true },
   { 4838, true },
   { 4850, true },
-  { 4860, true },
-  { 4868, true },
-  { 4882, true },
-  { 4895, true },
+  { 4862, true },
+  { 4872, true },
+  { 4880, true },
+  { 4894, true },
   { 4907, true },
-  { 4926, true },
-  { 4945, true },
-  { 4978, true },
-  { 4988, true },
-  { 4995, true },
-  { 5012, true },
-  { 5027, true },
-  { 5036, true },
-  { 5043, true },
-  { 5057, true },
-  { 5065, true },
-  { 5076, true },
-  { 5091, true },
-  { 5106, true },
-  { 5116, true },
-  { 5127, true },
-  { 5142, true },
-  { 5154, true },
-  { 5165, true },
-  { 5185, true },
-  { 5196, true },
-  { 5209, true },
-  { 5220, true },
-  { 5231, true },
-  { 5244, true },
-  { 5262, true },
-  { 5274, true },
-  { 5283, true },
-  { 5297, true },
-  { 5308, true },
-  { 5325, true },
-  { 5336, true },
-  { 5344, true },
-  { 5353, true },
-  { 5379, true },
-  { 5390, true },
-  { 5400, false },
-  { 5417, true },
-  { 5427, true },
-  { 5441, true },
-  { 5454, true },
-  { 5466, true },
-  { 5475, true },
-  { 5492, true },
-  { 5516, true },
-  { 5532, true },
-  { 5552, true },
-  { 5577, true },
-  { 5602, true },
-  { 5627, true },
-  { 5639, true },
-  { 5651, true },
-  { 5660, true },
-  { 5671, true },
-  { 5698, true },
-  { 5711, true },
-  { 5727, true },
-  { 5743, true },
-  { 5755, true },
-  { 5769, true },
-  { 5789, true },
-  { 5804, true },
-  { 5816, true },
-  { 5826, true },
-  { 5838, true },
-  { 5850, true },
-  { 5862, true },
-  { 5881, true },
-  { 5894, true },
-  { 5905, true },
-  { 5914, true },
-  { 5925, true },
-  { 5939, true },
-  { 5955, true },
-  { 5975, true },
-  { 5996, true },
-  { 6009, true },
-  { 6023, true },
-  { 6036, true },
+  { 4919, true },
+  { 4938, true },
+  { 4957, true },
+  { 4990, true },
+  { 5000, true },
+  { 5007, true },
+  { 5024, true },
+  { 5039, true },
+  { 5048, true },
+  { 5055, true },
+  { 5069, true },
+  { 5077, true },
+  { 5088, true },
+  { 5103, true },
+  { 5118, true },
+  { 5129, true },
+  { 5144, true },
+  { 5156, true },
+  { 5167, true },
+  { 5187, true },
+  { 5198, true },
+  { 5211, true },
+  { 5222, true },
+  { 5233, true },
+  { 5246, true },
+  { 5264, true },
+  { 5276, true },
+  { 5285, true },
+  { 5299, true },
+  { 5310, true },
+  { 5327, true },
+  { 5338, true },
+  { 5346, true },
+  { 5355, true },
+  { 5381, true },
+  { 5392, true },
+  { 5402, false },
+  { 5419, true },
+  { 5429, true },
+  { 5443, true },
+  { 5456, true },
+  { 5468, true },
+  { 5477, true },
+  { 5494, true },
+  { 5518, true },
+  { 5534, true },
+  { 5554, true },
+  { 5579, true },
+  { 5604, true },
+  { 5629, true },
+  { 5641, true },
+  { 5653, true },
+  { 5662, true },
+  { 5673, true },
+  { 5700, true },
+  { 5713, true },
+  { 5729, true },
+  { 5745, true },
+  { 5757, true },
+  { 5771, true },
+  { 5791, true },
+  { 5806, false },
+  { 5827, true },
+  { 5839, true },
+  { 5849, true },
+  { 5861, true },
+  { 5873, true },
+  { 5885, true },
+  { 5904, true },
+  { 5917, true },
+  { 5928, true },
+  { 5937, true },
+  { 5948, true },
+  { 5962, true },
+  { 5978, true },
+  { 5998, true },
+  { 6019, true },
+  { 6032, true },
   { 6046, true },
-  { 6061, true },
-  { 6079, true },
-  { 6089, true },
-  { 6104, true },
-  { 6122, true },
-  { 6136, true },
-  { 6151, true },
-  { 6165, true },
-  { 6180, true },
-  { 6190, true },
-  { 6204, true },
-  { 6221, true },
-  { 6236, true },
-  { 6250, true },
-  { 6264, true },
-  { 6280, true },
-  { 6292, true },
-  { 6304, true },
-  { 6319, true },
-  { 6333, true },
-  { 6355, true },
-  { 6376, false },
-  { 6397, true },
-  { 6410, true },
-  { 6422, true },
-  { 6435, true },
-  { 6450, true },
-  { 6461, true },
-  { 6477, false },
+  { 6059, true },
+  { 6069, true },
+  { 6084, true },
+  { 6102, true },
+  { 6112, true },
+  { 6127, true },
+  { 6145, true },
+  { 6159, true },
+  { 6174, true },
+  { 6188, true },
+  { 6203, true },
+  { 6213, true },
+  { 6227, true },
+  { 6244, true },
+  { 6259, true },
+  { 6273, true },
+  { 6287, true },
+  { 6303, true },
+  { 6315, true },
+  { 6327, true },
+  { 6342, true },
+  { 6356, true },
+  { 6378, true },
+  { 6399, false },
+  { 6420, true },
+  { 6433, true },
+  { 6445, true },
+  { 6458, true },
+  { 6473, true },
   { 6484, true },
-  { 6495, true },
+  { 6500, false },
   { 6507, true },
-  { 6520, true },
-  { 6540, true },
-  { 6561, true },
-  { 6574, true },
-  { 6587, false },
-  { 6605, true },
-  { 6622, true },
-  { 6646, true },
-  { 6665, true },
-  { 6679, true },
-  { 6695, true },
-  { 6714, true },
-  { 6735, true },
-  { 6755, true },
-  { 6775, true },
-  { 6788, false },
-  { 6801, true },
-  { 6813, true },
-  { 6823, true },
+  { 6518, true },
+  { 6530, true },
+  { 6543, true },
+  { 6563, true },
+  { 6584, true },
+  { 6597, true },
+  { 6610, false },
+  { 6628, true },
+  { 6645, true },
+  { 6669, true },
+  { 6688, true },
+  { 6702, true },
+  { 6718, true },
+  { 6737, true },
+  { 6758, true },
+  { 6778, true },
+  { 6798, true },
+  { 6811, false },
+  { 6824, true },
   { 6836, true },
-  { 6850, true },
-  { 6866, true },
-  { 6880, true },
-  { 6896, true },
-  { 6908, true },
-  { 6922, true },
-  { 6935, true },
-  { 6949, true },
-  { 6957, true },
+  { 6846, true },
+  { 6859, true },
+  { 6873, true },
+  { 6889, true },
+  { 6903, true },
+  { 6919, true },
+  { 6931, true },
+  { 6945, true },
+  { 6958, true },
   { 6972, true },
-  { 6991, true },
-  { 7003, true },
-  { 7017, true },
-  { 7031, true },
-  { 7043, true },
+  { 6980, true },
+  { 6995, true },
+  { 7014, true },
+  { 7026, true },
+  { 7040, true },
   { 7054, true },
-  { 7065, true },
-  { 7079, true },
-  { 7087, true },
-  { 7098, true },
-  { 7106, true },
-  { 7114, true },
-  { 7122, true },
-  { 7130, true },
-  { 7143, true },
-  { 7150, true },
-  { 7160, true },
+  { 7066, true },
+  { 7077, true },
+  { 7088, true },
+  { 7102, true },
+  { 7110, true },
+  { 7121, true },
+  { 7129, true },
+  { 7137, true },
+  { 7145, true },
+  { 7153, true },
+  { 7166, true },
   { 7173, true },
-  { 7185, true },
-  { 7198, true },
-  { 7218, true },
-  { 7230, true },
+  { 7183, true },
+  { 7196, true },
+  { 7208, true },
+  { 7221, true },
   { 7241, true },
-  { 7259, true },
-  { 7272, true },
-  { 7281, true },
-  { 7293, true },
-  { 7307, true },
-  { 7320, true },
-  { 7329, true },
-  { 7345, true },
-  { 7373, true },
-  { 7393, true },
-  { 7412, true },
-  { 7427, true },
-  { 7447, true },
-  { 7459, true },
-  { 7471, true },
+  { 7253, true },
+  { 7264, true },
+  { 7282, true },
+  { 7295, true },
+  { 7304, true },
+  { 7316, true },
+  { 7330, true },
+  { 7343, true },
+  { 7352, true },
+  { 7368, true },
+  { 7396, true },
+  { 7416, true },
+  { 7435, true },
+  { 7450, true },
+  { 7470, true },
   { 7482, true },
-  { 7493, true },
-  { 7503, true },
-  { 7523, true },
-  { 7541, true },
-  { 7551, false },
-  { 7562, true },
-  { 7572, true },
-  { 7581, true },
-  { 7592, true },
-  { 7611, true },
-  { 7622, true },
-  { 7640, true },
-  { 7666, true },
-  { 7676, true },
-  { 7690, true },
-  { 7712, true },
-  { 7726, true },
-  { 7741, true },
-  { 7755, true },
-  { 7769, true },
-  { 7784, true },
-  { 7805, true },
-  { 7815, true },
-  { 7836, true },
-  { 7854, true },
-  { 7867, true },
-  { 7875, true },
-  { 7889, true },
-  { 7905, true },
+  { 7494, true },
+  { 7505, true },
+  { 7516, true },
+  { 7526, true },
+  { 7546, true },
+  { 7564, true },
+  { 7574, false },
+  { 7585, true },
+  { 7595, true },
+  { 7604, true },
+  { 7615, true },
+  { 7634, true },
+  { 7645, true },
+  { 7663, true },
+  { 7689, true },
+  { 7699, true },
+  { 7713, true },
+  { 7735, true },
+  { 7749, true },
+  { 7764, true },
+  { 7778, true },
+  { 7792, true },
+  { 7807, true },
+  { 7828, true },
+  { 7838, true },
+  { 7849, true },
+  { 7870, true },
+  { 7888, true },
+  { 7901, true },
+  { 7909, true },
   { 7923, true },
-  { 7945, true },
-  { 7960, true },
-  { 7977, true },
-  { 7993, true },
-  { 8009, true },
-  { 8026, true },
-  { 8045, true },
-  { 8059, true },
-  { 8074, true },
+  { 7939, true },
+  { 7957, true },
+  { 7979, true },
+  { 7994, true },
+  { 8011, true },
+  { 8027, true },
+  { 8043, true },
+  { 8060, true },
+  { 8079, true },
   { 8093, true },
-  { 8110, true },
+  { 8108, true },
   { 8127, true },
-  { 8145, true },
-  { 8160, true },
-  { 8174, true },
-  { 8191, true },
-  { 8209, true },
-  { 8224, true },
-  { 8236, true },
-  { 8251, true },
-  { 8264, true },
-  { 8284, true },
-  { 8295, true },
-  { 8306, true },
-  { 8317, true },
-  { 8328, true },
-  { 8339, true },
-  { 8350, true },
+  { 8144, true },
+  { 8161, true },
+  { 8179, true },
+  { 8194, true },
+  { 8208, true },
+  { 8225, true },
+  { 8243, true },
+  { 8258, true },
+  { 8270, true },
+  { 8285, true },
+  { 8298, true },
+  { 8318, true },
+  { 8329, true },
+  { 8340, true },
+  { 8351, true },
   { 8362, true },
-  { 8377, true },
-  { 8390, true },
-  { 8409, true },
-  { 8420, true },
-  { 8433, true },
-  { 8447, false },
-  { 8460, false },
-  { 8469, true },
-  { 8486, true },
-  { 8506, true },
-  { 8517, true },
-  { 8535, false },
-  { 8565, false },
-  { 8598, true },
-  { 8630, true },
-  { 8657, true },
-  { 8667, true },
-  { 8685, true },
-  { 8700, true },
-  { 8712, true },
-  { 8724, true },
-  { 8744, true },
-  { 8763, true },
-  { 8783, true },
-  { 8806, true },
-  { 8830, true },
-  { 8842, true },
-  { 8853, true },
-  { 8865, true },
-  { 8877, true },
-  { 8893, true },
-  { 8910, true },
-  { 8929, true },
-  { 8943, true },
-  { 8954, true },
-  { 8987, true },
-  { 8998, true },
-  { 9011, true },
-  { 9023, false },
-  { 9047, true },
-  { 9063, true },
-  { 9079, true },
-  { 9091, true },
-  { 9106, true },
-  { 9122, true },
-  { 9139, true },
-  { 9157, true },
+  { 8373, true },
+  { 8384, true },
+  { 8396, true },
+  { 8411, true },
+  { 8424, true },
+  { 8443, true },
+  { 8454, true },
+  { 8467, true },
+  { 8481, false },
+  { 8494, false },
+  { 8503, true },
+  { 8520, true },
+  { 8540, true },
+  { 8551, true },
+  { 8569, false },
+  { 8599, false },
+  { 8632, true },
+  { 8664, true },
+  { 8691, true },
+  { 8701, true },
+  { 8719, true },
+  { 8734, true },
+  { 8746, true },
+  { 8758, true },
+  { 8778, true },
+  { 8797, true },
+  { 8817, true },
+  { 8840, true },
+  { 8864, true },
+  { 8876, true },
+  { 8887, true },
+  { 8899, true },
+  { 8911, true },
+  { 8927, true },
+  { 8944, true },
+  { 8963, true },
+  { 8977, true },
+  { 8988, true },
+  { 9021, true },
+  { 9032, true },
+  { 9045, true },
+  { 9057, false },
+  { 9081, true },
+  { 9097, true },
+  { 9113, true },
+  { 9125, true },
+  { 9140, true },
+  { 9156, true },
   { 9173, true },
-  { 9183, true },
-  { 9200, true },
-  { 9213, true },
-  { 9226, true },
-  { 9242, true },
-  { 9253, true },
-  { 9265, true },
+  { 9191, true },
+  { 9207, true },
+  { 9217, true },
+  { 9234, true },
+  { 9247, true },
+  { 9260, true },
   { 9276, true },
-  { 9283, true },
-  { 9291, true },
-  { 9302, true },
-  { 9315, true },
-  { 9323, true },
-  { 9333, true },
-  { 9347, false },
-  { 9361, true },
-  { 9377, true },
-  { 9407, true },
-  { 9430, true },
-  { 9443, true },
-  { 9462, true },
-  { 9475, false },
-  { 9494, true },
-  { 9510, false },
-  { 9525, false },
-  { 9538, true },
-  { 9554, true },
-  { 9565, true },
-  { 9577, true },
-  { 9596, true },
-  { 9615, true },
+  { 9287, true },
+  { 9299, true },
+  { 9310, true },
+  { 9317, true },
+  { 9325, true },
+  { 9336, true },
+  { 9349, false },
+  { 9357, true },
+  { 9367, true },
+  { 9381, false },
+  { 9395, true },
+  { 9411, true },
+  { 9441, true },
+  { 9464, true },
+  { 9477, true },
+  { 9496, true },
+  { 9509, false },
+  { 9528, true },
+  { 9544, false },
+  { 9559, false },
+  { 9572, true },
+  { 9588, true },
+  { 9599, true },
+  { 9611, true },
   { 9630, true },
-  { 9651, false },
-  { 9666, true },
-  { 9679, true },
-  { 9689, true },
+  { 9649, true },
+  { 9664, true },
+  { 9685, false },
   { 9700, true },
-  { 9711, true },
-  { 9725, true },
-  { 9741, true },
-  { 9758, false },
+  { 9713, true },
+  { 9723, true },
+  { 9734, true },
+  { 9745, true },
+  { 9759, true },
   { 9775, true },
-  { 9788, true },
-  { 9814, true },
-  { 9827, true },
-  { 9841, true },
-  { 9860, true },
-  { 9881, true },
-  { 9893, true },
-  { 9907, true },
-  { 9931, true },
-  { 9944, true },
-  { 9957, true },
-  { 9968, true },
-  { 9977, true },
-  { 9990, true },
-  { 10003, true },
+  { 9792, false },
+  { 9809, true },
+  { 9822, true },
+  { 9848, true },
+  { 9861, true },
+  { 9875, true },
+  { 9894, true },
+  { 9915, true },
+  { 9927, true },
+  { 9941, true },
+  { 9965, true },
+  { 9978, true },
+  { 9991, true },
+  { 10005, true },
+  { 10016, true },
   { 10025, true },
-  { 10037, false },
-  { 10055, true },
-  { 10078, true },
-  { 10105, true },
-  { 10117, true },
-  { 10130, true },
-  { 10150, true },
-  { 10161, true },
-  { 10173, true },
-  { 10187, true },
-  { 10195, true },
-  { 10212, true },
-  { 10224, true },
-  { 10242, true },
-  { 10265, false },
-  { 10281, true },
-  { 10287, true },
-  { 10299, true },
-  { 10310, false },
-  { 10327, true },
-  { 10346, true },
-  { 10358, true },
-  { 10387, true },
-  { 10403, true },
-  { 10416, true },
-  { 10432, true },
-  { 10446, true },
-  { 10462, true },
-  { 10475, true },
-  { 10486, true },
-  { 10498, true },
-  { 10514, true },
-  { 10528, true },
-  { 10544, true },
-  { 10558, true },
-  { 10566, true },
-  { 10580, true },
-  { 10600, true },
-  { 10612, true },
-  { 10628, true },
-  { 10642, false },
-  { 10655, true },
-  { 10670, true },
-  { 10684, true },
-  { 10693, true },
-  { 10705, true },
-  { 10723, true },
-  { 10738, true },
-  { 10748, true },
-  { 10762, true },
-  { 10788, true },
-  { 10798, true },
-  { 10812, true },
-  { 10826, true },
-  { 10844, true },
-  { 10862, true },
-  { 10878, true },
-  { 10888, true },
-  { 10899, true },
-  { 10915, true },
-  { 10923, true },
-  { 10931, true },
-  { 10942, true },
-  { 10952, true },
-  { 10967, true },
-  { 10986, true },
-  { 10999, true },
-  { 11014, true },
-  { 11029, true },
-  { 11049, true },
-  { 11060, true },
-  { 11073, true },
-  { 11093, false },
-  { 11107, true },
-  { 11120, true },
-  { 11138, true },
-  { 11152, true },
-  { 11165, true },
-  { 11179, true },
-  { 11193, true },
+  { 10038, true },
+  { 10051, true },
+  { 10073, true },
+  { 10085, false },
+  { 10103, true },
+  { 10126, true },
+  { 10153, true },
+  { 10172, true },
+  { 10184, true },
+  { 10197, true },
+  { 10217, true },
+  { 10228, true },
+  { 10240, true },
+  { 10254, true },
+  { 10262, true },
+  { 10279, true },
+  { 10291, true },
+  { 10309, true },
+  { 10332, false },
+  { 10348, true },
+  { 10354, true },
+  { 10366, true },
+  { 10377, false },
+  { 10394, true },
+  { 10413, true },
+  { 10425, true },
+  { 10454, true },
+  { 10470, true },
+  { 10483, true },
+  { 10499, true },
+  { 10513, true },
+  { 10529, true },
+  { 10542, true },
+  { 10553, true },
+  { 10565, true },
+  { 10581, true },
+  { 10595, true },
+  { 10611, true },
+  { 10625, true },
+  { 10633, true },
+  { 10647, true },
+  { 10667, true },
+  { 10679, true },
+  { 10695, true },
+  { 10709, false },
+  { 10722, true },
+  { 10737, true },
+  { 10751, true },
+  { 10760, true },
+  { 10772, true },
+  { 10790, true },
+  { 10805, true },
+  { 10815, true },
+  { 10829, true },
+  { 10855, true },
+  { 10865, true },
+  { 10879, true },
+  { 10893, true },
+  { 10911, true },
+  { 10929, true },
+  { 10945, true },
+  { 10955, true },
+  { 10966, true },
+  { 10982, true },
+  { 10990, true },
+  { 10998, true },
+  { 11009, true },
+  { 11019, true },
+  { 11034, true },
+  { 11053, true },
+  { 11066, true },
+  { 11081, true },
+  { 11096, true },
+  { 11116, true },
+  { 11127, true },
+  { 11140, true },
+  { 11160, false },
+  { 11174, true },
+  { 11187, true },
   { 11205, true },
-  { 11216, true },
-  { 11227, true },
-  { 11240, true },
-  { 11255, true },
-  { 11266, true },
-  { 11277, true },
-  { 11292, true },
-  { 11303, true },
-  { 11313, true },
-  { 11334, true },
-  { 11345, true },
-  { 11354, true },
-  { 11361, true },
-  { 11375, false },
-  { 11388, true },
-  { 11398, true },
-  { 11404, true },
-  { 11417, true },
-  { 11430, true },
-  { 11441, true },
-  { 11453, true },
-  { 11467, true },
-  { 11477, true },
-  { 11495, true },
-  { 11505, true },
-  { 11517, true },
-  { 11531, true },
-  { 11541, true },
-  { 11557, true },
-  { 11568, true },
-  { 11585, true },
-  { 11604, true },
-  { 11618, true },
-  { 11640, true },
-  { 11666, true },
-  { 11676, true },
-  { 11694, true },
-  { 11704, true },
-  { 11714, true },
-  { 11724, true },
+  { 11219, true },
+  { 11232, true },
+  { 11246, true },
+  { 11260, true },
+  { 11272, true },
+  { 11283, true },
+  { 11294, true },
+  { 11307, true },
+  { 11322, true },
+  { 11333, true },
+  { 11344, true },
+  { 11359, true },
+  { 11370, true },
+  { 11380, true },
+  { 11401, true },
+  { 11412, true },
+  { 11421, true },
+  { 11428, true },
+  { 11442, false },
+  { 11455, true },
+  { 11465, true },
+  { 11471, true },
+  { 11484, true },
+  { 11497, true },
+  { 11508, true },
+  { 11520, true },
+  { 11534, true },
+  { 11544, true },
+  { 11562, true },
+  { 11572, true },
+  { 11584, true },
+  { 11598, true },
+  { 11608, true },
+  { 11624, true },
+  { 11635, true },
+  { 11652, true },
+  { 11671, true },
+  { 11685, true },
+  { 11707, true },
+  { 11733, true },
   { 11743, true },
-  { 11763, true },
-  { 11777, true },
-  { 11784, true },
-  { 11794, true },
-  { 11803, true },
-  { 11821, true },
-  { 11843, true },
-  { 11856, true },
-  { 11872, true },
-  { 11880, true },
-  { 11892, false },
-  { 11912, true },
-  { 11922, true },
-  { 11936, true },
-  { 11943, true },
-  { 11959, true },
-  { 11975, true },
-  { 11990, true },
-  { 12000, true },
-  { 12018, true },
-  { 12045, true },
-  { 12062, true },
-  { 12080, true },
-  { 12088, true },
-  { 12102, true },
-  { 12113, true },
-  { 12122, true },
-  { 12137, true },
-  { 12164, true },
-  { 12174, true },
-  { 12190, true },
-  { 12202, true },
-  { 12217, true },
-  { 12229, true },
-  { 12244, true },
-  { 12259, true },
-  { 12271, true },
-  { 12292, true },
-  { 12309, true },
-  { 12323, true },
-  { 12335, true },
-  { 12345, true },
-  { 12355, true },
-  { 12370, true },
-  { 12385, true },
-  { 12397, true },
-  { 12405, true },
-  { 12418, true },
-  { 12436, true },
-  { 12457, true },
-  { 12471, true },
-  { 12487, true },
-  { 12497, true },
-  { 12509, true },
-  { 12522, true },
-  { 12541, true },
-  { 12567, true },
-  { 12579, true },
-  { 12591, true },
-  { 12617, true },
-  { 12630, true },
-  { 12641, true },
-  { 12652, true },
-  { 12670, true },
-  { 12700, true },
-  { 12723, true },
-  { 12736, false },
-  { 12744, true },
-  { 12756, true },
-  { 12772, true },
-  { 12787, true },
-  { 12805, true },
-  { 12815, true },
-  { 12831, true },
-  { 12860, true },
-  { 12876, true },
-  { 12892, true },
-  { 12903, true },
-  { 12915, true },
-  { 12938, true },
-  { 12956, true },
-  { 12974, true },
-  { 12995, true },
-  { 13020, true },
-  { 13034, true },
-  { 13047, true },
-  { 13060, true },
-  { 13071, true },
-  { 13097, true },
-  { 13113, true },
-  { 13123, true },
-  { 13135, true },
-  { 13152, true },
+  { 11761, true },
+  { 11771, true },
+  { 11781, true },
+  { 11791, true },
+  { 11810, true },
+  { 11830, true },
+  { 11844, true },
+  { 11851, true },
+  { 11861, true },
+  { 11870, true },
+  { 11888, true },
+  { 11910, true },
+  { 11923, true },
+  { 11939, true },
+  { 11947, true },
+  { 11959, false },
+  { 11979, true },
+  { 11989, true },
+  { 12003, true },
+  { 12010, true },
+  { 12026, true },
+  { 12042, true },
+  { 12057, true },
+  { 12067, true },
+  { 12085, true },
+  { 12112, true },
+  { 12129, true },
+  { 12147, true },
+  { 12155, true },
+  { 12169, true },
+  { 12180, true },
+  { 12189, true },
+  { 12204, true },
+  { 12231, true },
+  { 12241, true },
+  { 12257, true },
+  { 12269, true },
+  { 12284, true },
+  { 12296, true },
+  { 12311, true },
+  { 12326, true },
+  { 12338, true },
+  { 12359, true },
+  { 12376, true },
+  { 12390, true },
+  { 12402, true },
+  { 12412, true },
+  { 12422, true },
+  { 12437, true },
+  { 12452, true },
+  { 12464, true },
+  { 12472, true },
+  { 12485, true },
+  { 12503, true },
+  { 12524, true },
+  { 12538, true },
+  { 12554, true },
+  { 12564, true },
+  { 12576, true },
+  { 12589, true },
+  { 12608, true },
+  { 12634, true },
+  { 12646, true },
+  { 12658, true },
+  { 12684, true },
+  { 12697, true },
+  { 12708, true },
+  { 12719, true },
+  { 12737, true },
+  { 12767, true },
+  { 12790, true },
+  { 12803, false },
+  { 12811, true },
+  { 12823, true },
+  { 12839, true },
+  { 12854, true },
+  { 12872, true },
+  { 12882, true },
+  { 12898, true },
+  { 12927, true },
+  { 12943, true },
+  { 12959, true },
+  { 12970, true },
+  { 12982, true },
+  { 13005, true },
+  { 13023, true },
+  { 13041, true },
+  { 13062, true },
+  { 13087, true },
+  { 13101, true },
+  { 13114, true },
+  { 13127, true },
+  { 13138, true },
   { 13164, true },
-  { 13177, true },
-  { 13185, true },
-  { 13196, true },
-  { 13207, true },
-  { 13225, true },
-  { 13240, true },
-  { 13258, true },
-  { 13267, true },
-  { 13278, true },
+  { 13180, true },
+  { 13190, true },
+  { 13202, true },
+  { 13219, true },
+  { 13231, true },
+  { 13244, true },
+  { 13252, true },
+  { 13263, true },
+  { 13274, true },
   { 13292, true },
-  { 13303, true },
-  { 13311, true },
-  { 13321, true },